2011-06-30 17:37:13 +02:00
|
|
|
/*
|
2015-08-01 14:56:18 +02:00
|
|
|
Copyright (c) 2005, 2015, Oracle and/or its affiliates.
|
2017-04-11 16:18:04 +02:00
|
|
|
Copyright (c) 2010, 2017, MariaDB
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
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
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
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
|
2011-06-30 17:37:13 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2005-11-30 01:02:21 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
MySQL Slap
|
|
|
|
|
|
|
|
A simple program designed to work as if multiple clients querying the database,
|
|
|
|
then reporting the timing of each stage.
|
|
|
|
|
|
|
|
MySQL slap runs three stages:
|
2006-01-02 05:08:45 +01:00
|
|
|
1) Create schema,table, and optionally any SP or data you want to beign
|
|
|
|
the test with. (single client)
|
2006-01-02 01:40:02 +01:00
|
|
|
2) Load test (many clients)
|
|
|
|
3) Cleanup (disconnection, drop table if specified, single client)
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
Examples:
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2006-01-02 05:08:45 +01:00
|
|
|
Supply your own create and query SQL statements, with 50 clients
|
|
|
|
querying (200 selects for each):
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-05-24 11:27:59 +02:00
|
|
|
mysqlslap --delimiter=";" \
|
|
|
|
--create="CREATE TABLE A (a int);INSERT INTO A VALUES (23)" \
|
2006-01-02 01:40:02 +01:00
|
|
|
--query="SELECT * FROM A" --concurrency=50 --iterations=200
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
Let the program build the query SQL statement with a table of two int
|
|
|
|
columns, three varchar columns, five clients querying (20 times each),
|
|
|
|
don't create the table or insert the data (using the previous test's
|
|
|
|
schema and data):
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
mysqlslap --concurrency=5 --iterations=20 \
|
|
|
|
--number-int-cols=2 --number-char-cols=3 \
|
2006-01-02 01:40:02 +01:00
|
|
|
--auto-generate-sql
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
Tell the program to load the create, insert and query SQL statements from
|
|
|
|
the specified files, where the create.sql file has multiple table creation
|
2006-01-02 05:08:45 +01:00
|
|
|
statements delimited by ';' and multiple insert statements delimited by ';'.
|
|
|
|
The --query file will have multiple queries delimited by ';', run all the
|
|
|
|
load statements, and then run all the queries in the query file
|
2005-12-03 07:07:11 +01:00
|
|
|
with five clients (five times each):
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2006-02-14 04:09:10 +01:00
|
|
|
mysqlslap --concurrency=5 \
|
2005-12-03 07:07:11 +01:00
|
|
|
--iterations=5 --query=query.sql --create=create.sql \
|
2006-01-02 01:40:02 +01:00
|
|
|
--delimiter=";"
|
2005-12-25 00:41:40 +01:00
|
|
|
|
|
|
|
TODO:
|
|
|
|
Add language for better tests
|
|
|
|
String length for files and those put on the command line are not
|
2005-12-29 03:41:06 +01:00
|
|
|
setup to handle binary data.
|
2006-01-02 05:08:45 +01:00
|
|
|
More stats
|
|
|
|
Break up tests and run them on multiple hosts at once.
|
|
|
|
Allow output to be fed into a database directly.
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
*/
|
|
|
|
|
fixes for test failures
and small collateral changes
mysql-test/lib/My/Test.pm:
somehow with "print" we get truncated writes sometimes
mysql-test/suite/perfschema/r/digest_table_full.result:
md5 hashes of statement digests differ, because yacc token codes are different in mariadb
mysql-test/suite/perfschema/r/dml_handler.result:
host table is not ported over yet
mysql-test/suite/perfschema/r/information_schema.result:
host table is not ported over yet
mysql-test/suite/perfschema/r/nesting.result:
this differs, because we don't rewrite general log queries, and multi-statement
packets are logged as a one entry. this result file is identical to what mysql-5.6.5
produces with the --log-raw option.
mysql-test/suite/perfschema/r/relaylog.result:
MariaDB modifies the binlog index file directly, while MySQL 5.6 has a feature "crash-safe binlog index" and modifies a special "crash-safe" shadow copy of the index file and then moves it over. That's why this test shows "NONE" index file writes in MySQL and "MANY" in MariaDB.
mysql-test/suite/perfschema/r/server_init.result:
MariaDB initializes the "manager" resources from the "manager" thread, and starts this thread only when --flush-time is not 0. MySQL 5.6 initializes "manager" resources unconditionally on server startup.
mysql-test/suite/perfschema/r/stage_mdl_global.result:
this differs, because MariaDB disables query cache when query_cache_size=0. MySQL does not
do that, and this causes useless mutex locks and waits.
mysql-test/suite/perfschema/r/statement_digest.result:
md5 hashes of statement digests differ, because yacc token codes are different in mariadb
mysql-test/suite/perfschema/r/statement_digest_consumers.result:
md5 hashes of statement digests differ, because yacc token codes are different in mariadb
mysql-test/suite/perfschema/r/statement_digest_long_query.result:
md5 hashes of statement digests differ, because yacc token codes are different in mariadb
mysql-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result:
will be updated to match 5.6 when alfranio.correia@oracle.com-20110512172919-c1b5kmum4h52g0ni and anders.song@greatopensource.com-20110105052107-zoab0bsf5a6xxk2y are merged
mysql-test/suite/rpl/r/rpl_non_direct_mixed_mixing_engines.result:
will be updated to match 5.6 when anders.song@greatopensource.com-20110105052107-zoab0bsf5a6xxk2y is merged
2012-09-27 20:09:46 +02:00
|
|
|
#define SLAP_VERSION "1.0"
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
#define HUGE_STRING_LENGTH 8196
|
2005-11-30 01:02:21 +01:00
|
|
|
#define RAND_STRING_SIZE 126
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
/* Types */
|
|
|
|
#define SELECT_TYPE 0
|
|
|
|
#define UPDATE_TYPE 1
|
|
|
|
#define INSERT_TYPE 2
|
2007-03-12 18:25:11 +01:00
|
|
|
#define UPDATE_TYPE_REQUIRES_PREFIX 3
|
2007-03-07 02:14:59 +01:00
|
|
|
#define CREATE_TABLE_TYPE 4
|
2007-03-12 18:25:11 +01:00
|
|
|
#define SELECT_TYPE_REQUIRES_PREFIX 5
|
2007-06-16 02:22:57 +02:00
|
|
|
#define DELETE_TYPE_REQUIRES_PREFIX 6
|
2007-03-07 02:14:59 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
#include "client_priv.h"
|
|
|
|
#include <mysqld_error.h>
|
|
|
|
#include <my_dir.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <sslopt-vars.h>
|
2006-01-16 17:35:01 +01:00
|
|
|
#ifndef __WIN__
|
2005-11-30 01:02:21 +01:00
|
|
|
#include <sys/wait.h>
|
2006-01-16 17:35:01 +01:00
|
|
|
#endif
|
2005-12-25 00:41:40 +01:00
|
|
|
#include <ctype.h>
|
2010-10-06 17:06:13 +02:00
|
|
|
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2006-01-16 17:35:01 +01:00
|
|
|
#ifdef __WIN__
|
|
|
|
#define srandom srand
|
|
|
|
#define random rand
|
|
|
|
#define snprintf _snprintf
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SMEM
|
|
|
|
static char *shared_memory_base_name=0;
|
|
|
|
#endif
|
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
/* Global Thread counter */
|
|
|
|
uint thread_counter;
|
|
|
|
pthread_mutex_t counter_mutex;
|
|
|
|
pthread_cond_t count_threshhold;
|
|
|
|
uint master_wakeup;
|
|
|
|
pthread_mutex_t sleeper_mutex;
|
|
|
|
pthread_cond_t sleep_threshhold;
|
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
static char **defaults_argv;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
char **primary_keys;
|
2007-03-07 02:14:59 +01:00
|
|
|
unsigned long long primary_keys_number_of;
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
static char *host= NULL, *opt_password= NULL, *user= NULL,
|
2006-01-02 01:40:02 +01:00
|
|
|
*user_supplied_query= NULL,
|
2007-03-26 11:24:49 +02:00
|
|
|
*user_supplied_pre_statements= NULL,
|
|
|
|
*user_supplied_post_statements= NULL,
|
2006-01-02 01:40:02 +01:00
|
|
|
*default_engine= NULL,
|
2007-06-16 02:22:57 +02:00
|
|
|
*pre_system= NULL,
|
|
|
|
*post_system= NULL,
|
2013-09-17 16:51:14 +02:00
|
|
|
*opt_mysql_unix_port= NULL,
|
|
|
|
*opt_init_command= NULL;
|
2011-01-16 04:59:05 +01:00
|
|
|
static char *opt_plugin_dir= 0, *opt_default_auth= 0;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2005-12-25 00:41:40 +01:00
|
|
|
const char *delimiter= "\n";
|
|
|
|
|
|
|
|
const char *create_schema_string= "mysqlslap";
|
|
|
|
|
2011-04-08 08:52:44 +02:00
|
|
|
static my_bool opt_preserve= TRUE, opt_no_drop= FALSE;
|
2007-12-20 21:23:35 +01:00
|
|
|
static my_bool debug_info_flag= 0, debug_check_flag= 0;
|
2005-12-25 00:41:40 +01:00
|
|
|
static my_bool opt_only_print= FALSE;
|
2005-12-03 07:07:11 +01:00
|
|
|
static my_bool opt_compress= FALSE, tty_password= FALSE,
|
2006-01-02 01:40:02 +01:00
|
|
|
opt_silent= FALSE,
|
2007-03-07 02:14:59 +01:00
|
|
|
auto_generate_sql_autoincrement= FALSE,
|
|
|
|
auto_generate_sql_guid_primary= FALSE,
|
2005-12-25 00:41:40 +01:00
|
|
|
auto_generate_sql= FALSE;
|
2007-01-29 22:17:30 +01:00
|
|
|
const char *auto_generate_sql_type= "mixed";
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-09-17 18:39:07 +02:00
|
|
|
static unsigned long connect_flags= CLIENT_MULTI_RESULTS |
|
2012-04-09 11:21:46 +02:00
|
|
|
CLIENT_MULTI_STATEMENTS |
|
|
|
|
CLIENT_REMEMBER_OPTIONS;
|
2006-07-20 14:51:04 +02:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
static int verbose, delimiter_length;
|
2007-06-16 02:22:57 +02:00
|
|
|
static uint commit_rate;
|
|
|
|
static uint detach_rate;
|
2007-03-16 07:39:07 +01:00
|
|
|
const char *num_int_cols_opt;
|
|
|
|
const char *num_char_cols_opt;
|
2007-08-01 21:59:05 +02:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
/* Yes, we do set defaults here */
|
|
|
|
static unsigned int num_int_cols= 1;
|
|
|
|
static unsigned int num_char_cols= 1;
|
|
|
|
static unsigned int num_int_cols_index= 0;
|
|
|
|
static unsigned int num_char_cols_index= 0;
|
2007-03-12 18:25:11 +01:00
|
|
|
static unsigned int iterations;
|
2007-08-01 21:59:05 +02:00
|
|
|
static uint my_end_arg= 0;
|
2005-11-30 01:02:21 +01:00
|
|
|
static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
|
2005-12-29 03:41:06 +01:00
|
|
|
static ulonglong actual_queries= 0;
|
2007-03-12 18:25:11 +01:00
|
|
|
static ulonglong auto_actual_queries;
|
|
|
|
static ulonglong auto_generate_sql_unique_write_number;
|
|
|
|
static ulonglong auto_generate_sql_unique_query_number;
|
2007-03-16 07:39:07 +01:00
|
|
|
static unsigned int auto_generate_sql_secondary_indexes;
|
2005-12-29 03:41:06 +01:00
|
|
|
static ulonglong num_of_query;
|
2007-01-29 22:17:30 +01:00
|
|
|
static ulonglong auto_generate_sql_number;
|
2005-12-25 11:03:53 +01:00
|
|
|
const char *concurrency_str= NULL;
|
2006-01-02 01:40:02 +01:00
|
|
|
static char *create_string;
|
2005-12-25 11:03:53 +01:00
|
|
|
uint *concurrency;
|
2015-11-29 16:51:23 +01:00
|
|
|
static char mysql_charsets_dir[FN_REFLEN+1];
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
const char *default_dbug_option="d:t:o,/tmp/mysqlslap.trace";
|
2006-01-02 01:40:02 +01:00
|
|
|
const char *opt_csv_str;
|
|
|
|
File csv_file;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
static uint opt_protocol= 0;
|
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
static int get_options(int *argc,char ***argv);
|
2005-11-30 01:02:21 +01:00
|
|
|
static uint opt_mysql_port= 0;
|
|
|
|
|
2011-03-18 16:03:43 +01:00
|
|
|
static const char *load_default_groups[]=
|
|
|
|
{ "mysqlslap", "client", "client-server", "client-mariadb", 0 };
|
2005-12-03 07:07:11 +01:00
|
|
|
|
2005-12-25 00:41:40 +01:00
|
|
|
typedef struct statement statement;
|
|
|
|
|
|
|
|
struct statement {
|
|
|
|
char *string;
|
|
|
|
size_t length;
|
2007-03-07 02:14:59 +01:00
|
|
|
unsigned char type;
|
2007-03-16 07:39:07 +01:00
|
|
|
char *option;
|
|
|
|
size_t option_length;
|
2005-12-25 00:41:40 +01:00
|
|
|
statement *next;
|
|
|
|
};
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
typedef struct option_string option_string;
|
|
|
|
|
|
|
|
struct option_string {
|
|
|
|
char *string;
|
|
|
|
size_t length;
|
|
|
|
char *option;
|
|
|
|
size_t option_length;
|
|
|
|
option_string *next;
|
|
|
|
};
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
typedef struct stats stats;
|
|
|
|
|
|
|
|
struct stats {
|
|
|
|
long int timing;
|
|
|
|
uint users;
|
|
|
|
unsigned long long rows;
|
|
|
|
};
|
|
|
|
|
2006-01-12 06:30:52 +01:00
|
|
|
typedef struct thread_context thread_context;
|
|
|
|
|
|
|
|
struct thread_context {
|
|
|
|
statement *stmt;
|
|
|
|
ulonglong limit;
|
|
|
|
};
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
typedef struct conclusions conclusions;
|
|
|
|
|
|
|
|
struct conclusions {
|
|
|
|
char *engine;
|
|
|
|
long int avg_timing;
|
|
|
|
long int max_timing;
|
|
|
|
long int min_timing;
|
|
|
|
uint users;
|
|
|
|
unsigned long long avg_rows;
|
2006-01-02 05:27:24 +01:00
|
|
|
/* The following are not used yet */
|
2006-01-02 01:40:02 +01:00
|
|
|
unsigned long long max_rows;
|
|
|
|
unsigned long long min_rows;
|
|
|
|
};
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
static option_string *engine_options= NULL;
|
2007-03-26 11:24:49 +02:00
|
|
|
static statement *pre_statements= NULL;
|
|
|
|
static statement *post_statements= NULL;
|
2005-12-25 00:41:40 +01:00
|
|
|
static statement *create_statements= NULL,
|
|
|
|
*query_statements= NULL;
|
|
|
|
|
|
|
|
/* Prototypes */
|
2006-01-02 01:40:02 +01:00
|
|
|
void print_conclusions(conclusions *con);
|
|
|
|
void print_conclusions_csv(conclusions *con);
|
2007-03-16 07:39:07 +01:00
|
|
|
void generate_stats(conclusions *con, option_string *eng, stats *sptr);
|
2005-12-25 11:03:53 +01:00
|
|
|
uint parse_comma(const char *string, uint **range);
|
|
|
|
uint parse_delimiter(const char *script, statement **stmt, char delm);
|
2015-06-04 08:23:17 +02:00
|
|
|
int parse_option(const char *origin, option_string **stmt, char delm);
|
2005-12-25 00:41:40 +01:00
|
|
|
static int drop_schema(MYSQL *mysql, const char *db);
|
2005-12-29 03:41:06 +01:00
|
|
|
uint get_random_string(char *buf);
|
2006-01-02 01:40:02 +01:00
|
|
|
static statement *build_table_string(void);
|
|
|
|
static statement *build_insert_string(void);
|
2007-03-07 02:14:59 +01:00
|
|
|
static statement *build_update_string(void);
|
2007-03-12 18:25:11 +01:00
|
|
|
static statement * build_select_string(my_bool key);
|
2007-03-16 07:39:07 +01:00
|
|
|
static int generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt);
|
2007-03-07 02:14:59 +01:00
|
|
|
static int drop_primary_key_list(void);
|
2005-12-25 11:03:53 +01:00
|
|
|
static int create_schema(MYSQL *mysql, const char *db, statement *stmt,
|
2007-03-16 07:39:07 +01:00
|
|
|
option_string *engine_stmt);
|
2006-01-02 01:40:02 +01:00
|
|
|
static int run_scheduler(stats *sptr, statement *stmts, uint concur,
|
|
|
|
ulonglong limit);
|
2007-03-17 03:05:11 +01:00
|
|
|
pthread_handler_t run_task(void *p);
|
2006-01-02 05:08:45 +01:00
|
|
|
void statement_cleanup(statement *stmt);
|
2007-03-16 07:39:07 +01:00
|
|
|
void option_cleanup(option_string *stmt);
|
2007-03-16 23:20:22 +01:00
|
|
|
void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr);
|
2007-03-26 11:24:49 +02:00
|
|
|
static int run_statements(MYSQL *mysql, statement *stmt);
|
2007-06-16 02:22:57 +02:00
|
|
|
int slap_connect(MYSQL *mysql);
|
|
|
|
static int run_query(MYSQL *mysql, const char *query, int len);
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
static const char ALPHANUMERICS[]=
|
|
|
|
"0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz";
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
#define ALPHANUMERICS_SIZE (sizeof(ALPHANUMERICS)-1)
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
static long int timedif(struct timeval a, struct timeval b)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
register int us, s;
|
|
|
|
|
|
|
|
us = a.tv_usec - b.tv_usec;
|
|
|
|
us /= 1000;
|
|
|
|
s = a.tv_sec - b.tv_sec;
|
|
|
|
s *= 1000;
|
|
|
|
return s + us;
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2006-01-16 17:35:01 +01:00
|
|
|
#ifdef __WIN__
|
|
|
|
static int gettimeofday(struct timeval *tp, void *tzp)
|
|
|
|
{
|
|
|
|
unsigned int ticks;
|
|
|
|
ticks= GetTickCount();
|
|
|
|
tp->tv_usec= ticks*1000;
|
|
|
|
tp->tv_sec= ticks/1000;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2010-01-29 19:42:22 +01:00
|
|
|
void set_mysql_connect_options(MYSQL *mysql)
|
|
|
|
{
|
|
|
|
if (opt_compress)
|
|
|
|
mysql_options(mysql,MYSQL_OPT_COMPRESS,NullS);
|
|
|
|
#ifdef HAVE_OPENSSL
|
|
|
|
if (opt_use_ssl)
|
2012-08-14 16:23:34 +02:00
|
|
|
{
|
2010-01-29 19:42:22 +01:00
|
|
|
mysql_ssl_set(mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
|
|
|
opt_ssl_capath, opt_ssl_cipher);
|
2012-08-14 16:23:34 +02:00
|
|
|
mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
|
|
|
|
mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
|
|
|
|
}
|
2010-01-29 19:42:22 +01:00
|
|
|
#endif
|
|
|
|
if (opt_protocol)
|
|
|
|
mysql_options(mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
|
|
|
|
#ifdef HAVE_SMEM
|
|
|
|
if (shared_memory_base_name)
|
|
|
|
mysql_options(mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
|
|
|
|
#endif
|
|
|
|
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
MYSQL mysql;
|
2007-03-16 07:39:07 +01:00
|
|
|
option_string *eptr;
|
2006-01-20 16:20:03 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
MY_INIT(argv[0]);
|
2012-03-23 10:53:25 +01:00
|
|
|
sf_leaking_memory=1; /* don't report memory leaks on early exits */
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2009-10-09 16:44:22 +02:00
|
|
|
if (load_defaults("my",load_default_groups,&argc,&argv))
|
|
|
|
{
|
|
|
|
my_end(0);
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-12-03 07:07:11 +01:00
|
|
|
defaults_argv=argv;
|
|
|
|
if (get_options(&argc,&argv))
|
|
|
|
{
|
|
|
|
free_defaults(defaults_argv);
|
|
|
|
my_end(0);
|
|
|
|
exit(1);
|
|
|
|
}
|
2012-03-23 10:53:25 +01:00
|
|
|
sf_leaking_memory=0; /* from now on we cleanup properly */
|
2006-03-29 03:59:11 +02:00
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
/* Seed the random number generator if we will be using it. */
|
|
|
|
if (auto_generate_sql)
|
|
|
|
srandom((uint)time(NULL));
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
/* globals? Yes, so we only have to run strlen once */
|
2005-12-25 00:41:40 +01:00
|
|
|
delimiter_length= strlen(delimiter);
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
if (argc > 2)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Too many arguments\n",my_progname);
|
2005-12-03 07:07:11 +01:00
|
|
|
free_defaults(defaults_argv);
|
|
|
|
my_end(0);
|
2005-11-30 01:02:21 +01:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
mysql_init(&mysql);
|
2010-01-29 19:42:22 +01:00
|
|
|
set_mysql_connect_options(&mysql);
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2011-01-16 04:59:05 +01:00
|
|
|
if (opt_plugin_dir && *opt_plugin_dir)
|
|
|
|
mysql_options(&mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir);
|
|
|
|
|
|
|
|
if (opt_default_auth && *opt_default_auth)
|
|
|
|
mysql_options(&mysql, MYSQL_DEFAULT_AUTH, opt_default_auth);
|
|
|
|
|
2013-10-03 17:00:44 +02:00
|
|
|
mysql_options(&mysql, MYSQL_OPT_CONNECT_ATTR_RESET, 0);
|
|
|
|
mysql_options4(&mysql, MYSQL_OPT_CONNECT_ATTR_ADD,
|
|
|
|
"program_name", "mysqlslap");
|
2005-12-25 00:41:40 +01:00
|
|
|
if (!opt_only_print)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-03-10 17:54:12 +01:00
|
|
|
if (!(mysql_real_connect(&mysql, host, user, opt_password,
|
|
|
|
NULL, opt_mysql_port,
|
2006-07-20 14:51:04 +02:00
|
|
|
opt_mysql_unix_port, connect_flags)))
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2006-04-11 22:04:08 +02:00
|
|
|
fprintf(stderr,"%s: Error when connecting to server: %s\n",
|
|
|
|
my_progname,mysql_error(&mysql));
|
2015-11-29 16:51:23 +01:00
|
|
|
mysql_close(&mysql);
|
2005-12-25 00:41:40 +01:00
|
|
|
free_defaults(defaults_argv);
|
|
|
|
my_end(0);
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2009-11-24 14:54:59 +01:00
|
|
|
pthread_mutex_init(&counter_mutex, NULL);
|
|
|
|
pthread_cond_init(&count_threshhold, NULL);
|
|
|
|
pthread_mutex_init(&sleeper_mutex, NULL);
|
|
|
|
pthread_cond_init(&sleep_threshhold, NULL);
|
2007-03-16 23:20:22 +01:00
|
|
|
|
2006-01-02 05:27:24 +01:00
|
|
|
/* Main iterations loop */
|
2007-03-16 07:39:07 +01:00
|
|
|
eptr= engine_options;
|
2006-01-02 01:40:02 +01:00
|
|
|
do
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
/* For the final stage we run whatever queries we were asked to run */
|
|
|
|
uint *current;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Starting Concurrency Test\n");
|
2006-01-02 01:40:02 +01:00
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
if (*concurrency)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-03-16 23:20:22 +01:00
|
|
|
for (current= concurrency; current && *current; current++)
|
|
|
|
concurrency_loop(&mysql, *current, eptr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
uint infinite= 1;
|
|
|
|
do {
|
|
|
|
concurrency_loop(&mysql, infinite, eptr);
|
2005-12-25 11:03:53 +01:00
|
|
|
}
|
2007-03-16 23:20:22 +01:00
|
|
|
while (infinite++);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2006-01-02 01:40:02 +01:00
|
|
|
|
|
|
|
if (!opt_preserve)
|
|
|
|
drop_schema(&mysql, create_schema_string);
|
2007-03-07 02:14:59 +01:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
} while (eptr ? (eptr= eptr->next) : 0);
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2009-11-24 14:54:59 +01:00
|
|
|
pthread_mutex_destroy(&counter_mutex);
|
|
|
|
pthread_cond_destroy(&count_threshhold);
|
|
|
|
pthread_mutex_destroy(&sleeper_mutex);
|
|
|
|
pthread_cond_destroy(&sleep_threshhold);
|
2007-03-16 23:20:22 +01:00
|
|
|
|
2015-11-29 16:51:23 +01:00
|
|
|
mysql_close(&mysql); /* Close & free connection */
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
/* now free all the strings we created */
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(opt_password);
|
|
|
|
my_free(concurrency);
|
2005-12-25 11:03:53 +01:00
|
|
|
|
2006-01-02 05:08:45 +01:00
|
|
|
statement_cleanup(create_statements);
|
|
|
|
statement_cleanup(query_statements);
|
2007-03-26 11:24:49 +02:00
|
|
|
statement_cleanup(pre_statements);
|
|
|
|
statement_cleanup(post_statements);
|
2007-03-16 07:39:07 +01:00
|
|
|
option_cleanup(engine_options);
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
#ifdef HAVE_SMEM
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(shared_memory_base_name);
|
2005-11-30 01:02:21 +01:00
|
|
|
#endif
|
2005-12-03 07:07:11 +01:00
|
|
|
free_defaults(defaults_argv);
|
2011-07-10 20:09:17 +02:00
|
|
|
mysql_library_end();
|
2007-08-01 21:59:05 +02:00
|
|
|
my_end(my_end_arg);
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2006-01-16 17:35:01 +01:00
|
|
|
return 0;
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr)
|
|
|
|
{
|
|
|
|
unsigned int x;
|
|
|
|
stats *head_sptr;
|
|
|
|
stats *sptr;
|
|
|
|
conclusions conclusion;
|
|
|
|
unsigned long long client_limit;
|
2009-09-23 15:21:29 +02:00
|
|
|
int sysret;
|
2007-03-16 23:20:22 +01:00
|
|
|
|
|
|
|
head_sptr= (stats *)my_malloc(sizeof(stats) * iterations,
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
|
|
|
|
bzero(&conclusion, sizeof(conclusions));
|
|
|
|
|
|
|
|
if (auto_actual_queries)
|
|
|
|
client_limit= auto_actual_queries;
|
|
|
|
else if (num_of_query)
|
|
|
|
client_limit= num_of_query / current;
|
|
|
|
else
|
|
|
|
client_limit= actual_queries;
|
|
|
|
|
|
|
|
for (x= 0, sptr= head_sptr; x < iterations; x++, sptr++)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
We might not want to load any data, such as when we are calling
|
|
|
|
a stored_procedure that doesn't use data, or we know we already have
|
|
|
|
data in the table.
|
|
|
|
*/
|
|
|
|
if (!opt_preserve)
|
|
|
|
drop_schema(mysql, create_schema_string);
|
|
|
|
|
|
|
|
/* First we create */
|
|
|
|
if (create_statements)
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
If we have an --engine option, then we indicate
|
|
|
|
create_schema() to add the engine type to the DDL.
|
|
|
|
*/
|
|
|
|
if (eptr)
|
|
|
|
create_statements->type= CREATE_TABLE_TYPE;
|
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
create_schema(mysql, create_schema_string, create_statements, eptr);
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
}
|
2007-03-16 23:20:22 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
If we generated GUID we need to build a list of them from creation that
|
|
|
|
we can later use.
|
|
|
|
*/
|
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Generating primary key list\n");
|
|
|
|
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
|
|
|
|
generate_primary_key_list(mysql, eptr);
|
|
|
|
|
2007-06-16 02:22:57 +02:00
|
|
|
if (commit_rate)
|
|
|
|
run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
|
|
|
|
|
2009-12-03 12:19:05 +01:00
|
|
|
if (pre_system && (sysret= system(pre_system)) != 0)
|
|
|
|
fprintf(stderr,
|
|
|
|
"Warning: Execution of pre_system option returned %d.\n",
|
|
|
|
sysret);
|
2007-06-16 02:22:57 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Pre statements are always run after all other logic so they can
|
|
|
|
correct/adjust any item that they want.
|
|
|
|
*/
|
2007-03-26 11:24:49 +02:00
|
|
|
if (pre_statements)
|
|
|
|
run_statements(mysql, pre_statements);
|
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
run_scheduler(sptr, query_statements, current, client_limit);
|
2007-03-26 11:24:49 +02:00
|
|
|
|
|
|
|
if (post_statements)
|
|
|
|
run_statements(mysql, post_statements);
|
2007-03-16 23:20:22 +01:00
|
|
|
|
2009-12-03 12:19:05 +01:00
|
|
|
if (post_system && (sysret= system(post_system)) != 0)
|
|
|
|
fprintf(stderr,
|
|
|
|
"Warning: Execution of post_system option returned %d.\n",
|
|
|
|
sysret);
|
2007-03-16 23:20:22 +01:00
|
|
|
/* We are finished with this run */
|
|
|
|
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
|
|
|
|
drop_primary_key_list();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Generating stats\n");
|
|
|
|
|
|
|
|
generate_stats(&conclusion, eptr, head_sptr);
|
|
|
|
|
|
|
|
if (!opt_silent)
|
|
|
|
print_conclusions(&conclusion);
|
|
|
|
if (opt_csv_str)
|
|
|
|
print_conclusions_csv(&conclusion);
|
|
|
|
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(head_sptr);
|
2007-03-16 23:20:22 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2005-12-25 11:03:53 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
static struct my_option my_long_options[] =
|
|
|
|
{
|
2006-01-19 03:27:07 +01:00
|
|
|
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG,
|
|
|
|
0, 0, 0, 0, 0, 0},
|
2005-12-03 07:07:11 +01:00
|
|
|
{"auto-generate-sql", 'a',
|
|
|
|
"Generate SQL where not supplied by file or command line.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql, &auto_generate_sql,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-07 02:14:59 +01:00
|
|
|
{"auto-generate-sql-add-autoincrement", OPT_SLAP_AUTO_GENERATE_ADD_AUTO,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Add an AUTO_INCREMENT column to auto-generated tables.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_autoincrement,
|
|
|
|
&auto_generate_sql_autoincrement,
|
2007-03-07 02:14:59 +01:00
|
|
|
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-12 18:25:11 +01:00
|
|
|
{"auto-generate-sql-execute-number", OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Set this number to generate a set number of queries to run.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_actual_queries, &auto_actual_queries,
|
2007-03-12 18:25:11 +01:00
|
|
|
0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-07 02:14:59 +01:00
|
|
|
{"auto-generate-sql-guid-primary", OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY,
|
|
|
|
"Add GUID based primary keys to auto-generated tables.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_guid_primary,
|
|
|
|
&auto_generate_sql_guid_primary,
|
2007-03-07 02:14:59 +01:00
|
|
|
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2007-01-29 22:17:30 +01:00
|
|
|
{"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Specify test load type: mixed, update, write, key, or read; default is mixed.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &auto_generate_sql_type, (char**) &auto_generate_sql_type,
|
2007-01-29 22:17:30 +01:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-16 07:39:07 +01:00
|
|
|
{"auto-generate-sql-secondary-indexes",
|
|
|
|
OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of secondary indexes to add to auto-generated tables.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_secondary_indexes,
|
|
|
|
&auto_generate_sql_secondary_indexes, 0,
|
2007-03-16 07:39:07 +01:00
|
|
|
GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-12 18:25:11 +01:00
|
|
|
{"auto-generate-sql-unique-query-number",
|
|
|
|
OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of unique queries to generate for automatic tests.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_unique_query_number,
|
|
|
|
&auto_generate_sql_unique_query_number,
|
2007-03-12 18:25:11 +01:00
|
|
|
0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0},
|
|
|
|
{"auto-generate-sql-unique-write-number",
|
|
|
|
OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of unique queries to generate for auto-generate-sql-write-number.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_unique_write_number,
|
|
|
|
&auto_generate_sql_unique_write_number,
|
2007-03-12 18:25:11 +01:00
|
|
|
0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0},
|
2007-02-05 00:31:35 +01:00
|
|
|
{"auto-generate-sql-write-number", OPT_SLAP_AUTO_GENERATE_WRITE_NUM,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of row inserts to perform for each thread (default is 100).",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&auto_generate_sql_number, &auto_generate_sql_number,
|
2007-01-29 22:17:30 +01:00
|
|
|
0, GET_ULL, REQUIRED_ARG, 100, 0, 0, 0, 0, 0},
|
2015-11-29 16:51:23 +01:00
|
|
|
{"character-sets-dir", OPT_CHARSETS_DIR,
|
|
|
|
"Directory for character set files.", &charsets_dir,
|
|
|
|
&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-10-19 00:08:27 +02:00
|
|
|
{"commit", OPT_SLAP_COMMIT, "Commit records every X number of statements.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&commit_rate, &commit_rate, 0, GET_UINT, REQUIRED_ARG,
|
2007-06-16 02:22:57 +02:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
{"compress", 'C', "Use compression in server/client protocol.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0},
|
|
|
|
{"concurrency", 'c', "Number of clients to simulate for query to run.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &concurrency_str, (char**) &concurrency_str, 0, GET_STR,
|
2005-12-25 11:03:53 +01:00
|
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-01-29 22:17:30 +01:00
|
|
|
{"create", OPT_SLAP_CREATE_STRING, "File or string to use create tables.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&create_string, &create_string, 0, GET_STR, REQUIRED_ARG,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2005-12-25 00:41:40 +01:00
|
|
|
{"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &create_schema_string, (char**) &create_schema_string, 0, GET_STR,
|
2005-12-25 00:41:40 +01:00
|
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-01-29 22:17:30 +01:00
|
|
|
{"csv", OPT_SLAP_CSV,
|
2006-01-19 19:33:51 +01:00
|
|
|
"Generate CSV output to named file or to stdout if no file is named.",
|
2009-05-19 03:23:43 +02:00
|
|
|
NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
2007-12-20 21:23:35 +01:00
|
|
|
#ifdef DBUG_OFF
|
|
|
|
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
2008-02-08 12:13:33 +01:00
|
|
|
0, 0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
2007-12-20 21:23:35 +01:00
|
|
|
#else
|
2005-11-30 01:02:21 +01:00
|
|
|
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &default_dbug_option, (char**) &default_dbug_option, 0, GET_STR,
|
2005-11-30 01:02:21 +01:00
|
|
|
OPT_ARG, 0, 0, 0, 0, 0, 0},
|
2007-12-20 21:23:35 +01:00
|
|
|
#endif
|
2007-10-01 14:32:07 +02:00
|
|
|
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&debug_check_flag, &debug_check_flag, 0,
|
2007-08-01 21:59:05 +02:00
|
|
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
{"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag,
|
|
|
|
&debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2011-01-16 04:59:05 +01:00
|
|
|
{"default_auth", OPT_DEFAULT_AUTH,
|
|
|
|
"Default authentication client-side plugin to use.",
|
2011-06-06 12:27:05 +02:00
|
|
|
&opt_default_auth, &opt_default_auth, 0,
|
2011-01-16 04:59:05 +01:00
|
|
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-12-03 07:07:11 +01:00
|
|
|
{"delimiter", 'F',
|
|
|
|
"Delimiter to use in SQL statements supplied in file or command line.",
|
2010-08-07 16:42:30 +02:00
|
|
|
(char**) &delimiter, (char**) &delimiter, 0, GET_STR, REQUIRED_ARG,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2007-12-20 21:23:35 +01:00
|
|
|
{"detach", OPT_SLAP_DETACH,
|
|
|
|
"Detach (close and reopen) connections after X number of requests.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&detach_rate, &detach_rate, 0, GET_UINT, REQUIRED_ARG,
|
2007-06-16 02:22:57 +02:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2010-08-02 11:01:24 +02:00
|
|
|
{"engine", 'e',
|
|
|
|
"Comma separated list of storage engines to use for creating the table."
|
|
|
|
" The test is run for each engine. You can also specify an option for an "
|
|
|
|
"engine after a `:', like memory:max_row=2300",
|
|
|
|
&default_engine, &default_engine, 0,
|
2005-11-30 01:02:21 +01:00
|
|
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
{"host", 'h', "Connect to host.", &host, &host, 0, GET_STR,
|
2005-11-30 01:02:21 +01:00
|
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2013-09-17 16:51:14 +02:00
|
|
|
{"init-command", OPT_INIT_COMMAND,
|
|
|
|
"SQL Command to execute when connecting to MySQL server. Will "
|
|
|
|
"automatically be re-executed when reconnecting.",
|
|
|
|
&opt_init_command, &opt_init_command, 0,
|
|
|
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
{"iterations", 'i', "Number of times to run the tests.", &iterations,
|
|
|
|
&iterations, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0},
|
2011-04-08 08:52:44 +02:00
|
|
|
{"no-drop", OPT_SLAP_NO_DROP, "Do not drop the schema after the test.",
|
|
|
|
&opt_no_drop, &opt_no_drop, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2005-12-25 00:41:40 +01:00
|
|
|
{"number-char-cols", 'x',
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of VARCHAR columns to create in table if specifying --auto-generate-sql.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &num_char_cols_opt, (char**) &num_char_cols_opt, 0, GET_STR, REQUIRED_ARG,
|
2007-03-16 07:39:07 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2005-12-25 00:41:40 +01:00
|
|
|
{"number-int-cols", 'y',
|
2007-12-20 21:23:35 +01:00
|
|
|
"Number of INT columns to create in table if specifying --auto-generate-sql.",
|
2010-08-06 14:39:37 +02:00
|
|
|
(char**) &num_int_cols_opt, (char**) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG,
|
2007-03-16 07:39:07 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2006-01-19 03:27:07 +01:00
|
|
|
{"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY,
|
2005-12-29 03:41:06 +01:00
|
|
|
"Limit each client to this number of queries (this is not exact).",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&num_of_query, &num_of_query, 0,
|
2005-12-29 03:41:06 +01:00
|
|
|
GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-12-25 00:41:40 +01:00
|
|
|
{"only-print", OPT_MYSQL_ONLY_PRINT,
|
2010-02-04 13:39:42 +01:00
|
|
|
"Do not connect to the databases, but instead print out what would have "
|
|
|
|
"been done.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&opt_only_print, &opt_only_print, 0, GET_BOOL, NO_ARG,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
|
|
|
{"password", 'p',
|
2006-01-19 03:27:07 +01:00
|
|
|
"Password to use when connecting to server. If password is not given it's "
|
|
|
|
"asked from the tty.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
#ifdef __WIN__
|
|
|
|
{"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG,
|
|
|
|
NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
|
|
#endif
|
2011-01-16 04:59:05 +01:00
|
|
|
{"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.",
|
2011-06-06 12:27:05 +02:00
|
|
|
&opt_plugin_dir, &opt_plugin_dir, 0,
|
2011-01-16 04:59:05 +01:00
|
|
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
{"port", 'P', "Port number to use for connection.", &opt_mysql_port,
|
|
|
|
&opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0,
|
2006-01-19 03:27:07 +01:00
|
|
|
0},
|
2007-03-26 11:24:49 +02:00
|
|
|
{"post-query", OPT_SLAP_POST_QUERY,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Query to run or file containing query to execute after tests have completed.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&user_supplied_post_statements, &user_supplied_post_statements,
|
2007-03-26 11:24:49 +02:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-06-16 02:22:57 +02:00
|
|
|
{"post-system", OPT_SLAP_POST_SYSTEM,
|
2007-12-20 21:23:35 +01:00
|
|
|
"system() string to execute after tests have completed.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&post_system, &post_system,
|
2007-06-16 02:22:57 +02:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-03-26 11:24:49 +02:00
|
|
|
{"pre-query", OPT_SLAP_PRE_QUERY,
|
2007-12-20 21:23:35 +01:00
|
|
|
"Query to run or file containing query to execute before running tests.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&user_supplied_pre_statements, &user_supplied_pre_statements,
|
2007-03-26 11:24:49 +02:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2007-06-16 02:22:57 +02:00
|
|
|
{"pre-system", OPT_SLAP_PRE_SYSTEM,
|
2007-12-20 21:23:35 +01:00
|
|
|
"system() string to execute before running tests.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&pre_system, &pre_system,
|
2007-06-16 02:22:57 +02:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
{"protocol", OPT_MYSQL_PROTOCOL,
|
2010-02-04 13:39:42 +01:00
|
|
|
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-12-29 03:41:06 +01:00
|
|
|
{"query", 'q', "Query to run or file containing query to run.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&user_supplied_query, &user_supplied_query,
|
2005-12-29 03:41:06 +01:00
|
|
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
#ifdef HAVE_SMEM
|
|
|
|
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
"Base name of shared memory.", &shared_memory_base_name,
|
|
|
|
&shared_memory_base_name, 0, GET_STR_ALLOC, REQUIRED_ARG,
|
2005-11-30 01:02:21 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
|
|
|
#endif
|
2006-01-19 03:27:07 +01:00
|
|
|
{"silent", 's', "Run program in silent mode - no output.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&opt_silent, &opt_silent, 0, GET_BOOL, NO_ARG,
|
2006-01-19 03:27:07 +01:00
|
|
|
0, 0, 0, 0, 0, 0},
|
2010-02-04 13:39:42 +01:00
|
|
|
{"socket", 'S', "The socket file to use for connection.",
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
&opt_mysql_unix_port, &opt_mysql_unix_port, 0, GET_STR,
|
2005-11-30 01:02:21 +01:00
|
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2006-01-19 03:27:07 +01:00
|
|
|
#include <sslopt-longopts.h>
|
2005-11-30 01:02:21 +01:00
|
|
|
#ifndef DONT_ALLOW_USER_CHANGE
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
{"user", 'u', "User for login if not current user.", &user,
|
|
|
|
&user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
#endif
|
|
|
|
{"verbose", 'v',
|
Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
2010-06-10 22:16:43 +02:00
|
|
|
"More verbose output; you can use this multiple times to get even more "
|
|
|
|
"verbose output.", &verbose, &verbose, 0, GET_NO_ARG, NO_ARG,
|
|
|
|
0, 0, 0, 0, 0, 0},
|
|
|
|
{"version", 'V', "Output version information and exit.", 0, 0, 0,
|
|
|
|
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
2005-11-30 01:02:21 +01:00
|
|
|
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static void print_version(void)
|
|
|
|
{
|
2007-08-01 21:59:05 +02:00
|
|
|
printf("%s Ver %s Distrib %s, for %s (%s)\n",my_progname, SLAP_VERSION,
|
2005-11-30 01:02:21 +01:00
|
|
|
MYSQL_SERVER_VERSION,SYSTEM_TYPE,MACHINE_TYPE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void usage(void)
|
|
|
|
{
|
|
|
|
print_version();
|
2012-08-07 15:28:19 +02:00
|
|
|
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2005"));
|
2010-02-04 13:39:42 +01:00
|
|
|
puts("Run a query multiple times against the server.\n");
|
2005-12-03 07:07:11 +01:00
|
|
|
printf("Usage: %s [OPTIONS]\n",my_progname);
|
2005-11-30 01:02:21 +01:00
|
|
|
print_defaults("my",load_default_groups);
|
2014-01-22 14:16:57 +01:00
|
|
|
puts("");
|
2005-11-30 01:02:21 +01:00
|
|
|
my_print_help(my_long_options);
|
2014-01-22 14:16:57 +01:00
|
|
|
my_print_variables(my_long_options);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static my_bool
|
|
|
|
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|
|
|
char *argument)
|
|
|
|
{
|
|
|
|
DBUG_ENTER("get_one_option");
|
|
|
|
switch(optid) {
|
|
|
|
case 'v':
|
|
|
|
verbose++;
|
|
|
|
break;
|
|
|
|
case 'p':
|
2009-05-07 19:51:55 +02:00
|
|
|
if (argument == disabled_my_option)
|
2009-06-03 13:18:12 +02:00
|
|
|
argument= (char*) ""; /* Don't require password */
|
2005-11-30 01:02:21 +01:00
|
|
|
if (argument)
|
|
|
|
{
|
|
|
|
char *start= argument;
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(opt_password);
|
2005-11-30 01:02:21 +01:00
|
|
|
opt_password= my_strdup(argument,MYF(MY_FAE));
|
|
|
|
while (*argument) *argument++= 'x'; /* Destroy argument */
|
|
|
|
if (*start)
|
|
|
|
start[1]= 0; /* Cut length of argument */
|
|
|
|
tty_password= 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
tty_password= 1;
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
|
|
#ifdef __WIN__
|
|
|
|
opt_protocol= MYSQL_PROTOCOL_PIPE;
|
|
|
|
#endif
|
|
|
|
break;
|
|
|
|
case OPT_MYSQL_PROTOCOL:
|
2007-03-19 10:19:51 +01:00
|
|
|
opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib,
|
|
|
|
opt->name);
|
|
|
|
break;
|
2005-11-30 01:02:21 +01:00
|
|
|
case '#':
|
|
|
|
DBUG_PUSH(argument ? argument : default_dbug_option);
|
2007-08-02 06:49:29 +02:00
|
|
|
debug_check_flag= 1;
|
2005-11-30 01:02:21 +01:00
|
|
|
break;
|
2015-11-29 16:51:23 +01:00
|
|
|
case OPT_CHARSETS_DIR:
|
|
|
|
strmake_buf(mysql_charsets_dir, argument);
|
|
|
|
charsets_dir = mysql_charsets_dir;
|
|
|
|
break;
|
2009-05-19 03:23:43 +02:00
|
|
|
case OPT_SLAP_CSV:
|
|
|
|
if (!argument)
|
|
|
|
argument= (char *)"-"; /* use stdout */
|
|
|
|
opt_csv_str= argument;
|
|
|
|
break;
|
2005-11-30 01:02:21 +01:00
|
|
|
#include <sslopt-case.h>
|
|
|
|
case 'V':
|
|
|
|
print_version();
|
|
|
|
exit(0);
|
|
|
|
break;
|
|
|
|
case '?':
|
|
|
|
case 'I': /* Info */
|
|
|
|
usage();
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-12-29 03:41:06 +01:00
|
|
|
uint
|
2005-11-30 01:02:21 +01:00
|
|
|
get_random_string(char *buf)
|
|
|
|
{
|
|
|
|
char *buf_ptr= buf;
|
2005-12-03 07:07:11 +01:00
|
|
|
int x;
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_ENTER("get_random_string");
|
|
|
|
for (x= RAND_STRING_SIZE; x > 0; x--)
|
2005-12-03 07:07:11 +01:00
|
|
|
*buf_ptr++= ALPHANUMERICS[random() % ALPHANUMERICS_SIZE];
|
|
|
|
DBUG_RETURN(buf_ptr - buf);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
build_table_string
|
|
|
|
|
|
|
|
This function builds a create table query if the user opts to not supply
|
|
|
|
a file or string containing a create table statement
|
|
|
|
*/
|
2006-01-02 01:40:02 +01:00
|
|
|
static statement *
|
2005-11-30 01:02:21 +01:00
|
|
|
build_table_string(void)
|
|
|
|
{
|
2007-03-07 02:14:59 +01:00
|
|
|
char buf[HUGE_STRING_LENGTH];
|
2007-03-16 07:39:07 +01:00
|
|
|
unsigned int col_count;
|
2006-01-02 01:40:02 +01:00
|
|
|
statement *ptr;
|
2005-11-30 01:02:21 +01:00
|
|
|
DYNAMIC_STRING table_string;
|
|
|
|
DBUG_ENTER("build_table_string");
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
DBUG_PRINT("info", ("num int cols %u num char cols %u",
|
2005-11-30 01:02:21 +01:00
|
|
|
num_int_cols, num_char_cols));
|
|
|
|
|
|
|
|
init_dynamic_string(&table_string, "", 1024, 1024);
|
|
|
|
|
2005-12-25 00:41:40 +01:00
|
|
|
dynstr_append(&table_string, "CREATE TABLE `t1` (");
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql_autoincrement)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
dynstr_append(&table_string, "id serial");
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
if (num_int_cols || num_char_cols)
|
2005-12-25 00:41:40 +01:00
|
|
|
dynstr_append(&table_string, ",");
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql_guid_primary)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2018-04-17 21:00:15 +02:00
|
|
|
dynstr_append(&table_string, "id varchar(36) primary key");
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
if (num_int_cols || num_char_cols || auto_generate_sql_guid_primary)
|
2005-12-25 00:41:40 +01:00
|
|
|
dynstr_append(&table_string, ",");
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-16 07:39:07 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql_secondary_indexes)
|
|
|
|
{
|
|
|
|
unsigned int count;
|
|
|
|
|
|
|
|
for (count= 0; count < auto_generate_sql_secondary_indexes; count++)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (count) /* Except for the first pass we add a comma */
|
|
|
|
dynstr_append(&table_string, ",");
|
|
|
|
|
2018-04-17 21:00:15 +02:00
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(36) unique key", count)
|
2007-03-16 07:39:07 +01:00
|
|
|
> HUGE_STRING_LENGTH)
|
|
|
|
{
|
2007-03-07 02:14:59 +01:00
|
|
|
fprintf(stderr, "Memory Allocation error in create table\n");
|
|
|
|
exit(1);
|
2007-03-16 07:39:07 +01:00
|
|
|
}
|
|
|
|
dynstr_append(&table_string, buf);
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
if (num_int_cols || num_char_cols)
|
2005-12-25 00:41:40 +01:00
|
|
|
dynstr_append(&table_string, ",");
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
if (num_int_cols)
|
|
|
|
for (col_count= 1; col_count <= num_int_cols; col_count++)
|
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (num_int_cols_index)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32), INDEX(intcol%d)",
|
|
|
|
col_count, col_count) > HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in create table\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32) ", col_count)
|
|
|
|
> HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in create table\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
|
|
|
dynstr_append(&table_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_int_cols || num_char_cols > 0)
|
|
|
|
dynstr_append(&table_string, ",");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (num_char_cols)
|
|
|
|
for (col_count= 1; col_count <= num_char_cols; col_count++)
|
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (num_char_cols_index)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH,
|
|
|
|
"charcol%d VARCHAR(128), INDEX(charcol%d) ",
|
|
|
|
col_count, col_count) > HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating table\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d VARCHAR(128)",
|
|
|
|
col_count) > HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating table\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
|
|
|
dynstr_append(&table_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_char_cols)
|
|
|
|
dynstr_append(&table_string, ",");
|
|
|
|
}
|
|
|
|
|
2005-12-25 00:41:40 +01:00
|
|
|
dynstr_append(&table_string, ")");
|
2007-03-12 18:25:11 +01:00
|
|
|
ptr= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
ptr->string = (char *)my_malloc(table_string.length+1,
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2006-01-02 01:40:02 +01:00
|
|
|
ptr->length= table_string.length+1;
|
2007-03-16 07:39:07 +01:00
|
|
|
ptr->type= CREATE_TABLE_TYPE;
|
2006-01-02 01:40:02 +01:00
|
|
|
strmov(ptr->string, table_string.str);
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_free(&table_string);
|
2006-01-02 01:40:02 +01:00
|
|
|
DBUG_RETURN(ptr);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
/*
|
|
|
|
build_update_string()
|
|
|
|
|
|
|
|
This function builds insert statements when the user opts to not supply
|
|
|
|
an insert file or string containing insert data
|
|
|
|
*/
|
|
|
|
static statement *
|
|
|
|
build_update_string(void)
|
|
|
|
{
|
|
|
|
char buf[HUGE_STRING_LENGTH];
|
2007-03-16 07:39:07 +01:00
|
|
|
unsigned int col_count;
|
2007-03-07 02:14:59 +01:00
|
|
|
statement *ptr;
|
|
|
|
DYNAMIC_STRING update_string;
|
|
|
|
DBUG_ENTER("build_update_string");
|
|
|
|
|
|
|
|
init_dynamic_string(&update_string, "", 1024, 1024);
|
|
|
|
|
|
|
|
dynstr_append(&update_string, "UPDATE t1 SET ");
|
|
|
|
|
|
|
|
if (num_int_cols)
|
|
|
|
for (col_count= 1; col_count <= num_int_cols; col_count++)
|
|
|
|
{
|
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d = %ld", col_count,
|
|
|
|
random()) > HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating update\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
dynstr_append(&update_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_int_cols || num_char_cols > 0)
|
|
|
|
dynstr_append_mem(&update_string, ",", 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (num_char_cols)
|
|
|
|
for (col_count= 1; col_count <= num_char_cols; col_count++)
|
|
|
|
{
|
|
|
|
char rand_buffer[RAND_STRING_SIZE];
|
|
|
|
int buf_len= get_random_string(rand_buffer);
|
|
|
|
|
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d = '%.*s'", col_count,
|
|
|
|
buf_len, rand_buffer)
|
|
|
|
> HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating update\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
dynstr_append(&update_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_char_cols)
|
|
|
|
dynstr_append_mem(&update_string, ",", 1);
|
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
|
2007-03-16 07:39:07 +01:00
|
|
|
dynstr_append(&update_string, " WHERE id = ");
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
ptr= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
|
|
|
|
ptr->string= (char *)my_malloc(update_string.length + 1,
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2007-03-07 02:14:59 +01:00
|
|
|
ptr->length= update_string.length+1;
|
2007-03-12 18:25:11 +01:00
|
|
|
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
|
|
|
|
ptr->type= UPDATE_TYPE_REQUIRES_PREFIX ;
|
2007-03-07 02:14:59 +01:00
|
|
|
else
|
|
|
|
ptr->type= UPDATE_TYPE;
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
strmov(ptr->string, update_string.str);
|
|
|
|
dynstr_free(&update_string);
|
|
|
|
DBUG_RETURN(ptr);
|
|
|
|
}
|
|
|
|
|
2005-12-25 11:03:53 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
/*
|
|
|
|
build_insert_string()
|
|
|
|
|
|
|
|
This function builds insert statements when the user opts to not supply
|
2005-12-25 00:41:40 +01:00
|
|
|
an insert file or string containing insert data
|
2005-11-30 01:02:21 +01:00
|
|
|
*/
|
2006-01-02 01:40:02 +01:00
|
|
|
static statement *
|
2005-11-30 01:02:21 +01:00
|
|
|
build_insert_string(void)
|
|
|
|
{
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
char buf[HUGE_STRING_LENGTH];
|
|
|
|
unsigned int col_count;
|
2006-01-02 01:40:02 +01:00
|
|
|
statement *ptr;
|
2005-11-30 01:02:21 +01:00
|
|
|
DYNAMIC_STRING insert_string;
|
|
|
|
DBUG_ENTER("build_insert_string");
|
|
|
|
|
|
|
|
init_dynamic_string(&insert_string, "", 1024, 1024);
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
dynstr_append(&insert_string, "INSERT INTO t1 VALUES (");
|
|
|
|
|
|
|
|
if (auto_generate_sql_autoincrement)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
dynstr_append(&insert_string, "NULL");
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
if (num_int_cols || num_char_cols)
|
|
|
|
dynstr_append(&insert_string, ",");
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql_guid_primary)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
dynstr_append(&insert_string, "uuid()");
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
if (num_int_cols || num_char_cols)
|
|
|
|
dynstr_append(&insert_string, ",");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (auto_generate_sql_secondary_indexes)
|
|
|
|
{
|
|
|
|
unsigned int count;
|
|
|
|
|
|
|
|
for (count= 0; count < auto_generate_sql_secondary_indexes; count++)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (count) /* Except for the first pass we add a comma */
|
|
|
|
dynstr_append(&insert_string, ",");
|
|
|
|
|
|
|
|
dynstr_append(&insert_string, "uuid()");
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
if (num_int_cols || num_char_cols)
|
|
|
|
dynstr_append(&insert_string, ",");
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
|
|
|
|
if (num_int_cols)
|
|
|
|
for (col_count= 1; col_count <= num_int_cols; col_count++)
|
|
|
|
{
|
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "%ld", random()) > HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating insert\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
dynstr_append(&insert_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_int_cols || num_char_cols > 0)
|
|
|
|
dynstr_append_mem(&insert_string, ",", 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (num_char_cols)
|
|
|
|
for (col_count= 1; col_count <= num_char_cols; col_count++)
|
|
|
|
{
|
|
|
|
int buf_len= get_random_string(buf);
|
|
|
|
dynstr_append_mem(&insert_string, "'", 1);
|
|
|
|
dynstr_append_mem(&insert_string, buf, buf_len);
|
|
|
|
dynstr_append_mem(&insert_string, "'", 1);
|
|
|
|
|
|
|
|
if (col_count < num_char_cols)
|
|
|
|
dynstr_append_mem(&insert_string, ",", 1);
|
|
|
|
}
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_append_mem(&insert_string, ")", 1);
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
ptr= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
ptr->string= (char *)my_malloc(insert_string.length + 1,
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2006-01-02 01:40:02 +01:00
|
|
|
ptr->length= insert_string.length+1;
|
2007-03-07 02:14:59 +01:00
|
|
|
ptr->type= INSERT_TYPE;
|
2006-01-02 01:40:02 +01:00
|
|
|
strmov(ptr->string, insert_string.str);
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_free(&insert_string);
|
2006-01-02 01:40:02 +01:00
|
|
|
DBUG_RETURN(ptr);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2005-12-25 11:03:53 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
/*
|
2007-03-12 18:25:11 +01:00
|
|
|
build_select_string()
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
This function builds a query if the user opts to not supply a query
|
|
|
|
statement or file containing a query statement
|
|
|
|
*/
|
2006-01-02 01:40:02 +01:00
|
|
|
static statement *
|
2007-03-12 18:25:11 +01:00
|
|
|
build_select_string(my_bool key)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
char buf[HUGE_STRING_LENGTH];
|
|
|
|
unsigned int col_count;
|
2006-01-02 01:40:02 +01:00
|
|
|
statement *ptr;
|
2005-11-30 01:02:21 +01:00
|
|
|
static DYNAMIC_STRING query_string;
|
2007-03-12 18:25:11 +01:00
|
|
|
DBUG_ENTER("build_select_string");
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
init_dynamic_string(&query_string, "", 1024, 1024);
|
|
|
|
|
|
|
|
dynstr_append_mem(&query_string, "SELECT ", 7);
|
|
|
|
for (col_count= 1; col_count <= num_int_cols; col_count++)
|
|
|
|
{
|
2007-03-07 02:14:59 +01:00
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d", col_count)
|
|
|
|
> HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating select\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_append(&query_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_int_cols || num_char_cols > 0)
|
|
|
|
dynstr_append_mem(&query_string, ",", 1);
|
|
|
|
|
|
|
|
}
|
|
|
|
for (col_count= 1; col_count <= num_char_cols; col_count++)
|
|
|
|
{
|
2007-03-07 02:14:59 +01:00
|
|
|
if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d", col_count)
|
|
|
|
> HUGE_STRING_LENGTH)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Memory Allocation error in creating select\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_append(&query_string, buf);
|
|
|
|
|
|
|
|
if (col_count < num_char_cols)
|
|
|
|
dynstr_append_mem(&query_string, ",", 1);
|
|
|
|
|
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
dynstr_append(&query_string, " FROM t1");
|
|
|
|
|
|
|
|
if ((key) &&
|
|
|
|
(auto_generate_sql_autoincrement || auto_generate_sql_guid_primary))
|
|
|
|
dynstr_append(&query_string, " WHERE id = ");
|
|
|
|
|
|
|
|
ptr= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
ptr->string= (char *)my_malloc(query_string.length + 1,
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2006-01-02 01:40:02 +01:00
|
|
|
ptr->length= query_string.length+1;
|
2007-03-12 18:25:11 +01:00
|
|
|
if ((key) &&
|
|
|
|
(auto_generate_sql_autoincrement || auto_generate_sql_guid_primary))
|
|
|
|
ptr->type= SELECT_TYPE_REQUIRES_PREFIX;
|
|
|
|
else
|
|
|
|
ptr->type= SELECT_TYPE;
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
strmov(ptr->string, query_string.str);
|
2005-11-30 01:02:21 +01:00
|
|
|
dynstr_free(&query_string);
|
dbug changes:
1. dbug state is now local to a thread
2. new macros: DBUG_EXPLAIN, DBUG_EXPLAIN_INITIAL,
DBUG_SET, DBUG_SET_INITIAL, DBUG_EVALUATE, DBUG_EVALUATE_IF
3. macros are do{}while(0) wrapped
4. incremental modifications to the dbug state (e.g. "+d,info:-t")
5. dbug code cleanup, style fixes
6. _db_on_ and DEBUGGER_ON/OFF removed
7. rest of MySQL code fixed because of 3 (missing ;) and 6
8. dbug manual updated
9. server variable @@debug (global and local) to control dbug from SQL!
a. -#T to print timestamps in the log
BitKeeper/deleted/.del-readme.prof~2f3bae1550a0038d:
Delete: dbug/readme.prof
client/mysqlslap.c:
typo fixed
configure.in:
test for sleep() too
dbug/dbug.c:
thread local dbug settings
DBUG_EXPLAIN,DBUG_EXPLAIN_INITIAL,DBUG_SET,DBUG_SET_INITIAL
style changes to be more in line with MySQL code
cleanup (many mallocs removed)
incremental modification of dbug state (e.g. DBUG_PUSH("+t:-d,info"))
DBUG_SET, _db_explain_
-#T
dbug/monty.doc:
obsolete and duplicate docs removed
dbug/user.r:
new features documented
include/my_dbug.h:
correct do{}while wrapping
thread local dbug settings
DBUG_EXPLAIN,DBUG_EXPLAIN_INITIAL,DBUG_SET,DBUG_SET_INITIAL
DBUG_EVALUATE,DBUG_EVALUATE_IF
libmysql/libmysql.c:
remove _db_on_ and DEBUGGER_ON/OFF
mysys/my_init.c:
missed DBUG_RETURN
mysys/my_thr_init.c:
bugfix - transaction id's are unsigned
mysys/testhash.c:
remove _db_on_ and DEBUGGER_ON/OFF
sql/ha_myisammrg.cc:
missed ;
sql/ha_ndbcluster.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
sql/ha_ndbcluster_binlog.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
sql/item_cmpfunc.cc:
missed ;
sql/lock.cc:
missed DBUG_RETURN
sql/log_event.cc:
missed ;
sql/mysqld.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
DBUG_SET_INITIAL
sql/opt_range.cc:
remove _db_on_ and DEBUGGER_ON/OFF
sql/set_var.cc:
class sys_var_thd_dbug and "debug" server variable
sql/set_var.h:
class sys_var_thd_dbug and "debug" server variable
sql/slave.cc:
missed ;
sql/sql_cache.cc:
missed ;
sql/sql_plugin.cc:
missed ;
sql/sql_select.cc:
remove _db_on_ and DEBUGGER_ON/OFF
storage/heap/hp_test2.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/ft_eval.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/ft_test1.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_open.c:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
storage/myisam/mi_test1.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_test2.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_test3.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/ndb/src/ndbapi/DictCache.cpp:
missed ;
storage/ndb/src/ndbapi/NdbTransaction.cpp:
missed ;
tests/mysql_client_test.c:
remove _db_on_ and DEBUGGER_ON/OFF
2006-02-14 22:36:11 +01:00
|
|
|
DBUG_RETURN(ptr);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
dbug changes:
1. dbug state is now local to a thread
2. new macros: DBUG_EXPLAIN, DBUG_EXPLAIN_INITIAL,
DBUG_SET, DBUG_SET_INITIAL, DBUG_EVALUATE, DBUG_EVALUATE_IF
3. macros are do{}while(0) wrapped
4. incremental modifications to the dbug state (e.g. "+d,info:-t")
5. dbug code cleanup, style fixes
6. _db_on_ and DEBUGGER_ON/OFF removed
7. rest of MySQL code fixed because of 3 (missing ;) and 6
8. dbug manual updated
9. server variable @@debug (global and local) to control dbug from SQL!
a. -#T to print timestamps in the log
BitKeeper/deleted/.del-readme.prof~2f3bae1550a0038d:
Delete: dbug/readme.prof
client/mysqlslap.c:
typo fixed
configure.in:
test for sleep() too
dbug/dbug.c:
thread local dbug settings
DBUG_EXPLAIN,DBUG_EXPLAIN_INITIAL,DBUG_SET,DBUG_SET_INITIAL
style changes to be more in line with MySQL code
cleanup (many mallocs removed)
incremental modification of dbug state (e.g. DBUG_PUSH("+t:-d,info"))
DBUG_SET, _db_explain_
-#T
dbug/monty.doc:
obsolete and duplicate docs removed
dbug/user.r:
new features documented
include/my_dbug.h:
correct do{}while wrapping
thread local dbug settings
DBUG_EXPLAIN,DBUG_EXPLAIN_INITIAL,DBUG_SET,DBUG_SET_INITIAL
DBUG_EVALUATE,DBUG_EVALUATE_IF
libmysql/libmysql.c:
remove _db_on_ and DEBUGGER_ON/OFF
mysys/my_init.c:
missed DBUG_RETURN
mysys/my_thr_init.c:
bugfix - transaction id's are unsigned
mysys/testhash.c:
remove _db_on_ and DEBUGGER_ON/OFF
sql/ha_myisammrg.cc:
missed ;
sql/ha_ndbcluster.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
sql/ha_ndbcluster_binlog.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
sql/item_cmpfunc.cc:
missed ;
sql/lock.cc:
missed DBUG_RETURN
sql/log_event.cc:
missed ;
sql/mysqld.cc:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
DBUG_SET_INITIAL
sql/opt_range.cc:
remove _db_on_ and DEBUGGER_ON/OFF
sql/set_var.cc:
class sys_var_thd_dbug and "debug" server variable
sql/set_var.h:
class sys_var_thd_dbug and "debug" server variable
sql/slave.cc:
missed ;
sql/sql_cache.cc:
missed ;
sql/sql_plugin.cc:
missed ;
sql/sql_select.cc:
remove _db_on_ and DEBUGGER_ON/OFF
storage/heap/hp_test2.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/ft_eval.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/ft_test1.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_open.c:
remove _db_on_ and DEBUGGER_ON/OFF
missed ;
storage/myisam/mi_test1.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_test2.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/myisam/mi_test3.c:
remove _db_on_ and DEBUGGER_ON/OFF
storage/ndb/src/ndbapi/DictCache.cpp:
missed ;
storage/ndb/src/ndbapi/NdbTransaction.cpp:
missed ;
tests/mysql_client_test.c:
remove _db_on_ and DEBUGGER_ON/OFF
2006-02-14 22:36:11 +01:00
|
|
|
static int
|
2005-11-30 01:02:21 +01:00
|
|
|
get_options(int *argc,char ***argv)
|
|
|
|
{
|
|
|
|
int ho_error;
|
2006-01-02 01:40:02 +01:00
|
|
|
char *tmp_string;
|
2005-11-30 01:02:21 +01:00
|
|
|
MY_STAT sbuf; /* Stat information for the data file */
|
|
|
|
|
|
|
|
DBUG_ENTER("get_options");
|
|
|
|
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
|
|
|
|
exit(ho_error);
|
2007-08-01 21:59:05 +02:00
|
|
|
if (debug_info_flag)
|
|
|
|
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
|
|
|
|
if (debug_check_flag)
|
|
|
|
my_end_arg= MY_CHECK_ERROR;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
if (!user)
|
|
|
|
user= (char *)"root";
|
|
|
|
|
2011-04-08 08:52:44 +02:00
|
|
|
/*
|
|
|
|
If something is created and --no-drop is not specified, we drop the
|
|
|
|
schema.
|
|
|
|
*/
|
|
|
|
if (!opt_no_drop && (create_string || auto_generate_sql))
|
2006-03-29 03:59:11 +02:00
|
|
|
opt_preserve= FALSE;
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (auto_generate_sql && (create_string || user_supplied_query))
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
|
|
|
fprintf(stderr,
|
2006-01-02 01:40:02 +01:00
|
|
|
"%s: Can't use --auto-generate-sql when create and query strings are specified!\n",
|
2005-11-30 01:02:21 +01:00
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (auto_generate_sql && auto_generate_sql_guid_primary &&
|
|
|
|
auto_generate_sql_autoincrement)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
|
|
|
fprintf(stderr,
|
|
|
|
"%s: Either auto-generate-sql-guid-primary or auto-generate-sql-add-autoincrement can be used!\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2007-03-13 18:27:59 +01:00
|
|
|
/*
|
|
|
|
We are testing to make sure that if someone specified a key search
|
|
|
|
that we actually added a key!
|
|
|
|
*/
|
|
|
|
if (auto_generate_sql && auto_generate_sql_type[0] == 'k')
|
|
|
|
if ( auto_generate_sql_autoincrement == FALSE &&
|
|
|
|
auto_generate_sql_guid_primary == FALSE)
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
fprintf(stderr,
|
|
|
|
"%s: Can't perform key test without a primary key!\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
2007-03-13 18:27:59 +01:00
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql && num_of_query && auto_actual_queries)
|
|
|
|
{
|
|
|
|
fprintf(stderr,
|
|
|
|
"%s: Either auto-generate-sql-execute-number or number-of-queries can be used!\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2006-01-02 05:08:45 +01:00
|
|
|
parse_comma(concurrency_str ? concurrency_str : "1", &concurrency);
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (opt_csv_str)
|
2005-12-25 11:03:53 +01:00
|
|
|
{
|
2005-12-25 00:41:40 +01:00
|
|
|
opt_silent= TRUE;
|
2006-01-02 01:40:02 +01:00
|
|
|
|
|
|
|
if (opt_csv_str[0] == '-')
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
This is the downport of
Bug#24509 - 2048 file descriptor limit on windows needs increasing, also
WL#3049 - improved Windows I/O
The patch replaces the use of the POSIX I/O interfaces in mysys on Windows with
the Win32 API calls (CreateFile, WriteFile, etc). The Windows HANDLE for the open
file is stored in the my_file_info struct, along with a flag for append mode
because the Windows API does not support opening files in append mode in all cases)
The default max open files has been increased to 16384 and can be increased further
by setting --max-open-files=<value> during the server start.
Another major change in this patch that almost all Windows specific file IO code
has been moved to a new file my_winfile.c, greatly reducing the amount of code
in #ifdef blocks within mysys, thus improving readability.
Minor enhancements:
- my_(f)stat() is changed to use __stati64 structure with 64 file size
and timestamps. It will return correct file size now (C runtime implementation
used to report outdated information)
- my_lock on Windows is prepared to handle additional timeout parameter
- after review : changed __WIN__ to _WIN32 in the new and changed code.
client/mysqlbinlog.cc:
fileno -> my_fileno
client/readline.cc:
fileno -> my_fileno
include/config-win.h:
Increase OS_FILE_LIMIT for Windows.
Remove O_SHARE - Windows does not support it. Its definition conflicts with
O_SHORT_LIVED, that has different semantics.
include/my_dir.h:
Use stat64 for stat() family of functions on Windows, because of 64 bit file size.
include/my_global.h:
Increased default value for open file limit to 16K
include/my_sys.h:
- my_file_info got new structure members - file handle and open flags
- 2 new Windows-only mysys functions : my_get_osfhandle and my_osmaperr,
modelled after Windows C runtime functions _get_osfhandle and _dosmaperr
libmysql/CMakeLists.txt:
new files my_winfile.c and my_winerr.c
mysql-test/suite/large_tests/r/lock_tables_big.result:
test for more then 2048 open file descriptors on Windows
mysql-test/suite/large_tests/t/lock_tables_big.test:
test for more then 2048 open file descriptors on Windows
mysys/CMakeLists.txt:
new files my_winfile.c and my_winerr.c
mysys/Makefile.am:
new files my_winfile.c and my_winerr.c
mysys/default_modify.c:
fileno -> my_fileno
mysys/my_chsize.c:
implementation of chsize on Windows now moved to my_winfile.c
mysys/my_create.c:
- my_sopen->my_win_open
- close open file before removing (won't generally work on Windows otherwise)
mysys/my_file.c:
On Windows, files returned by my_open will not start with 0, but 2048
(making it simple to detect incompatible mix of CRT and mysys io functions)
mysys/my_fopen.c:
fileno->my_win_fileno , fclose->my_win_fclose, fdopen->my_win_fdopen
Check for legal filename is done by my_win_[f]open functions
mysys/my_fstream.c:
fileno->my_fileno
mysys/my_lib.c:
Windows stat() functions are moved to my_winfile.c
mysys/my_lock.c:
Move Windows code under #ifdef to a separate function win_lock().
Add a parameter for lock wait timeout
mysys/my_mmap.c:
_get_osfhandle->my_get_osfhandle
mysys/my_open.c:
my_sopen->my_win_open (simpler interface)
mysys/my_pread.c:
moved most windows specific code to my_win_file.c
Use my_win_pread
mysys/my_quick.c:
Use my_win_read/my_win_write
mysys/my_read.c:
Moved most of windows specific code to my_win_file.c
Use my_win_read()
mysys/my_seek.c:
On Windows, use my_win_lseek() in my_seek()/my_tell()
Removed dead code (synchronization of lseeks)
Improved DBUG tracing (file position is ulonglong, not ulong)
mysys/my_static.c:
Removed array initialization. my_file_info_default is global variable
thus it is initialized with all zeros anyway
mysys/my_sync.c:
_commit->my_win_fsync
mysys/my_winerr.c:
New file my_winerr.c
Exports my_osmaperr modelled after undocumented C runtime
function _dosmaperr(). The problem with _dosmaperr() used previously is that
1) it is nowhere documented and thus code relying on it is not guaranteed to work
in subsequent releases on the C runtime
2) it is present only in static C runtime (mysqld does not link if compiled with
/MD)
mysys/my_winfile.c:
New file my_winfile.c
Implements ANSI/Posix file IO routines, when possible using native Windows IO, without
C runtime (C runtime dropped because of the 2048 file descriptor limit).
mysys/my_write.c:
write->my_win_write
mysys/mysys_priv.h:
Declaration of Windows Posix functions (private to mysys, shall not be visible
outside)
storage/innobase/handler/ha_innodb.cc:
mysys native Windows IO : correct innodb tmp file handling
mysql_tmpfile does not return valid CRT file descriptor, thus
it is not possible to dup() it. Instead, the native file handle has
to be duplicated and then converted to CRT descriptor.
storage/myisam/mi_locking.c:
_commit->my_sync
2009-09-11 22:26:35 +02:00
|
|
|
csv_file= my_fileno(stdout);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2006-01-02 01:40:02 +01:00
|
|
|
else
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
if ((csv_file= my_open(opt_csv_str, O_CREAT|O_WRONLY|O_APPEND, MYF(0)))
|
|
|
|
== -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Could not open csv file: %sn\n",
|
|
|
|
my_progname, opt_csv_str);
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (opt_only_print)
|
|
|
|
opt_silent= TRUE;
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
if (num_int_cols_opt)
|
|
|
|
{
|
|
|
|
option_string *str;
|
2015-06-04 08:23:17 +02:00
|
|
|
if(parse_option(num_int_cols_opt, &str, ',') == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Invalid value specified for the option "
|
|
|
|
"'number-int-cols'\n");
|
|
|
|
option_cleanup(str);
|
|
|
|
return 1;
|
|
|
|
}
|
2007-03-16 07:39:07 +01:00
|
|
|
num_int_cols= atoi(str->string);
|
|
|
|
if (str->option)
|
|
|
|
num_int_cols_index= atoi(str->option);
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
option_cleanup(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (num_char_cols_opt)
|
|
|
|
{
|
|
|
|
option_string *str;
|
2015-06-04 08:23:17 +02:00
|
|
|
if(parse_option(num_char_cols_opt, &str, ',') == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Invalid value specified for the option "
|
|
|
|
"'number-char-cols'\n");
|
|
|
|
option_cleanup(str);
|
|
|
|
return 1;
|
|
|
|
}
|
2007-03-16 07:39:07 +01:00
|
|
|
num_char_cols= atoi(str->string);
|
|
|
|
if (str->option)
|
|
|
|
num_char_cols_index= atoi(str->option);
|
|
|
|
else
|
|
|
|
num_char_cols_index= 0;
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
option_cleanup(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (auto_generate_sql)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-01-29 22:17:30 +01:00
|
|
|
unsigned long long x= 0;
|
|
|
|
statement *ptr_statement;
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Building Create Statements for Auto\n");
|
|
|
|
|
2007-01-29 22:17:30 +01:00
|
|
|
create_statements= build_table_string();
|
2007-03-12 18:25:11 +01:00
|
|
|
/*
|
|
|
|
Pre-populate table
|
|
|
|
*/
|
|
|
|
for (ptr_statement= create_statements, x= 0;
|
|
|
|
x < auto_generate_sql_unique_write_number;
|
|
|
|
x++, ptr_statement= ptr_statement->next)
|
|
|
|
{
|
|
|
|
ptr_statement->next= build_insert_string();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Building Query Statements for Auto\n");
|
2007-01-29 22:17:30 +01:00
|
|
|
|
|
|
|
if (auto_generate_sql_type[0] == 'r')
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Generating SELECT Statements for Auto\n");
|
|
|
|
|
|
|
|
query_statements= build_select_string(FALSE);
|
|
|
|
for (ptr_statement= query_statements, x= 0;
|
|
|
|
x < auto_generate_sql_unique_query_number;
|
2007-01-29 22:17:30 +01:00
|
|
|
x++, ptr_statement= ptr_statement->next)
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
ptr_statement->next= build_select_string(FALSE);
|
2007-01-29 22:17:30 +01:00
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
}
|
|
|
|
else if (auto_generate_sql_type[0] == 'k')
|
|
|
|
{
|
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Generating SELECT for keys Statements for Auto\n");
|
2007-01-29 22:17:30 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
query_statements= build_select_string(TRUE);
|
|
|
|
for (ptr_statement= query_statements, x= 0;
|
|
|
|
x < auto_generate_sql_unique_query_number;
|
|
|
|
x++, ptr_statement= ptr_statement->next)
|
|
|
|
{
|
|
|
|
ptr_statement->next= build_select_string(TRUE);
|
|
|
|
}
|
2007-01-29 22:17:30 +01:00
|
|
|
}
|
|
|
|
else if (auto_generate_sql_type[0] == 'w')
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
We generate a number of strings in case the engine is
|
|
|
|
Archive (since strings which were identical one after another
|
|
|
|
would be too easily optimized).
|
|
|
|
*/
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Generating INSERT Statements for Auto\n");
|
2006-01-02 01:40:02 +01:00
|
|
|
query_statements= build_insert_string();
|
2007-01-29 22:17:30 +01:00
|
|
|
for (ptr_statement= query_statements, x= 0;
|
2007-03-12 18:25:11 +01:00
|
|
|
x < auto_generate_sql_unique_query_number;
|
2007-01-29 22:17:30 +01:00
|
|
|
x++, ptr_statement= ptr_statement->next)
|
2006-04-11 22:04:08 +02:00
|
|
|
{
|
2007-01-29 22:17:30 +01:00
|
|
|
ptr_statement->next= build_insert_string();
|
2006-04-11 22:04:08 +02:00
|
|
|
}
|
2007-01-29 22:17:30 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
else if (auto_generate_sql_type[0] == 'u')
|
|
|
|
{
|
|
|
|
query_statements= build_update_string();
|
|
|
|
for (ptr_statement= query_statements, x= 0;
|
2007-03-12 18:25:11 +01:00
|
|
|
x < auto_generate_sql_unique_query_number;
|
2007-03-07 02:14:59 +01:00
|
|
|
x++, ptr_statement= ptr_statement->next)
|
|
|
|
{
|
|
|
|
ptr_statement->next= build_update_string();
|
|
|
|
}
|
|
|
|
}
|
2007-01-29 22:17:30 +01:00
|
|
|
else /* Mixed mode is default */
|
|
|
|
{
|
|
|
|
int coin= 0;
|
2006-04-11 22:04:08 +02:00
|
|
|
|
2007-01-29 22:17:30 +01:00
|
|
|
query_statements= build_insert_string();
|
|
|
|
/*
|
|
|
|
This logic should be extended to do a more mixed load,
|
|
|
|
at the moment it results in "every other".
|
|
|
|
*/
|
|
|
|
for (ptr_statement= query_statements, x= 0;
|
2007-03-12 18:25:11 +01:00
|
|
|
x < auto_generate_sql_unique_query_number;
|
2007-01-29 22:17:30 +01:00
|
|
|
x++, ptr_statement= ptr_statement->next)
|
|
|
|
{
|
|
|
|
if (coin)
|
|
|
|
{
|
|
|
|
ptr_statement->next= build_insert_string();
|
|
|
|
coin= 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
ptr_statement->next= build_select_string(TRUE);
|
2007-01-29 22:17:30 +01:00
|
|
|
coin= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2006-01-02 01:40:02 +01:00
|
|
|
else
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
if (create_string && my_stat(create_string, &sbuf, MYF(0)))
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
File data_file;
|
|
|
|
if (!MY_S_ISREG(sbuf.st_mode))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Create file was not a regular file\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if ((data_file= my_open(create_string, O_RDWR, MYF(0))) == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Could not open create file\n", my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
2011-06-13 02:38:16 +02:00
|
|
|
tmp_string= (char *)my_malloc((size_t)sbuf.st_size + 1,
|
2007-03-12 18:25:11 +01:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2011-06-13 02:38:16 +02:00
|
|
|
my_read(data_file, (uchar*) tmp_string, (size_t)sbuf.st_size, MYF(0));
|
2006-01-02 01:40:02 +01:00
|
|
|
tmp_string[sbuf.st_size]= '\0';
|
|
|
|
my_close(data_file,MYF(0));
|
|
|
|
parse_delimiter(tmp_string, &create_statements, delimiter[0]);
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(tmp_string);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2006-01-02 01:40:02 +01:00
|
|
|
else if (create_string)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
parse_delimiter(create_string, &create_statements, delimiter[0]);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (user_supplied_query && my_stat(user_supplied_query, &sbuf, MYF(0)))
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
File data_file;
|
|
|
|
if (!MY_S_ISREG(sbuf.st_mode))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: User query supplied file was not a regular file\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if ((data_file= my_open(user_supplied_query, O_RDWR, MYF(0))) == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Could not open query supplied file\n", my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
2011-06-13 02:38:16 +02:00
|
|
|
tmp_string= (char *)my_malloc((size_t)sbuf.st_size + 1,
|
2007-03-12 18:25:11 +01:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2011-06-13 02:38:16 +02:00
|
|
|
my_read(data_file, (uchar*) tmp_string, (size_t)sbuf.st_size, MYF(0));
|
2006-01-02 01:40:02 +01:00
|
|
|
tmp_string[sbuf.st_size]= '\0';
|
|
|
|
my_close(data_file,MYF(0));
|
|
|
|
if (user_supplied_query)
|
|
|
|
actual_queries= parse_delimiter(tmp_string, &query_statements,
|
|
|
|
delimiter[0]);
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(tmp_string);
|
2006-01-02 01:40:02 +01:00
|
|
|
}
|
|
|
|
else if (user_supplied_query)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
actual_queries= parse_delimiter(user_supplied_query, &query_statements,
|
|
|
|
delimiter[0]);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-26 11:24:49 +02:00
|
|
|
if (user_supplied_pre_statements && my_stat(user_supplied_pre_statements, &sbuf, MYF(0)))
|
|
|
|
{
|
|
|
|
File data_file;
|
|
|
|
if (!MY_S_ISREG(sbuf.st_mode))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: User query supplied file was not a regular file\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if ((data_file= my_open(user_supplied_pre_statements, O_RDWR, MYF(0))) == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Could not open query supplied file\n", my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
2011-06-13 02:38:16 +02:00
|
|
|
tmp_string= (char *)my_malloc((size_t)sbuf.st_size + 1,
|
2007-03-26 11:24:49 +02:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2011-06-13 02:38:16 +02:00
|
|
|
my_read(data_file, (uchar*) tmp_string, (size_t)sbuf.st_size, MYF(0));
|
2007-03-26 11:24:49 +02:00
|
|
|
tmp_string[sbuf.st_size]= '\0';
|
|
|
|
my_close(data_file,MYF(0));
|
|
|
|
if (user_supplied_pre_statements)
|
2007-08-09 22:01:29 +02:00
|
|
|
(void)parse_delimiter(tmp_string, &pre_statements,
|
|
|
|
delimiter[0]);
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(tmp_string);
|
2007-03-26 11:24:49 +02:00
|
|
|
}
|
|
|
|
else if (user_supplied_pre_statements)
|
|
|
|
{
|
2007-08-09 22:01:29 +02:00
|
|
|
(void)parse_delimiter(user_supplied_pre_statements,
|
|
|
|
&pre_statements,
|
|
|
|
delimiter[0]);
|
2007-03-26 11:24:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (user_supplied_post_statements && my_stat(user_supplied_post_statements, &sbuf, MYF(0)))
|
|
|
|
{
|
|
|
|
File data_file;
|
|
|
|
if (!MY_S_ISREG(sbuf.st_mode))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: User query supplied file was not a regular file\n",
|
|
|
|
my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if ((data_file= my_open(user_supplied_post_statements, O_RDWR, MYF(0))) == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Could not open query supplied file\n", my_progname);
|
|
|
|
exit(1);
|
|
|
|
}
|
2011-06-13 02:38:16 +02:00
|
|
|
tmp_string= (char *)my_malloc((size_t)sbuf.st_size + 1,
|
2007-03-26 11:24:49 +02:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2011-06-13 02:38:16 +02:00
|
|
|
my_read(data_file, (uchar*) tmp_string, (size_t)sbuf.st_size, MYF(0));
|
2007-03-26 11:24:49 +02:00
|
|
|
tmp_string[sbuf.st_size]= '\0';
|
|
|
|
my_close(data_file,MYF(0));
|
|
|
|
if (user_supplied_post_statements)
|
2007-08-09 22:01:29 +02:00
|
|
|
(void)parse_delimiter(tmp_string, &post_statements,
|
|
|
|
delimiter[0]);
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(tmp_string);
|
2007-03-26 11:24:49 +02:00
|
|
|
}
|
|
|
|
else if (user_supplied_post_statements)
|
|
|
|
{
|
2007-08-09 22:01:29 +02:00
|
|
|
(void)parse_delimiter(user_supplied_post_statements, &post_statements,
|
|
|
|
delimiter[0]);
|
2007-03-26 11:24:49 +02:00
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Parsing engines to use.\n");
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
if (default_engine)
|
2015-06-04 08:23:17 +02:00
|
|
|
{
|
|
|
|
if(parse_option(default_engine, &engine_options, ',') == -1)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Invalid value specified for the option 'engine'\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
if (tty_password)
|
|
|
|
opt_password= get_tty_password(NullS);
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2005-12-03 07:07:11 +01:00
|
|
|
DBUG_RETURN(0);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
static int run_query(MYSQL *mysql, const char *query, int len)
|
|
|
|
{
|
|
|
|
if (opt_only_print)
|
|
|
|
{
|
|
|
|
printf("%.*s;\n", len, query);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 3)
|
2006-04-11 22:04:08 +02:00
|
|
|
printf("%.*s;\n", len, query);
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
return mysql_real_query(mysql, query, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
static int
|
2007-03-16 07:39:07 +01:00
|
|
|
generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
|
|
|
MYSQL_RES *result;
|
|
|
|
MYSQL_ROW row;
|
2007-03-12 18:25:11 +01:00
|
|
|
unsigned long long counter;
|
2007-03-26 11:24:49 +02:00
|
|
|
DBUG_ENTER("generate_primary_key_list");
|
2007-03-07 02:14:59 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
/*
|
|
|
|
Blackhole is a special case, this allows us to test the upper end
|
|
|
|
of the server during load runs.
|
|
|
|
*/
|
|
|
|
if (opt_only_print || (engine_stmt &&
|
|
|
|
strstr(engine_stmt->string, "blackhole")))
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
|
|
|
primary_keys_number_of= 1;
|
2007-03-13 08:56:30 +01:00
|
|
|
primary_keys= (char **)my_malloc((uint)(sizeof(char *) *
|
|
|
|
primary_keys_number_of),
|
2007-03-12 18:25:11 +01:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
/* Yes, we strdup a const string to simplify the interface */
|
|
|
|
primary_keys[0]= my_strdup("796c4422-1d94-102a-9d6d-00e0812d", MYF(0));
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
else
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
if (run_query(mysql, "SELECT id from t1", strlen("SELECT id from t1")))
|
2007-03-12 18:25:11 +01:00
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot select GUID primary keys. (%s)\n", my_progname,
|
|
|
|
mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2011-01-13 11:26:42 +01:00
|
|
|
if (!(result= mysql_store_result(mysql)))
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s: Error when storing result: %d %s\n",
|
|
|
|
my_progname, mysql_errno(mysql), mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
primary_keys_number_of= mysql_num_rows(result);
|
|
|
|
|
|
|
|
/* So why check this? Blackhole :) */
|
|
|
|
if (primary_keys_number_of)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
We create the structure and loop and create the items.
|
|
|
|
*/
|
2007-03-13 08:56:30 +01:00
|
|
|
primary_keys= (char **)my_malloc((uint)(sizeof(char *) *
|
|
|
|
primary_keys_number_of),
|
2007-03-12 18:25:11 +01:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
|
|
|
row= mysql_fetch_row(result);
|
|
|
|
for (counter= 0; counter < primary_keys_number_of;
|
|
|
|
counter++, row= mysql_fetch_row(result))
|
|
|
|
primary_keys[counter]= my_strdup(row[0], MYF(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
mysql_free_result(result);
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
drop_primary_key_list(void)
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
unsigned long long counter;
|
|
|
|
|
|
|
|
if (primary_keys_number_of)
|
|
|
|
{
|
|
|
|
for (counter= 0; counter < primary_keys_number_of; counter++)
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(primary_keys[counter]);
|
2007-03-12 18:25:11 +01:00
|
|
|
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(primary_keys);
|
2007-03-12 18:25:11 +01:00
|
|
|
}
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
return 0;
|
|
|
|
}
|
2006-04-11 22:04:08 +02:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
static int
|
2005-12-25 11:03:53 +01:00
|
|
|
create_schema(MYSQL *mysql, const char *db, statement *stmt,
|
2007-03-16 07:39:07 +01:00
|
|
|
option_string *engine_stmt)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2005-12-25 00:41:40 +01:00
|
|
|
char query[HUGE_STRING_LENGTH];
|
|
|
|
statement *ptr;
|
2007-03-12 18:25:11 +01:00
|
|
|
statement *after_create;
|
2006-04-11 22:04:08 +02:00
|
|
|
int len;
|
2007-03-12 18:25:11 +01:00
|
|
|
ulonglong count;
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_ENTER("create_schema");
|
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
len= snprintf(query, HUGE_STRING_LENGTH, "CREATE SCHEMA `%s`", db);
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 2)
|
|
|
|
printf("Loading Pre-data\n");
|
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
if (run_query(mysql, query, len))
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2006-04-11 22:04:08 +02:00
|
|
|
fprintf(stderr,"%s: Cannot create schema %s : %s\n", my_progname, db,
|
|
|
|
mysql_error(mysql));
|
|
|
|
exit(1);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
if (opt_only_print)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2005-12-25 00:41:40 +01:00
|
|
|
printf("use %s;\n", db);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
if (verbose >= 3)
|
2006-04-11 22:04:08 +02:00
|
|
|
printf("%s;\n", query);
|
2007-03-12 18:25:11 +01:00
|
|
|
|
2005-12-25 00:41:40 +01:00
|
|
|
if (mysql_select_db(mysql, db))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot select schema '%s': %s\n",my_progname, db,
|
|
|
|
mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
count= 0;
|
|
|
|
after_create= stmt;
|
|
|
|
|
|
|
|
limit_not_met:
|
|
|
|
for (ptr= after_create; ptr && ptr->length; ptr= ptr->next, count++)
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2007-03-12 18:25:11 +01:00
|
|
|
if (auto_generate_sql && ( auto_generate_sql_number == count))
|
|
|
|
break;
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
if (engine_stmt && engine_stmt->option && ptr->type == CREATE_TABLE_TYPE)
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2007-03-16 07:39:07 +01:00
|
|
|
char buffer[HUGE_STRING_LENGTH];
|
|
|
|
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
snprintf(buffer, HUGE_STRING_LENGTH, "%s Engine = %s %s",
|
|
|
|
ptr->string, engine_stmt->string, engine_stmt->option);
|
|
|
|
if (run_query(mysql, buffer, strlen(buffer)))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (engine_stmt && engine_stmt->string && ptr->type == CREATE_TABLE_TYPE)
|
|
|
|
{
|
|
|
|
char buffer[HUGE_STRING_LENGTH];
|
|
|
|
|
|
|
|
snprintf(buffer, HUGE_STRING_LENGTH, "%s Engine = %s",
|
|
|
|
ptr->string, engine_stmt->string);
|
2007-03-16 07:39:07 +01:00
|
|
|
if (run_query(mysql, buffer, strlen(buffer)))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (run_query(mysql, ptr->string, ptr->length))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
if (auto_generate_sql && (auto_generate_sql_number > count ))
|
|
|
|
{
|
|
|
|
/* Special case for auto create, we don't want to create tables twice */
|
|
|
|
after_create= stmt->next;
|
|
|
|
goto limit_not_met;
|
|
|
|
}
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2005-12-25 11:03:53 +01:00
|
|
|
drop_schema(MYSQL *mysql, const char *db)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
|
|
|
char query[HUGE_STRING_LENGTH];
|
2006-04-11 22:04:08 +02:00
|
|
|
int len;
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_ENTER("drop_schema");
|
2006-04-11 22:04:08 +02:00
|
|
|
len= snprintf(query, HUGE_STRING_LENGTH, "DROP SCHEMA IF EXISTS `%s`", db);
|
|
|
|
|
|
|
|
if (run_query(mysql, query, len))
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2006-04-11 22:04:08 +02:00
|
|
|
fprintf(stderr,"%s: Cannot drop database '%s' ERROR : %s\n",
|
|
|
|
my_progname, db, mysql_error(mysql));
|
|
|
|
exit(1);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2006-04-11 22:04:08 +02:00
|
|
|
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
2007-03-26 11:24:49 +02:00
|
|
|
static int
|
|
|
|
run_statements(MYSQL *mysql, statement *stmt)
|
|
|
|
{
|
|
|
|
statement *ptr;
|
2007-09-05 05:03:12 +02:00
|
|
|
MYSQL_RES *result;
|
2007-03-26 11:24:49 +02:00
|
|
|
DBUG_ENTER("run_statements");
|
|
|
|
|
|
|
|
for (ptr= stmt; ptr && ptr->length; ptr= ptr->next)
|
|
|
|
{
|
|
|
|
if (run_query(mysql, ptr->string, ptr->length))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
|
|
|
|
exit(1);
|
|
|
|
}
|
2007-09-05 05:03:12 +02:00
|
|
|
if (mysql_field_count(mysql))
|
|
|
|
{
|
|
|
|
result= mysql_store_result(mysql);
|
|
|
|
mysql_free_result(result);
|
|
|
|
}
|
2007-03-26 11:24:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
static int
|
|
|
|
run_scheduler(stats *sptr, statement *stmts, uint concur, ulonglong limit)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
|
|
|
uint x;
|
2005-12-29 03:41:06 +01:00
|
|
|
struct timeval start_time, end_time;
|
2006-01-12 06:30:52 +01:00
|
|
|
thread_context con;
|
2007-03-22 08:43:14 +01:00
|
|
|
pthread_t mainthread; /* Thread descriptor */
|
|
|
|
pthread_attr_t attr; /* Thread attributes */
|
2005-12-29 21:29:02 +01:00
|
|
|
DBUG_ENTER("run_scheduler");
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2006-01-12 06:30:52 +01:00
|
|
|
con.stmt= stmts;
|
|
|
|
con.limit= limit;
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2007-03-18 18:06:28 +01:00
|
|
|
pthread_attr_init(&attr);
|
|
|
|
pthread_attr_setdetachstate(&attr,
|
|
|
|
PTHREAD_CREATE_DETACHED);
|
2006-01-02 01:40:02 +01:00
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_lock(&counter_mutex);
|
|
|
|
thread_counter= 0;
|
2006-01-12 06:30:52 +01:00
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_lock(&sleeper_mutex);
|
|
|
|
master_wakeup= 1;
|
|
|
|
pthread_mutex_unlock(&sleeper_mutex);
|
|
|
|
for (x= 0; x < concur; x++)
|
2006-01-12 06:30:52 +01:00
|
|
|
{
|
2007-03-26 11:24:49 +02:00
|
|
|
/* now you create the thread */
|
2007-03-18 18:06:28 +01:00
|
|
|
if (pthread_create(&mainthread, &attr, run_task,
|
2007-03-16 23:20:22 +01:00
|
|
|
(void *)&con) != 0)
|
2006-01-12 06:30:52 +01:00
|
|
|
{
|
2007-03-16 23:20:22 +01:00
|
|
|
fprintf(stderr,"%s: Could not create thread\n",
|
|
|
|
my_progname);
|
|
|
|
exit(0);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-16 23:20:22 +01:00
|
|
|
thread_counter++;
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_unlock(&counter_mutex);
|
2007-03-18 18:06:28 +01:00
|
|
|
pthread_attr_destroy(&attr);
|
2006-01-12 06:30:52 +01:00
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_lock(&sleeper_mutex);
|
|
|
|
master_wakeup= 0;
|
|
|
|
pthread_cond_broadcast(&sleep_threshhold);
|
2014-07-25 15:02:47 +02:00
|
|
|
pthread_mutex_unlock(&sleeper_mutex);
|
2005-12-29 03:41:06 +01:00
|
|
|
|
|
|
|
gettimeofday(&start_time, NULL);
|
|
|
|
|
2006-01-12 21:27:25 +01:00
|
|
|
/*
|
2007-03-16 23:20:22 +01:00
|
|
|
We loop until we know that all children have cleaned up.
|
2006-01-12 21:27:25 +01:00
|
|
|
*/
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_lock(&counter_mutex);
|
|
|
|
while (thread_counter)
|
2006-01-12 06:30:52 +01:00
|
|
|
{
|
2007-03-16 23:20:22 +01:00
|
|
|
struct timespec abstime;
|
|
|
|
|
|
|
|
set_timespec(abstime, 3);
|
|
|
|
pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_unlock(&counter_mutex);
|
|
|
|
|
2005-12-29 03:41:06 +01:00
|
|
|
gettimeofday(&end_time, NULL);
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2006-01-12 21:27:25 +01:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
sptr->timing= timedif(end_time, start_time);
|
|
|
|
sptr->users= concur;
|
|
|
|
sptr->rows= limit;
|
|
|
|
|
|
|
|
DBUG_RETURN(0);
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2006-07-27 10:54:04 +02:00
|
|
|
|
2007-03-17 03:05:11 +01:00
|
|
|
pthread_handler_t run_task(void *p)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2006-01-02 01:40:02 +01:00
|
|
|
ulonglong counter= 0, queries;
|
2007-10-19 00:08:27 +02:00
|
|
|
ulonglong detach_counter;
|
|
|
|
unsigned int commit_counter;
|
2006-02-19 18:41:59 +01:00
|
|
|
MYSQL *mysql;
|
2005-11-30 01:02:21 +01:00
|
|
|
MYSQL_RES *result;
|
|
|
|
MYSQL_ROW row;
|
2006-01-02 01:40:02 +01:00
|
|
|
statement *ptr;
|
2007-03-17 03:05:11 +01:00
|
|
|
thread_context *con= (thread_context *)p;
|
2005-11-30 01:02:21 +01:00
|
|
|
|
|
|
|
DBUG_ENTER("run_task");
|
2006-04-11 23:24:06 +02:00
|
|
|
DBUG_PRINT("info", ("task script \"%s\"", con->stmt ? con->stmt->string : ""));
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2007-03-16 23:20:22 +01:00
|
|
|
pthread_mutex_lock(&sleeper_mutex);
|
|
|
|
while (master_wakeup)
|
|
|
|
{
|
|
|
|
pthread_cond_wait(&sleep_threshhold, &sleeper_mutex);
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock(&sleeper_mutex);
|
|
|
|
|
2015-11-29 16:51:23 +01:00
|
|
|
if (mysql_thread_init())
|
2007-03-12 18:25:11 +01:00
|
|
|
{
|
2015-11-29 16:51:23 +01:00
|
|
|
fprintf(stderr,"%s: mysql_thread_init() failed\n", my_progname);
|
2007-03-12 18:25:11 +01:00
|
|
|
exit(0);
|
|
|
|
}
|
2006-02-19 18:41:59 +01:00
|
|
|
|
2015-11-29 16:51:23 +01:00
|
|
|
if (!(mysql= mysql_init(NULL)))
|
2007-03-12 18:25:11 +01:00
|
|
|
{
|
2015-11-29 16:51:23 +01:00
|
|
|
fprintf(stderr,"%s: mysql_init() failed\n", my_progname);
|
|
|
|
mysql_thread_end();
|
2007-03-12 18:25:11 +01:00
|
|
|
exit(0);
|
|
|
|
}
|
2005-11-30 01:02:21 +01:00
|
|
|
|
2015-11-29 16:51:23 +01:00
|
|
|
set_mysql_connect_options(mysql);
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_PRINT("info", ("trying to connect to host %s as user %s", host, user));
|
2007-03-16 23:20:22 +01:00
|
|
|
|
2006-03-02 10:48:54 +01:00
|
|
|
if (!opt_only_print)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-06-16 02:22:57 +02:00
|
|
|
if (slap_connect(mysql))
|
2006-02-19 18:41:59 +01:00
|
|
|
goto end;
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
2007-06-16 02:22:57 +02:00
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_PRINT("info", ("connected."));
|
2006-04-11 22:04:08 +02:00
|
|
|
if (verbose >= 3)
|
2007-03-12 18:25:11 +01:00
|
|
|
printf("connected!\n");
|
2006-03-02 10:48:54 +01:00
|
|
|
queries= 0;
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2007-10-19 00:08:27 +02:00
|
|
|
commit_counter= 0;
|
|
|
|
if (commit_rate)
|
|
|
|
run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
|
|
|
|
|
2005-12-29 03:41:06 +01:00
|
|
|
limit_not_met:
|
2007-10-19 00:08:27 +02:00
|
|
|
for (ptr= con->stmt, detach_counter= 0;
|
2007-06-16 02:22:57 +02:00
|
|
|
ptr && ptr->length;
|
2007-10-19 00:08:27 +02:00
|
|
|
ptr= ptr->next, detach_counter++)
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-10-19 00:08:27 +02:00
|
|
|
if (!opt_only_print && detach_rate && !(detach_counter % detach_rate))
|
2007-06-16 02:22:57 +02:00
|
|
|
{
|
|
|
|
mysql_close(mysql);
|
|
|
|
|
2007-08-20 22:03:50 +02:00
|
|
|
if (!(mysql= mysql_init(NULL)))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: mysql_init() failed ERROR : %s\n",
|
|
|
|
my_progname, mysql_error(mysql));
|
|
|
|
exit(0);
|
|
|
|
}
|
2007-06-16 02:22:57 +02:00
|
|
|
if (slap_connect(mysql))
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2007-03-07 02:14:59 +01:00
|
|
|
/*
|
|
|
|
We have to execute differently based on query type. This should become a function.
|
|
|
|
*/
|
2007-03-12 18:25:11 +01:00
|
|
|
if ((ptr->type == UPDATE_TYPE_REQUIRES_PREFIX) ||
|
|
|
|
(ptr->type == SELECT_TYPE_REQUIRES_PREFIX))
|
2005-11-30 01:02:21 +01:00
|
|
|
{
|
2007-03-07 02:14:59 +01:00
|
|
|
int length;
|
2007-03-13 08:56:30 +01:00
|
|
|
unsigned int key_val;
|
2007-03-12 18:25:11 +01:00
|
|
|
char *key;
|
|
|
|
char buffer[HUGE_STRING_LENGTH];
|
2007-03-07 02:14:59 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
/*
|
|
|
|
This should only happen if some sort of new engine was
|
|
|
|
implemented that didn't properly handle UPDATEs.
|
|
|
|
|
|
|
|
Just in case someone runs this under an experimental engine we don't
|
|
|
|
want a crash so the if() is placed here.
|
|
|
|
*/
|
|
|
|
DBUG_ASSERT(primary_keys_number_of);
|
|
|
|
if (primary_keys_number_of)
|
2007-03-07 02:14:59 +01:00
|
|
|
{
|
2007-03-13 08:56:30 +01:00
|
|
|
key_val= (unsigned int)(random() % primary_keys_number_of);
|
2007-03-12 18:25:11 +01:00
|
|
|
key= primary_keys[key_val];
|
|
|
|
|
|
|
|
DBUG_ASSERT(key);
|
|
|
|
|
|
|
|
length= snprintf(buffer, HUGE_STRING_LENGTH, "%.*s '%s'",
|
|
|
|
(int)ptr->length, ptr->string, key);
|
|
|
|
|
|
|
|
if (run_query(mysql, buffer, length))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)length, buffer, mysql_error(mysql));
|
|
|
|
exit(0);
|
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
2005-12-25 00:41:40 +01:00
|
|
|
}
|
2007-03-07 02:14:59 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (run_query(mysql, ptr->string, ptr->length))
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
|
|
|
|
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
|
2007-03-12 18:25:11 +01:00
|
|
|
exit(0);
|
2007-03-07 02:14:59 +01:00
|
|
|
}
|
2005-12-25 00:41:40 +01:00
|
|
|
}
|
2007-03-12 18:25:11 +01:00
|
|
|
|
2007-09-17 18:39:07 +02:00
|
|
|
do
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
2007-09-17 18:39:07 +02:00
|
|
|
if (mysql_field_count(mysql))
|
|
|
|
{
|
2011-01-13 11:26:42 +01:00
|
|
|
if (!(result= mysql_store_result(mysql)))
|
|
|
|
fprintf(stderr, "%s: Error when storing result: %d %s\n",
|
|
|
|
my_progname, mysql_errno(mysql), mysql_error(mysql));
|
|
|
|
else
|
2008-12-02 16:29:59 +01:00
|
|
|
{
|
2011-01-13 11:26:42 +01:00
|
|
|
while ((row= mysql_fetch_row(result)))
|
2008-12-02 16:29:59 +01:00
|
|
|
counter++;
|
|
|
|
mysql_free_result(result);
|
|
|
|
}
|
2007-09-17 18:39:07 +02:00
|
|
|
}
|
|
|
|
} while(mysql_next_result(mysql) == 0);
|
2005-12-29 03:41:06 +01:00
|
|
|
queries++;
|
|
|
|
|
2007-10-19 00:08:27 +02:00
|
|
|
if (commit_rate && (++commit_counter == commit_rate))
|
|
|
|
{
|
|
|
|
commit_counter= 0;
|
2007-06-16 02:22:57 +02:00
|
|
|
run_query(mysql, "COMMIT", strlen("COMMIT"));
|
2007-10-19 00:08:27 +02:00
|
|
|
}
|
2007-06-16 02:22:57 +02:00
|
|
|
|
2006-01-12 06:30:52 +01:00
|
|
|
if (con->limit && queries == con->limit)
|
2006-02-19 18:41:59 +01:00
|
|
|
goto end;
|
2005-11-30 01:02:21 +01:00
|
|
|
}
|
|
|
|
|
2007-01-29 22:17:30 +01:00
|
|
|
if (con->limit && queries < con->limit)
|
2006-04-11 22:23:16 +02:00
|
|
|
goto limit_not_met;
|
2005-12-29 03:41:06 +01:00
|
|
|
|
2006-02-19 18:41:59 +01:00
|
|
|
end:
|
2007-06-16 02:22:57 +02:00
|
|
|
if (commit_rate)
|
|
|
|
run_query(mysql, "COMMIT", strlen("COMMIT"));
|
2006-02-19 18:41:59 +01:00
|
|
|
|
2015-11-29 16:51:23 +01:00
|
|
|
mysql_close(mysql);
|
2005-12-29 03:41:06 +01:00
|
|
|
|
Fix bug#46980
Option "--without-server" still not working in 5.1
The general approach is to make sure that source files
which require thread support are only compiled if the build
really needs thread support,
which means when the server is built or a thread-safe client
library.
This required several changes:
- Make sure the subdirectories "storage/" and "plugin/" are
only processed if the server is built, not ifclient-only.
- Make the compilation of some modules which inherently
require threading depend on thread supportin the build.
- Separate the handling of threading in "configure.in" from
that of server issues, threading is also needed in a
non-server build of a thread-safe client library.
Also, "libdbug" must get built even in a client-only build,
so "dbug/" must be in the list of client directories.
In addition, calls to thread functions in source files which
can be built without thread support must use the wrapper
functions which handle the non-threaded build.
So the modules "client/mysqlimport.c" and "client/mysqlslap.c"
must call "my_thread_end()" only via "mysql_thread_end()".
Makefile.am:
The directories "storage/" and "plugin/" contain files
which are needed for the server only, so their contents
is to be built only if a server is built.
They must not be named unconditionally, because building
their contents will fail unless threads are enabled.
These directories are now listed in the "configure"
variable "sql_server_dirs" which becomes part of
"sql_union_dirs" if the server is to be built.
client/mysqlimport.c:
Use the wrapper function "mysql_thread_end()" which
correctly handles the case of a non-threaded build.
client/mysqlslap.c:
Use the wrapper function "mysql_thread_end()" which
correctly handles the case of a non-threaded build.
configure.in:
Various changes to support builds "--without-server":
1) For the unit tests, we need "libdbug".
2) Separate the treatment of the server from that of the
thread-safe client library.
3) Introduce an "automake conditional" "NEED_THREAD"
which can be checked in some "Makefile.am".
4) Include "storage/" and "plugin/" in the list of
"sql_server_dirs" so that they are handled in the
top "Makefile.am" only if the server is to be built
(see the change in that file).
mysys/Makefile.am:
The code of "mf_keycache.c" in 5.1 is no longer safe
to be built without thread support.
(In 5.0, this was possible.)
Rather than fix these issues, which is tedious and risky,
avoid the need to ever build it without thread support:
It is needed in the server only, which needs thread support.
The only case where we build a "libmysys" without thread
support is for a non-threaded client, where "mf_keycache"
is not neded.
So its inclusion in the list of source files can depend
on the new conditional "NEED_THREAD".
unittest/mysys/Makefile.am:
Test program "my_atomic-t" is to verify the correct handling
of threads only, it cannot be built without thread support
and is not needed in such cases either.
Let its build depend on the new conditional "NEED_THREAD".
2009-09-17 18:34:24 +02:00
|
|
|
mysql_thread_end();
|
2007-03-16 23:20:22 +01:00
|
|
|
|
|
|
|
pthread_mutex_lock(&counter_mutex);
|
|
|
|
thread_counter--;
|
|
|
|
pthread_cond_signal(&count_threshhold);
|
|
|
|
pthread_mutex_unlock(&counter_mutex);
|
|
|
|
|
2005-11-30 01:02:21 +01:00
|
|
|
DBUG_RETURN(0);
|
|
|
|
}
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2015-06-04 08:23:17 +02:00
|
|
|
int
|
2007-03-16 07:39:07 +01:00
|
|
|
parse_option(const char *origin, option_string **stmt, char delm)
|
|
|
|
{
|
|
|
|
char *retstr;
|
|
|
|
char *ptr= (char *)origin;
|
|
|
|
option_string **sptr= stmt;
|
|
|
|
option_string *tmp;
|
2009-02-13 17:41:47 +01:00
|
|
|
size_t length= strlen(origin);
|
2007-03-16 07:39:07 +01:00
|
|
|
uint count= 0; /* We know that there is always one */
|
|
|
|
|
|
|
|
for (tmp= *sptr= (option_string *)my_malloc(sizeof(option_string),
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2007-03-16 07:39:07 +01:00
|
|
|
(retstr= strchr(ptr, delm));
|
|
|
|
tmp->next= (option_string *)my_malloc(sizeof(option_string),
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME)),
|
2007-03-16 07:39:07 +01:00
|
|
|
tmp= tmp->next)
|
|
|
|
{
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
/*
|
|
|
|
Initialize buffer, because otherwise an
|
|
|
|
--engine=<storage_engine>:<option>,<eng1>,<eng2>
|
|
|
|
will crash.
|
|
|
|
*/
|
|
|
|
char buffer[HUGE_STRING_LENGTH]= "";
|
2007-03-16 07:39:07 +01:00
|
|
|
char *buffer_ptr;
|
|
|
|
|
2015-06-04 08:23:17 +02:00
|
|
|
/*
|
|
|
|
Return an error if the length of the any of the comma seprated value
|
|
|
|
exceeds HUGE_STRING_LENGTH.
|
|
|
|
*/
|
|
|
|
if ((size_t)(retstr - ptr) > HUGE_STRING_LENGTH)
|
|
|
|
return -1;
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
count++;
|
|
|
|
strncpy(buffer, ptr, (size_t)(retstr - ptr));
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
/*
|
|
|
|
Handle --engine=memory:max_row=200 cases, or more general speaking
|
|
|
|
--engine=<storage_engine>:<options>, which will be translated to
|
|
|
|
Engine = storage_engine option.
|
|
|
|
*/
|
2007-03-16 07:39:07 +01:00
|
|
|
if ((buffer_ptr= strchr(buffer, ':')))
|
|
|
|
{
|
|
|
|
char *option_ptr;
|
|
|
|
|
|
|
|
tmp->length= (size_t)(buffer_ptr - buffer);
|
2007-03-17 07:50:48 +01:00
|
|
|
tmp->string= my_strndup(ptr, (uint)tmp->length, MYF(MY_FAE));
|
2007-03-16 07:39:07 +01:00
|
|
|
|
|
|
|
option_ptr= ptr + 1 + tmp->length;
|
|
|
|
|
|
|
|
/* Move past the : and the first string */
|
|
|
|
tmp->option_length= (size_t)(retstr - option_ptr);
|
2007-03-17 07:50:48 +01:00
|
|
|
tmp->option= my_strndup(option_ptr, (uint)tmp->option_length,
|
2007-03-16 07:39:07 +01:00
|
|
|
MYF(MY_FAE));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tmp->string= my_strndup(ptr, (size_t)(retstr - ptr), MYF(MY_FAE));
|
|
|
|
tmp->length= (size_t)(retstr - ptr);
|
|
|
|
}
|
|
|
|
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
/* Skip delimiter delm */
|
2007-03-16 07:39:07 +01:00
|
|
|
ptr+= retstr - ptr + 1;
|
|
|
|
if (isspace(*ptr))
|
|
|
|
ptr++;
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
if (ptr != origin + length)
|
2007-03-16 07:39:07 +01:00
|
|
|
{
|
|
|
|
char *origin_ptr;
|
|
|
|
|
2015-06-04 08:23:17 +02:00
|
|
|
/*
|
|
|
|
Return an error if the length of the any of the comma seprated value
|
|
|
|
exceeds HUGE_STRING_LENGTH.
|
|
|
|
*/
|
|
|
|
if (strlen(ptr) > HUGE_STRING_LENGTH)
|
|
|
|
return -1;
|
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
if ((origin_ptr= strchr(ptr, ':')))
|
|
|
|
{
|
|
|
|
char *option_ptr;
|
|
|
|
|
|
|
|
tmp->length= (size_t)(origin_ptr - ptr);
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
tmp->string= my_strndup(ptr, tmp->length, MYF(MY_FAE));
|
2007-03-16 07:39:07 +01:00
|
|
|
|
|
|
|
option_ptr= (char *)ptr + 1 + tmp->length;
|
|
|
|
|
|
|
|
/* Move past the : and the first string */
|
2015-06-04 08:23:17 +02:00
|
|
|
tmp->option_length= strlen(option_ptr);
|
2007-03-16 07:39:07 +01:00
|
|
|
tmp->option= my_strndup(option_ptr, tmp->option_length,
|
|
|
|
MYF(MY_FAE));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-06-04 08:23:17 +02:00
|
|
|
tmp->length= strlen(ptr);
|
2007-03-16 07:39:07 +01:00
|
|
|
tmp->string= my_strndup(ptr, tmp->length, MYF(MY_FAE));
|
|
|
|
}
|
|
|
|
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
2005-12-25 11:03:53 +01:00
|
|
|
|
|
|
|
uint
|
|
|
|
parse_delimiter(const char *script, statement **stmt, char delm)
|
2005-12-25 00:41:40 +01:00
|
|
|
{
|
|
|
|
char *retstr;
|
|
|
|
char *ptr= (char *)script;
|
|
|
|
statement **sptr= stmt;
|
|
|
|
statement *tmp;
|
|
|
|
uint length= strlen(script);
|
2006-01-02 01:35:30 +01:00
|
|
|
uint count= 0; /* We know that there is always one */
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2007-03-12 18:25:11 +01:00
|
|
|
for (tmp= *sptr= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2005-12-25 11:03:53 +01:00
|
|
|
(retstr= strchr(ptr, delm));
|
2007-03-12 18:25:11 +01:00
|
|
|
tmp->next= (statement *)my_malloc(sizeof(statement),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME)),
|
2005-12-25 00:41:40 +01:00
|
|
|
tmp= tmp->next)
|
|
|
|
{
|
2005-12-25 11:03:53 +01:00
|
|
|
count++;
|
2007-03-17 07:50:48 +01:00
|
|
|
tmp->string= my_strndup(ptr, (uint)(retstr - ptr), MYF(MY_FAE));
|
2005-12-25 11:03:53 +01:00
|
|
|
tmp->length= (size_t)(retstr - ptr);
|
|
|
|
ptr+= retstr - ptr + 1;
|
2005-12-25 00:41:40 +01:00
|
|
|
if (isspace(*ptr))
|
|
|
|
ptr++;
|
2005-12-25 11:03:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ptr != script+length)
|
|
|
|
{
|
2007-03-17 07:50:48 +01:00
|
|
|
tmp->string= my_strndup(ptr, (uint)((script + length) - ptr),
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
MYF(MY_FAE));
|
2005-12-25 11:03:53 +01:00
|
|
|
tmp->length= (size_t)((script + length) - ptr);
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint
|
|
|
|
parse_comma(const char *string, uint **range)
|
|
|
|
{
|
2006-01-02 01:35:30 +01:00
|
|
|
uint count= 1,x; /* We know that there is always one */
|
2005-12-25 11:03:53 +01:00
|
|
|
char *retstr;
|
|
|
|
char *ptr= (char *)string;
|
|
|
|
uint *nptr;
|
|
|
|
|
|
|
|
for (;*ptr; ptr++)
|
|
|
|
if (*ptr == ',') count++;
|
|
|
|
|
2006-01-02 01:35:30 +01:00
|
|
|
/* One extra spot for the NULL */
|
2007-03-12 18:25:11 +01:00
|
|
|
nptr= *range= (uint *)my_malloc(sizeof(uint) * (count + 1),
|
|
|
|
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
|
2005-12-25 11:03:53 +01:00
|
|
|
|
|
|
|
ptr= (char *)string;
|
|
|
|
x= 0;
|
|
|
|
while ((retstr= strchr(ptr,',')))
|
|
|
|
{
|
|
|
|
nptr[x++]= atoi(ptr);
|
|
|
|
ptr+= retstr - ptr + 1;
|
2005-12-25 00:41:40 +01:00
|
|
|
}
|
2005-12-25 11:03:53 +01:00
|
|
|
nptr[x++]= atoi(ptr);
|
2005-12-25 00:41:40 +01:00
|
|
|
|
2005-12-25 11:03:53 +01:00
|
|
|
return count;
|
2005-12-25 00:41:40 +01:00
|
|
|
}
|
2006-01-02 01:40:02 +01:00
|
|
|
|
|
|
|
void
|
|
|
|
print_conclusions(conclusions *con)
|
|
|
|
{
|
|
|
|
printf("Benchmark\n");
|
|
|
|
if (con->engine)
|
|
|
|
printf("\tRunning for engine %s\n", con->engine);
|
|
|
|
printf("\tAverage number of seconds to run all queries: %ld.%03ld seconds\n",
|
|
|
|
con->avg_timing / 1000, con->avg_timing % 1000);
|
|
|
|
printf("\tMinimum number of seconds to run all queries: %ld.%03ld seconds\n",
|
|
|
|
con->min_timing / 1000, con->min_timing % 1000);
|
|
|
|
printf("\tMaximum number of seconds to run all queries: %ld.%03ld seconds\n",
|
|
|
|
con->max_timing / 1000, con->max_timing % 1000);
|
|
|
|
printf("\tNumber of clients running queries: %d\n", con->users);
|
|
|
|
printf("\tAverage number of queries per client: %llu\n", con->avg_rows);
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
print_conclusions_csv(conclusions *con)
|
|
|
|
{
|
|
|
|
char buffer[HUGE_STRING_LENGTH];
|
2007-03-16 07:39:07 +01:00
|
|
|
const char *ptr= auto_generate_sql_type ? auto_generate_sql_type : "query";
|
Fix for
mysqlslap: setting --engine does not get replicated
http://bugs.mysql.com/bug.php?id=46967
and
mysqlslap: specifying --engine and --create does not
work with --engine=<storage_engine>:<option>
https://bugs.launchpad.net/maria/+bug/429773
Problems were that an --engine=<storage_engine> was translated
to a "set storage_engine = <storage_engine>", wich is _not_
replicated. A --engine=<storage_engine>:<option> was not always
properly parsed and in some cases crashed.
Fixed by eliminating "set storage_engine = ..." and adding
proper DDL generation. Initialized an unitialized buffer to
prevent crashes and fixed to use proper pointer for in
case of --engine=<storage_engine>:<option> being the last
element in list of --engines.
Also cleaned up code for better readability.
Q: Should MySQL's replication actually replicate a
"set storage_engine = ..." command or not?
A: No it should not. It is documented here:
http://dev.mysql.com/doc/refman/5.1/en/replication-features-variables.html
...
"The storage_engine system variable is not replicated, which is a
good thing for replication between different storage engines." ...
Before the patch, mysqlslap was behaving this way:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| Before patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | Not OK |
| 1.2 | eng1,eng2 | OK | Not OK |
| 1.3 | eng1,eng2,eng3 | OK | Not OK |
| 1.4 | memory:option | OK | Not OK |
| 1.5 | memory:option,eng1 | OK | Not OK |
| 1.6 | eng1,memory:option | Not OK | Not OK |
| 1.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 1.8 | eng1,memory:option,eng2 | OK | Not OK |
| 1.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | Not OK |
| 2.2 | eng1,eng2 | OK | Not OK |
| 2.3 | eng1,eng2,eng3 | OK | Not OK |
| 2.4 | memory:option | Not OK | Not OK |
| 2.5 | memory:option,eng1 | Not OK | Not OK |
| 2.6 | eng1,memory:option | Not OK | Not OK |
| 2.7 | memory:option,eng1,eng2 | Crash | Not OK |
| 2.8 | eng1,memory:option,eng2 | Not OK | Not OK |
| 2.9 | eng1,eng2,memory:option | Not OK | Not OK |
+-----+-------------------------+--------+-------------+
After my final patch, mysqlslap now runs like this:
+-------------------------------+--------+-------------+
| | single | replication |
+-------------------------------+--------+-------------+
| After third patch |
+-------------------------------+--------+-------------+
| --engine[1] |
+-----+-------------------------+--------+-------------+
| 1.1 | eng1 | OK | OK |
| 1.2 | eng1,eng2 | OK | OK |
| 1.3 | eng1,eng2,eng3 | OK | OK |
| 1.4 | memory:option | OK | OK |
| 1.5 | memory:option,eng1 | OK | OK |
| 1.6 | eng1,memory:option | OK | OK |
| 1.7 | memory:option,eng1,eng2 | OK | OK |
| 1.8 | eng1,memory:option,eng2 | OK | OK |
| 1.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
+-------------------------------+--------+-------------+
| --create --engine[2] |
+-----+-------------------------+--------+-------------+
| 2.1 | eng1 | OK | OK |
| 2.2 | eng1,eng2 | OK | OK |
| 2.3 | eng1,eng2,eng3 | OK | OK |
| 2.4 | memory:option | OK | OK |
| 2.5 | memory:option,eng1 | OK | OK |
| 2.6 | eng1,memory:option | OK | OK |
| 2.7 | memory:option,eng1,eng2 | OK | OK |
| 2.8 | eng1,memory:option,eng2 | OK | OK |
| 2.9 | eng1,eng2,memory:option | OK | OK |
+-----+-------------------------+--------+-------------+
2009-09-18 05:30:54 +02:00
|
|
|
|
2006-01-02 01:40:02 +01:00
|
|
|
snprintf(buffer, HUGE_STRING_LENGTH,
|
2007-03-16 07:39:07 +01:00
|
|
|
"%s,%s,%ld.%03ld,%ld.%03ld,%ld.%03ld,%d,%llu\n",
|
2006-01-02 05:27:24 +01:00
|
|
|
con->engine ? con->engine : "", /* Storage engine we ran against */
|
2007-03-16 07:39:07 +01:00
|
|
|
ptr, /* Load type */
|
2006-01-02 05:27:24 +01:00
|
|
|
con->avg_timing / 1000, con->avg_timing % 1000, /* Time to load */
|
|
|
|
con->min_timing / 1000, con->min_timing % 1000, /* Min time */
|
|
|
|
con->max_timing / 1000, con->max_timing % 1000, /* Max time */
|
|
|
|
con->users, /* Children used */
|
|
|
|
con->avg_rows /* Queries run */
|
2006-01-02 01:40:02 +01:00
|
|
|
);
|
2007-08-13 15:11:25 +02:00
|
|
|
my_write(csv_file, (uchar*) buffer, (uint)strlen(buffer), MYF(0));
|
2006-01-02 01:40:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2007-03-16 07:39:07 +01:00
|
|
|
generate_stats(conclusions *con, option_string *eng, stats *sptr)
|
2006-01-02 01:40:02 +01:00
|
|
|
{
|
|
|
|
stats *ptr;
|
2007-03-12 18:25:11 +01:00
|
|
|
unsigned int x;
|
2006-01-02 01:40:02 +01:00
|
|
|
|
|
|
|
con->min_timing= sptr->timing;
|
|
|
|
con->max_timing= sptr->timing;
|
|
|
|
con->min_rows= sptr->rows;
|
|
|
|
con->max_rows= sptr->rows;
|
|
|
|
|
2006-01-02 05:27:24 +01:00
|
|
|
/* At the moment we assume uniform */
|
2006-01-02 01:40:02 +01:00
|
|
|
con->users= sptr->users;
|
|
|
|
con->avg_rows= sptr->rows;
|
|
|
|
|
2006-01-02 05:27:24 +01:00
|
|
|
/* With no next, we know it is the last element that was malloced */
|
2006-01-03 11:09:18 +01:00
|
|
|
for (ptr= sptr, x= 0; x < iterations; ptr++, x++)
|
2006-01-02 01:40:02 +01:00
|
|
|
{
|
|
|
|
con->avg_timing+= ptr->timing;
|
|
|
|
|
|
|
|
if (ptr->timing > con->max_timing)
|
|
|
|
con->max_timing= ptr->timing;
|
|
|
|
if (ptr->timing < con->min_timing)
|
|
|
|
con->min_timing= ptr->timing;
|
|
|
|
}
|
|
|
|
con->avg_timing= con->avg_timing/iterations;
|
|
|
|
|
|
|
|
if (eng && eng->string)
|
|
|
|
con->engine= eng->string;
|
|
|
|
else
|
|
|
|
con->engine= NULL;
|
|
|
|
}
|
2006-01-02 05:08:45 +01:00
|
|
|
|
2007-03-16 07:39:07 +01:00
|
|
|
void
|
|
|
|
option_cleanup(option_string *stmt)
|
|
|
|
{
|
|
|
|
option_string *ptr, *nptr;
|
|
|
|
if (!stmt)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (ptr= stmt; ptr; ptr= nptr)
|
|
|
|
{
|
|
|
|
nptr= ptr->next;
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(ptr->string);
|
|
|
|
my_free(ptr->option);
|
|
|
|
my_free(ptr);
|
2007-03-16 07:39:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-02 05:08:45 +01:00
|
|
|
void
|
|
|
|
statement_cleanup(statement *stmt)
|
|
|
|
{
|
|
|
|
statement *ptr, *nptr;
|
|
|
|
if (!stmt)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for (ptr= stmt; ptr; ptr= nptr)
|
|
|
|
{
|
|
|
|
nptr= ptr->next;
|
Bug#34043: Server loops excessively in _checkchunk() when safemalloc is enabled
Essentially, the problem is that safemalloc is excruciatingly
slow as it checks all allocated blocks for overrun at each
memory management primitive, yielding a almost exponential
slowdown for the memory management functions (malloc, realloc,
free). The overrun check basically consists of verifying some
bytes of a block for certain magic keys, which catches some
simple forms of overrun. Another minor problem is violation
of aliasing rules and that its own internal list of blocks
is prone to corruption.
Another issue with safemalloc is rather the maintenance cost
as the tool has a significant impact on the server code.
Given the magnitude of memory debuggers available nowadays,
especially those that are provided with the platform malloc
implementation, maintenance of a in-house and largely obsolete
memory debugger becomes a burden that is not worth the effort
due to its slowness and lack of support for detecting more
common forms of heap corruption.
Since there are third-party tools that can provide the same
functionality at a lower or comparable performance cost, the
solution is to simply remove safemalloc. Third-party tools
can provide the same functionality at a lower or comparable
performance cost.
The removal of safemalloc also allows a simplification of the
malloc wrappers, removing quite a bit of kludge: redefinition
of my_malloc, my_free and the removal of the unused second
argument of my_free. Since free() always check whether the
supplied pointer is null, redudant checks are also removed.
Also, this patch adds unit testing for my_malloc and moves
my_realloc implementation into the same file as the other
memory allocation primitives.
client/mysqldump.c:
Pass my_free directly as its signature is compatible with the
callback type -- which wasn't the case for free_table_ent.
2010-07-08 23:20:08 +02:00
|
|
|
my_free(ptr->string);
|
|
|
|
my_free(ptr);
|
2006-01-02 05:08:45 +01:00
|
|
|
}
|
|
|
|
}
|
2007-06-16 02:22:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
slap_connect(MYSQL *mysql)
|
|
|
|
{
|
|
|
|
/* Connect to server */
|
|
|
|
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
|
|
|
int x, connect_error= 1;
|
|
|
|
for (x= 0; x < 10; x++)
|
|
|
|
{
|
2010-01-29 19:42:22 +01:00
|
|
|
set_mysql_connect_options(mysql);
|
2013-09-17 16:51:14 +02:00
|
|
|
if (opt_init_command)
|
|
|
|
mysql_options(mysql, MYSQL_INIT_COMMAND, opt_init_command);
|
2007-06-16 02:22:57 +02:00
|
|
|
if (mysql_real_connect(mysql, host, user, opt_password,
|
|
|
|
create_schema_string,
|
|
|
|
opt_mysql_port,
|
|
|
|
opt_mysql_unix_port,
|
|
|
|
connect_flags))
|
|
|
|
{
|
|
|
|
/* Connect suceeded */
|
|
|
|
connect_error= 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
my_sleep(connection_retry_sleep);
|
|
|
|
}
|
|
|
|
if (connect_error)
|
|
|
|
{
|
|
|
|
fprintf(stderr,"%s: Error when connecting to server: %d %s\n",
|
|
|
|
my_progname, mysql_errno(mysql), mysql_error(mysql));
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|