Commit 260e43e7 authored by unknown's avatar unknown

Correctly report load type.

Updated engine to also handle create options
Secondary indexes can now be generated (aka the test PeterZ thoughts!)


client/client_priv.h:
  Option for generating secondary indexes
client/mysqlslap.c:
  Option for generating secondary index operations. 
  Cleaned up memory allocation that was wasteful.
  Engine options are now possible
  Correctly report test type.
mysql-test/t/mysqlslap.test:
  Additional test for secondary indexes
sql/authors.h:
  Updated for Patrick
parent b1af9693
...@@ -61,6 +61,7 @@ enum options_client ...@@ -61,6 +61,7 @@ enum options_client
OPT_SLAP_AUTO_GENERATE_ADD_AUTO, OPT_SLAP_AUTO_GENERATE_ADD_AUTO,
OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY, OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY,
OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES, OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES,
OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES,
OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM, OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM,
OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM,
OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT, OPT_SERVER_ID, OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT, OPT_SERVER_ID,
......
...@@ -145,13 +145,22 @@ const char *auto_generate_sql_type= "mixed"; ...@@ -145,13 +145,22 @@ const char *auto_generate_sql_type= "mixed";
static unsigned long connect_flags= CLIENT_MULTI_RESULTS; static unsigned long connect_flags= CLIENT_MULTI_RESULTS;
static int verbose, num_int_cols, num_char_cols, delimiter_length; static int verbose, delimiter_length;
const char *num_int_cols_opt;
const char *num_char_cols_opt;
/* 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;
static unsigned int iterations; static unsigned int iterations;
static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME; static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME;
static ulonglong actual_queries= 0; static ulonglong actual_queries= 0;
static ulonglong auto_actual_queries; static ulonglong auto_actual_queries;
static ulonglong auto_generate_sql_unique_write_number; static ulonglong auto_generate_sql_unique_write_number;
static ulonglong auto_generate_sql_unique_query_number; static ulonglong auto_generate_sql_unique_query_number;
static unsigned int auto_generate_sql_secondary_indexes;
static ulonglong num_of_query; static ulonglong num_of_query;
static ulonglong auto_generate_sql_number; static ulonglong auto_generate_sql_number;
const char *concurrency_str= NULL; const char *concurrency_str= NULL;
...@@ -176,9 +185,21 @@ struct statement { ...@@ -176,9 +185,21 @@ struct statement {
char *string; char *string;
size_t length; size_t length;
unsigned char type; unsigned char type;
char *option;
size_t option_length;
statement *next; statement *next;
}; };
typedef struct option_string option_string;
struct option_string {
char *string;
size_t length;
char *option;
size_t option_length;
option_string *next;
};
typedef struct stats stats; typedef struct stats stats;
struct stats { struct stats {
...@@ -209,30 +230,32 @@ struct conclusions { ...@@ -209,30 +230,32 @@ struct conclusions {
unsigned long long min_rows; unsigned long long min_rows;
}; };
static option_string *engine_options= NULL;
static statement *create_statements= NULL, static statement *create_statements= NULL,
*engine_statements= NULL,
*query_statements= NULL; *query_statements= NULL;
/* Prototypes */ /* Prototypes */
void print_conclusions(conclusions *con); void print_conclusions(conclusions *con);
void print_conclusions_csv(conclusions *con); void print_conclusions_csv(conclusions *con);
void generate_stats(conclusions *con, statement *eng, stats *sptr); void generate_stats(conclusions *con, option_string *eng, stats *sptr);
uint parse_comma(const char *string, uint **range); uint parse_comma(const char *string, uint **range);
uint parse_delimiter(const char *script, statement **stmt, char delm); uint parse_delimiter(const char *script, statement **stmt, char delm);
uint parse_option(const char *origin, option_string **stmt, char delm);
static int drop_schema(MYSQL *mysql, const char *db); static int drop_schema(MYSQL *mysql, const char *db);
uint get_random_string(char *buf); uint get_random_string(char *buf);
static statement *build_table_string(void); static statement *build_table_string(void);
static statement *build_insert_string(void); static statement *build_insert_string(void);
static statement *build_update_string(void); static statement *build_update_string(void);
static statement * build_select_string(my_bool key); static statement * build_select_string(my_bool key);
static int generate_primary_key_list(MYSQL *mysql, statement *engine_stmt); static int generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt);
static int drop_primary_key_list(void); static int drop_primary_key_list(void);
static int create_schema(MYSQL *mysql, const char *db, statement *stmt, static int create_schema(MYSQL *mysql, const char *db, statement *stmt,
statement *engine_stmt); option_string *engine_stmt);
static int run_scheduler(stats *sptr, statement *stmts, uint concur, static int run_scheduler(stats *sptr, statement *stmts, uint concur,
ulonglong limit); ulonglong limit);
int run_task(thread_context *con); int run_task(thread_context *con);
void statement_cleanup(statement *stmt); void statement_cleanup(statement *stmt);
void option_cleanup(option_string *stmt);
static const char ALPHANUMERICS[]= static const char ALPHANUMERICS[]=
"0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz"; "0123456789ABCDEFGHIJKLMNOPQRSTWXYZabcdefghijklmnopqrstuvwxyz";
...@@ -268,7 +291,7 @@ int main(int argc, char **argv) ...@@ -268,7 +291,7 @@ int main(int argc, char **argv)
MYSQL mysql; MYSQL mysql;
unsigned int x; unsigned int x;
unsigned long long client_limit; unsigned long long client_limit;
statement *eptr; option_string *eptr;
#ifdef __WIN__ #ifdef __WIN__
opt_use_threads= 1; opt_use_threads= 1;
...@@ -330,7 +353,7 @@ int main(int argc, char **argv) ...@@ -330,7 +353,7 @@ int main(int argc, char **argv)
} }
/* Main iterations loop */ /* Main iterations loop */
eptr= engine_statements; eptr= engine_options;
do do
{ {
/* For the final stage we run whatever queries we were asked to run */ /* For the final stage we run whatever queries we were asked to run */
...@@ -419,8 +442,8 @@ int main(int argc, char **argv) ...@@ -419,8 +442,8 @@ int main(int argc, char **argv)
my_free((gptr)concurrency, MYF(0)); my_free((gptr)concurrency, MYF(0));
statement_cleanup(create_statements); statement_cleanup(create_statements);
statement_cleanup(engine_statements);
statement_cleanup(query_statements); statement_cleanup(query_statements);
option_cleanup(engine_options);
#ifdef HAVE_SMEM #ifdef HAVE_SMEM
if (shared_memory_base_name) if (shared_memory_base_name)
...@@ -456,9 +479,15 @@ static struct my_option my_long_options[] = ...@@ -456,9 +479,15 @@ static struct my_option my_long_options[] =
(gptr*) &auto_generate_sql_guid_primary, (gptr*) &auto_generate_sql_guid_primary,
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE, {"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE,
"Load types are mixed, update, write, or read. Default is mixed\n", "Load types are mixed, update, write, key, or read. Default is mixed\n",
(gptr*) &auto_generate_sql_type, (gptr*) &auto_generate_sql_type, (gptr*) &auto_generate_sql_type, (gptr*) &auto_generate_sql_type,
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"auto-generate-sql-secondary-indexes",
OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES,
"Number of secondary indexes to add auto-generated tables.",
(gptr*) &auto_generate_sql_secondary_indexes,
(gptr*) &auto_generate_sql_secondary_indexes, 0,
GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"auto-generate-sql-unique-query-number", {"auto-generate-sql-unique-query-number",
OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM,
"Number of unique queries auto tests", "Number of unique queries auto tests",
...@@ -510,12 +539,12 @@ static struct my_option my_long_options[] = ...@@ -510,12 +539,12 @@ static struct my_option my_long_options[] =
REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"number-char-cols", 'x', {"number-char-cols", 'x',
"Number of VARCHAR columns to create table with if specifying --auto-generate-sql ", "Number of VARCHAR columns to create table with if specifying --auto-generate-sql ",
(gptr*) &num_char_cols, (gptr*) &num_char_cols, 0, GET_UINT, REQUIRED_ARG, (gptr*) &num_char_cols_opt, (gptr*) &num_char_cols_opt, 0, GET_STR, REQUIRED_ARG,
1, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"number-int-cols", 'y', {"number-int-cols", 'y',
"Number of INT columns to create table with if specifying --auto-generate-sql.", "Number of INT columns to create table with if specifying --auto-generate-sql.",
(gptr*) &num_int_cols, (gptr*) &num_int_cols, 0, GET_UINT, REQUIRED_ARG, (gptr*) &num_int_cols_opt, (gptr*) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG,
1, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY, {"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY,
"Limit each client to this number of queries (this is not exact).", "Limit each client to this number of queries (this is not exact).",
(gptr*) &num_of_query, (gptr*) &num_of_query, 0, (gptr*) &num_of_query, (gptr*) &num_of_query, 0,
...@@ -685,12 +714,12 @@ static statement * ...@@ -685,12 +714,12 @@ static statement *
build_table_string(void) build_table_string(void)
{ {
char buf[HUGE_STRING_LENGTH]; char buf[HUGE_STRING_LENGTH];
int col_count; unsigned int col_count;
statement *ptr; statement *ptr;
DYNAMIC_STRING table_string; DYNAMIC_STRING table_string;
DBUG_ENTER("build_table_string"); DBUG_ENTER("build_table_string");
DBUG_PRINT("info", ("num int cols %d num char cols %d", DBUG_PRINT("info", ("num int cols %u num char cols %u",
num_int_cols, num_char_cols)); num_int_cols, num_char_cols));
init_dynamic_string(&table_string, "", 1024, 1024); init_dynamic_string(&table_string, "", 1024, 1024);
...@@ -699,12 +728,7 @@ build_table_string(void) ...@@ -699,12 +728,7 @@ build_table_string(void)
if (auto_generate_sql_autoincrement) if (auto_generate_sql_autoincrement)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "id serial") > HUGE_STRING_LENGTH) dynstr_append(&table_string, "id serial");
{
fprintf(stderr, "Memory Allocation error in create table\n");
exit(1);
}
dynstr_append(&table_string, buf);
if (num_int_cols || num_char_cols) if (num_int_cols || num_char_cols)
dynstr_append(&table_string, ","); dynstr_append(&table_string, ",");
...@@ -712,12 +736,29 @@ build_table_string(void) ...@@ -712,12 +736,29 @@ build_table_string(void)
if (auto_generate_sql_guid_primary) if (auto_generate_sql_guid_primary)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "id varchar(32) primary key") > HUGE_STRING_LENGTH) dynstr_append(&table_string, "id varchar(32) primary key");
if (num_int_cols || num_char_cols || auto_generate_sql_guid_primary)
dynstr_append(&table_string, ",");
}
if (auto_generate_sql_secondary_indexes)
{
unsigned int count;
for (count= 0; count < auto_generate_sql_secondary_indexes; count++)
{ {
if (count) /* Except for the first pass we add a comma */
dynstr_append(&table_string, ",");
if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(32) unique key", count)
> HUGE_STRING_LENGTH)
{
fprintf(stderr, "Memory Allocation error in create table\n"); fprintf(stderr, "Memory Allocation error in create table\n");
exit(1); exit(1);
}
dynstr_append(&table_string, buf);
} }
dynstr_append(&table_string, buf);
if (num_int_cols || num_char_cols) if (num_int_cols || num_char_cols)
dynstr_append(&table_string, ","); dynstr_append(&table_string, ",");
...@@ -726,11 +767,23 @@ build_table_string(void) ...@@ -726,11 +767,23 @@ build_table_string(void)
if (num_int_cols) if (num_int_cols)
for (col_count= 1; col_count <= num_int_cols; col_count++) for (col_count= 1; col_count <= num_int_cols; col_count++)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32)", col_count) if (num_int_cols_index)
> HUGE_STRING_LENGTH)
{ {
fprintf(stderr, "Memory Allocation error in create table\n"); if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32), INDEX(intcol%d)",
exit(1); 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);
}
} }
dynstr_append(&table_string, buf); dynstr_append(&table_string, buf);
...@@ -741,11 +794,24 @@ build_table_string(void) ...@@ -741,11 +794,24 @@ build_table_string(void)
if (num_char_cols) if (num_char_cols)
for (col_count= 1; col_count <= num_char_cols; col_count++) for (col_count= 1; col_count <= num_char_cols; col_count++)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d VARCHAR(128)", col_count) if (num_char_cols_index)
> HUGE_STRING_LENGTH)
{ {
fprintf(stderr, "Memory Allocation error in creating table\n"); if (snprintf(buf, HUGE_STRING_LENGTH,
exit(1); "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);
}
} }
dynstr_append(&table_string, buf); dynstr_append(&table_string, buf);
...@@ -759,6 +825,7 @@ build_table_string(void) ...@@ -759,6 +825,7 @@ build_table_string(void)
ptr->string = (char *)my_malloc(table_string.length+1, ptr->string = (char *)my_malloc(table_string.length+1,
MYF(MY_ZEROFILL|MY_FAE|MY_WME)); MYF(MY_ZEROFILL|MY_FAE|MY_WME));
ptr->length= table_string.length+1; ptr->length= table_string.length+1;
ptr->type= CREATE_TABLE_TYPE;
strmov(ptr->string, table_string.str); strmov(ptr->string, table_string.str);
dynstr_free(&table_string); dynstr_free(&table_string);
DBUG_RETURN(ptr); DBUG_RETURN(ptr);
...@@ -774,7 +841,7 @@ static statement * ...@@ -774,7 +841,7 @@ static statement *
build_update_string(void) build_update_string(void)
{ {
char buf[HUGE_STRING_LENGTH]; char buf[HUGE_STRING_LENGTH];
int col_count; unsigned int col_count;
statement *ptr; statement *ptr;
DYNAMIC_STRING update_string; DYNAMIC_STRING update_string;
DBUG_ENTER("build_update_string"); DBUG_ENTER("build_update_string");
...@@ -818,14 +885,7 @@ build_update_string(void) ...@@ -818,14 +885,7 @@ build_update_string(void)
} }
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary) if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
{ dynstr_append(&update_string, " WHERE id = ");
if (snprintf(buf, HUGE_STRING_LENGTH, " WHERE id = ") > HUGE_STRING_LENGTH)
{
fprintf(stderr, "Memory Allocation error in creating update_string\n");
exit(1);
}
dynstr_append(&update_string, buf);
}
ptr= (statement *)my_malloc(sizeof(statement), ptr= (statement *)my_malloc(sizeof(statement),
...@@ -854,7 +914,7 @@ static statement * ...@@ -854,7 +914,7 @@ static statement *
build_insert_string(void) build_insert_string(void)
{ {
char buf[HUGE_STRING_LENGTH]; char buf[HUGE_STRING_LENGTH];
int col_count; unsigned int col_count;
statement *ptr; statement *ptr;
DYNAMIC_STRING insert_string; DYNAMIC_STRING insert_string;
DBUG_ENTER("build_insert_string"); DBUG_ENTER("build_insert_string");
...@@ -865,12 +925,7 @@ build_insert_string(void) ...@@ -865,12 +925,7 @@ build_insert_string(void)
if (auto_generate_sql_autoincrement) if (auto_generate_sql_autoincrement)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "NULL") > HUGE_STRING_LENGTH) dynstr_append(&insert_string, "NULL");
{
fprintf(stderr, "Memory Allocation error in creating insert\n");
exit(1);
}
dynstr_append(&insert_string, buf);
if (num_int_cols || num_char_cols) if (num_int_cols || num_char_cols)
dynstr_append(&insert_string, ","); dynstr_append(&insert_string, ",");
...@@ -878,12 +933,23 @@ build_insert_string(void) ...@@ -878,12 +933,23 @@ build_insert_string(void)
if (auto_generate_sql_guid_primary) if (auto_generate_sql_guid_primary)
{ {
if (snprintf(buf, HUGE_STRING_LENGTH, "uuid()") > HUGE_STRING_LENGTH) dynstr_append(&insert_string, "uuid()");
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++)
{ {
fprintf(stderr, "Memory Allocation error in create table\n"); if (count) /* Except for the first pass we add a comma */
exit(1); dynstr_append(&insert_string, ",");
dynstr_append(&insert_string, "uuid()");
} }
dynstr_append(&insert_string, buf);
if (num_int_cols || num_char_cols) if (num_int_cols || num_char_cols)
dynstr_append(&insert_string, ","); dynstr_append(&insert_string, ",");
...@@ -939,7 +1005,7 @@ static statement * ...@@ -939,7 +1005,7 @@ static statement *
build_select_string(my_bool key) build_select_string(my_bool key)
{ {
char buf[HUGE_STRING_LENGTH]; char buf[HUGE_STRING_LENGTH];
int col_count; unsigned int col_count;
statement *ptr; statement *ptr;
static DYNAMIC_STRING query_string; static DYNAMIC_STRING query_string;
DBUG_ENTER("build_select_string"); DBUG_ENTER("build_select_string");
...@@ -1088,6 +1154,29 @@ get_options(int *argc,char ***argv) ...@@ -1088,6 +1154,29 @@ get_options(int *argc,char ***argv)
if (opt_only_print) if (opt_only_print)
opt_silent= TRUE; opt_silent= TRUE;
if (num_int_cols_opt)
{
option_string *str;
parse_option(num_int_cols_opt, &str, ',');
num_int_cols= atoi(str->string);
if (str->option)
num_int_cols_index= atoi(str->option);
option_cleanup(str);
}
if (num_char_cols_opt)
{
option_string *str;
parse_option(num_char_cols_opt, &str, ',');
num_char_cols= atoi(str->string);
if (str->option)
num_char_cols_index= atoi(str->option);
else
num_char_cols_index= 0;
option_cleanup(str);
}
if (auto_generate_sql) if (auto_generate_sql)
{ {
unsigned long long x= 0; unsigned long long x= 0;
...@@ -1253,7 +1342,7 @@ get_options(int *argc,char ***argv) ...@@ -1253,7 +1342,7 @@ get_options(int *argc,char ***argv)
printf("Parsing engines to use.\n"); printf("Parsing engines to use.\n");
if (default_engine) if (default_engine)
parse_delimiter(default_engine, &engine_statements, ','); parse_option(default_engine, &engine_options, ',');
if (tty_password) if (tty_password)
opt_password= get_tty_password(NullS); opt_password= get_tty_password(NullS);
...@@ -1276,10 +1365,8 @@ static int run_query(MYSQL *mysql, const char *query, int len) ...@@ -1276,10 +1365,8 @@ static int run_query(MYSQL *mysql, const char *query, int len)
static int static int
generate_primary_key_list(MYSQL *mysql, statement *engine_stmt) generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt)
{ {
char query[HUGE_STRING_LENGTH];
int len;
MYSQL_RES *result; MYSQL_RES *result;
MYSQL_ROW row; MYSQL_ROW row;
unsigned long long counter; unsigned long long counter;
...@@ -1301,9 +1388,7 @@ generate_primary_key_list(MYSQL *mysql, statement *engine_stmt) ...@@ -1301,9 +1388,7 @@ generate_primary_key_list(MYSQL *mysql, statement *engine_stmt)
} }
else else
{ {
len= snprintf(query, HUGE_STRING_LENGTH, "SELECT id from t1"); if (run_query(mysql, "SELECT id from t1", strlen("SELECT id from t1")))
if (run_query(mysql, query, len))
{ {
fprintf(stderr,"%s: Cannot select GUID primary keys. (%s)\n", my_progname, fprintf(stderr,"%s: Cannot select GUID primary keys. (%s)\n", my_progname,
mysql_error(mysql)); mysql_error(mysql));
...@@ -1352,7 +1437,7 @@ drop_primary_key_list(void) ...@@ -1352,7 +1437,7 @@ drop_primary_key_list(void)
static int static int
create_schema(MYSQL *mysql, const char *db, statement *stmt, create_schema(MYSQL *mysql, const char *db, statement *stmt,
statement *engine_stmt) option_string *engine_stmt)
{ {
char query[HUGE_STRING_LENGTH]; char query[HUGE_STRING_LENGTH];
statement *ptr; statement *ptr;
...@@ -1411,11 +1496,27 @@ limit_not_met: ...@@ -1411,11 +1496,27 @@ limit_not_met:
if (auto_generate_sql && ( auto_generate_sql_number == count)) if (auto_generate_sql && ( auto_generate_sql_number == count))
break; break;
if (run_query(mysql, ptr->string, ptr->length)) if (engine_stmt && engine_stmt->option && ptr->type == CREATE_TABLE_TYPE)
{ {
fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n", char buffer[HUGE_STRING_LENGTH];
my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
exit(1); snprintf(buffer, HUGE_STRING_LENGTH, "%s %s", ptr->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 (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);
}
} }
} }
...@@ -1734,6 +1835,84 @@ end: ...@@ -1734,6 +1835,84 @@ end:
DBUG_RETURN(0); DBUG_RETURN(0);
} }
uint
parse_option(const char *origin, option_string **stmt, char delm)
{
char *retstr;
char *ptr= (char *)origin;
option_string **sptr= stmt;
option_string *tmp;
uint length= strlen(origin);
uint count= 0; /* We know that there is always one */
for (tmp= *sptr= (option_string *)my_malloc(sizeof(option_string),
MYF(MY_ZEROFILL|MY_FAE|MY_WME));
(retstr= strchr(ptr, delm));
tmp->next= (option_string *)my_malloc(sizeof(option_string),
MYF(MY_ZEROFILL|MY_FAE|MY_WME)),
tmp= tmp->next)
{
char buffer[HUGE_STRING_LENGTH];
char *buffer_ptr;
count++;
strncpy(buffer, ptr, (size_t)(retstr - ptr));
if ((buffer_ptr= strchr(buffer, ':')))
{
char *option_ptr;
tmp->length= (size_t)(buffer_ptr - buffer);
tmp->string= my_strndup(ptr, tmp->length, MYF(MY_FAE));
option_ptr= ptr + 1 + tmp->length;
/* Move past the : and the first string */
tmp->option_length= (size_t)(retstr - option_ptr);
tmp->option= my_strndup(option_ptr, tmp->option_length,
MYF(MY_FAE));
}
else
{
tmp->string= my_strndup(ptr, (size_t)(retstr - ptr), MYF(MY_FAE));
tmp->length= (size_t)(retstr - ptr);
}
ptr+= retstr - ptr + 1;
if (isspace(*ptr))
ptr++;
count++;
}
if (ptr != origin+length)
{
char *origin_ptr;
if ((origin_ptr= strchr(ptr, ':')))
{
char *option_ptr;
tmp->length= (size_t)(origin_ptr - ptr);
tmp->string= my_strndup(origin, tmp->length, MYF(MY_FAE));
option_ptr= (char *)ptr + 1 + tmp->length;
/* Move past the : and the first string */
tmp->option_length= (size_t)((ptr + length) - option_ptr);
tmp->option= my_strndup(option_ptr, tmp->option_length,
MYF(MY_FAE));
}
else
{
tmp->length= (size_t)((ptr + length) - ptr);
tmp->string= my_strndup(ptr, tmp->length, MYF(MY_FAE));
}
count++;
}
return count;
}
uint uint
parse_delimiter(const char *script, statement **stmt, char delm) parse_delimiter(const char *script, statement **stmt, char delm)
...@@ -1821,9 +2000,11 @@ void ...@@ -1821,9 +2000,11 @@ void
print_conclusions_csv(conclusions *con) print_conclusions_csv(conclusions *con)
{ {
char buffer[HUGE_STRING_LENGTH]; char buffer[HUGE_STRING_LENGTH];
const char *ptr= auto_generate_sql_type ? auto_generate_sql_type : "query";
snprintf(buffer, HUGE_STRING_LENGTH, snprintf(buffer, HUGE_STRING_LENGTH,
"%s,query,%ld.%03ld,%ld.%03ld,%ld.%03ld,%d,%llu\n", "%s,%s,%ld.%03ld,%ld.%03ld,%ld.%03ld,%d,%llu\n",
con->engine ? con->engine : "", /* Storage engine we ran against */ con->engine ? con->engine : "", /* Storage engine we ran against */
ptr, /* Load type */
con->avg_timing / 1000, con->avg_timing % 1000, /* Time to load */ con->avg_timing / 1000, con->avg_timing % 1000, /* Time to load */
con->min_timing / 1000, con->min_timing % 1000, /* Min time */ con->min_timing / 1000, con->min_timing % 1000, /* Min time */
con->max_timing / 1000, con->max_timing % 1000, /* Max time */ con->max_timing / 1000, con->max_timing % 1000, /* Max time */
...@@ -1834,7 +2015,7 @@ print_conclusions_csv(conclusions *con) ...@@ -1834,7 +2015,7 @@ print_conclusions_csv(conclusions *con)
} }
void void
generate_stats(conclusions *con, statement *eng, stats *sptr) generate_stats(conclusions *con, option_string *eng, stats *sptr)
{ {
stats *ptr; stats *ptr;
unsigned int x; unsigned int x;
...@@ -1866,6 +2047,24 @@ generate_stats(conclusions *con, statement *eng, stats *sptr) ...@@ -1866,6 +2047,24 @@ generate_stats(conclusions *con, statement *eng, stats *sptr)
con->engine= NULL; con->engine= NULL;
} }
void
option_cleanup(option_string *stmt)
{
option_string *ptr, *nptr;
if (!stmt)
return;
for (ptr= stmt; ptr; ptr= nptr)
{
nptr= ptr->next;
if (ptr->string)
my_free((gptr)ptr->string, MYF(0));
if (ptr->option)
my_free((gptr)ptr->option, MYF(0));
my_free((gptr)(byte *)ptr, MYF(0));
}
}
void void
statement_cleanup(statement *stmt) statement_cleanup(statement *stmt)
{ {
......
...@@ -32,3 +32,5 @@ ...@@ -32,3 +32,5 @@
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --auto-generate-sql-load-type=update --auto-generate-sql-execute-number=5 --exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --auto-generate-sql-load-type=update --auto-generate-sql-execute-number=5
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --auto-generate-sql-load-type=key --auto-generate-sql-execute-number=5 --exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --auto-generate-sql-load-type=key --auto-generate-sql-execute-number=5
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --auto-generate-sql-load-type=key --auto-generate-sql-execute-number=5 --auto-generate-sql-secondary-indexes=3
...@@ -66,6 +66,7 @@ struct show_table_authors_st show_table_authors[]= { ...@@ -66,6 +66,7 @@ struct show_table_authors_st show_table_authors[]= {
"Parser, port to OS/2, storage engines and some random stuff" }, "Parser, port to OS/2, storage engines and some random stuff" },
{ "Yuri Dario", "", "OS/2 port" }, { "Yuri Dario", "", "OS/2 port" },
{ "Andrei Elkin", "Espoo, Finland", "Replication" }, { "Andrei Elkin", "Espoo, Finland", "Replication" },
{ "Patrick Galbraith", "Sharon, NH", "Federated Engine, mysqlslap" },
{ "Sergei Golubchik", "Kerpen, Germany", { "Sergei Golubchik", "Kerpen, Germany",
"Full-text search, precision math" }, "Full-text search, precision math" },
{ "Lenz Grimmer", "Hamburg, Germany", { "Lenz Grimmer", "Hamburg, Germany",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment