~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/mysqlslap.c

  • Committer: Brian Aker
  • Date: 2008-07-26 04:51:46 UTC
  • mfrom: (202.1.25 codestyle)
  • Revision ID: brian@tangent.org-20080726045146-ax7ofn8aqnkycjl3
Merge from Monty

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2005 MySQL AB
 
1
/* Copyright (C) 2008 Drizzle Open Source Development Team
2
2
 
3
3
   This program is free software; you can redistribute it and/or modify
4
4
   it under the terms of the GNU General Public License as published by
19
19
 
20
20
 
21
21
/*
22
 
  MySQL Slap
 
22
  Drizzle Slap
23
23
 
24
24
  A simple program designed to work as if multiple clients querying the database,
25
25
  then reporting the timing of each stage.
26
26
 
27
 
  MySQL slap runs three stages:
 
27
  Drizzle slap runs three stages:
28
28
  1) Create schema,table, and optionally any SP or data you want to beign
29
29
     the test with. (single client)
30
30
  2) Load test (many clients)
32
32
 
33
33
  Examples:
34
34
 
35
 
  Supply your own create and query SQL statements, with 50 clients 
 
35
  Supply your own create and query SQL statements, with 50 clients
36
36
  querying (200 selects for each):
37
37
 
38
 
    mysqlslap --delimiter=";" \
 
38
    drizzleslap --delimiter=";" \
39
39
              --create="CREATE TABLE A (a int);INSERT INTO A VALUES (23)" \
40
40
              --query="SELECT * FROM A" --concurrency=50 --iterations=200
41
41
 
44
44
  don't create the table or insert the data (using the previous test's
45
45
  schema and data):
46
46
 
47
 
    mysqlslap --concurrency=5 --iterations=20 \
 
47
    drizzleslap --concurrency=5 --iterations=20 \
48
48
              --number-int-cols=2 --number-char-cols=3 \
49
49
              --auto-generate-sql
50
50
 
51
51
  Tell the program to load the create, insert and query SQL statements from
52
52
  the specified files, where the create.sql file has multiple table creation
53
53
  statements delimited by ';' and multiple insert statements delimited by ';'.
54
 
  The --query file will have multiple queries delimited by ';', run all the 
 
54
  The --query file will have multiple queries delimited by ';', run all the
55
55
  load statements, and then run all the queries in the query file
56
56
  with five clients (five times each):
57
57
 
58
 
    mysqlslap --concurrency=5 \
 
58
    drizzleslap --concurrency=5 \
59
59
              --iterations=5 --query=query.sql --create=create.sql \
60
60
              --delimiter=";"
61
61
 
84
84
#include <sys/wait.h>
85
85
#include <ctype.h>
86
86
 
87
 
#ifdef HAVE_SMEM 
 
87
#ifdef HAVE_SMEM
88
88
static char *shared_memory_base_name=0;
89
89
#endif
90
90
 
113
113
            *default_engine= NULL,
114
114
            *pre_system= NULL,
115
115
            *post_system= NULL,
116
 
            *opt_mysql_unix_port= NULL;
 
116
            *opt_drizzle_unix_port= NULL;
117
117
 
118
118
const char *delimiter= "\n";
119
119
 
153
153
static unsigned int num_blob_cols= 0;
154
154
static unsigned int num_blob_cols_size;
155
155
static unsigned int num_blob_cols_size_min;
156
 
static unsigned int num_int_cols_index= 0; 
 
156
static unsigned int num_int_cols_index= 0;
157
157
static unsigned int num_char_cols_index= 0;
158
158
static unsigned int iterations;
159
159
static uint my_end_arg= 0;
173
173
const char *opt_csv_str;
174
174
File csv_file;
175
175
 
176
 
static uint opt_protocol= MYSQL_PROTOCOL_TCP;
 
176
static uint opt_protocol= DRIZZLE_PROTOCOL_TCP;
177
177
 
178
178
static int get_options(int *argc,char ***argv);
179
 
static uint opt_mysql_port= 0;
 
179
static uint opt_drizzle_port= 0;
180
180
 
181
181
static const char *load_default_groups[]= { "mysqlslap","client",0 };
182
182
 
253
253
};
254
254
 
255
255
static option_string *engine_options= NULL;
256
 
static option_string *query_options= NULL; 
257
 
static statement *pre_statements= NULL; 
258
 
static statement *post_statements= NULL; 
 
256
static option_string *query_options= NULL;
 
257
static statement *pre_statements= NULL;
 
258
static statement *post_statements= NULL;
259
259
static statement *create_statements= NULL;
260
260
 
261
261
static statement **query_statements= NULL;
269
269
uint parse_comma(const char *string, uint **range);
270
270
uint parse_delimiter(const char *script, statement **stmt, char delm);
271
271
uint parse_option(const char *origin, option_string **stmt, char delm);
272
 
static int drop_schema(MYSQL *mysql, const char *db);
 
272
static int drop_schema(DRIZZLE *drizzle, const char *db);
273
273
uint get_random_string(char *buf, size_t size);
274
274
static statement *build_table_string(void);
275
275
static statement *build_insert_string(void);
276
276
static statement *build_update_string(void);
277
277
static statement * build_select_string(bool key);
278
 
static int generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt);
 
278
static int generate_primary_key_list(DRIZZLE *drizzle, option_string *engine_stmt);
279
279
static int drop_primary_key_list(void);
280
 
static int create_schema(MYSQL *mysql, const char *db, statement *stmt, 
 
280
static int create_schema(DRIZZLE *drizzle, const char *db, statement *stmt,
281
281
                         option_string *engine_stmt, stats *sptr);
282
 
static int run_scheduler(stats *sptr, statement **stmts, uint concur, 
 
282
static int run_scheduler(stats *sptr, statement **stmts, uint concur,
283
283
                         uint64_t limit);
284
284
pthread_handler_t run_task(void *p);
285
285
pthread_handler_t timer_thread(void *p);
286
286
void statement_cleanup(statement *stmt);
287
287
void option_cleanup(option_string *stmt);
288
 
void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr);
289
 
static int run_statements(MYSQL *mysql, statement *stmt);
290
 
void slap_connect(MYSQL *mysql, bool connect_to_schema);
291
 
void slap_close(MYSQL *mysql);
292
 
static int run_query(MYSQL *mysql, const char *query, int len);
 
288
void concurrency_loop(DRIZZLE *drizzle, uint current, option_string *eptr);
 
289
static int run_statements(DRIZZLE *drizzle, statement *stmt);
 
290
void slap_connect(DRIZZLE *drizzle, bool connect_to_schema);
 
291
void slap_close(DRIZZLE *drizzle);
 
292
static int run_query(DRIZZLE *drizzle, const char *query, int len);
293
293
void standard_deviation (conclusions *con, stats *sptr);
294
294
 
295
295
static const char ALPHANUMERICS[]=
301
301
static long int timedif(struct timeval a, struct timeval b)
302
302
{
303
303
    register int us, s;
304
 
 
 
304
 
305
305
    us = a.tv_usec - b.tv_usec;
306
306
    us /= 1000;
307
307
    s = a.tv_sec - b.tv_sec;
311
311
 
312
312
int main(int argc, char **argv)
313
313
{
314
 
  MYSQL mysql;
 
314
  DRIZZLE drizzle;
315
315
  option_string *eptr;
316
316
  unsigned int x;
317
317
 
319
319
 
320
320
  MY_INIT(argv[0]);
321
321
 
322
 
  if (!(mysql_thread_safe()))
 
322
  if (!(drizzle_thread_safe()))
323
323
      fprintf(stderr, "This application was compiled incorrectly. Please recompile with thread support.\n");
324
324
 
325
325
  load_defaults("my",load_default_groups,&argc,&argv);
350
350
    exit(1);
351
351
  }
352
352
 
353
 
  slap_connect(&mysql, false);
 
353
  slap_connect(&drizzle, false);
354
354
 
355
355
  VOID(pthread_mutex_init(&counter_mutex, NULL));
356
356
  VOID(pthread_cond_init(&count_threshhold, NULL));
374
374
    if (*concurrency)
375
375
    {
376
376
      for (current= concurrency; current && *current; current++)
377
 
        concurrency_loop(&mysql, *current, eptr);
 
377
        concurrency_loop(&drizzle, *current, eptr);
378
378
    }
379
379
    else
380
380
    {
381
381
      uint infinite= 1;
382
382
      do {
383
 
        concurrency_loop(&mysql, infinite, eptr);
 
383
        concurrency_loop(&drizzle, infinite, eptr);
384
384
      }
385
385
      while (infinite++);
386
386
    }
387
387
 
388
388
    if (!opt_preserve)
389
 
      drop_schema(&mysql, create_schema_string);
 
389
      drop_schema(&drizzle, create_schema_string);
390
390
 
391
391
  } while (eptr ? (eptr= eptr->next) : 0);
392
 
  
 
392
 
393
393
  if (opt_burnin)
394
394
    goto burnin;
395
395
 
400
400
  VOID(pthread_mutex_destroy(&timer_alarm_mutex));
401
401
  VOID(pthread_cond_destroy(&timer_alarm_threshold));
402
402
 
403
 
  slap_close(&mysql);
 
403
  slap_close(&drizzle);
404
404
 
405
405
  /* now free all the strings we created */
406
406
  if (opt_password)
427
427
  return 0;
428
428
}
429
429
 
430
 
void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr)
 
430
void concurrency_loop(DRIZZLE *drizzle, uint current, option_string *eptr)
431
431
{
432
432
  unsigned int x;
433
433
  stats *head_sptr;
435
435
  conclusions conclusion;
436
436
  unsigned long long client_limit;
437
437
 
438
 
  head_sptr= (stats *)my_malloc(sizeof(stats) * iterations, 
 
438
  head_sptr= (stats *)my_malloc(sizeof(stats) * iterations,
439
439
                                MYF(MY_ZEROFILL|MY_FAE|MY_WME));
440
440
 
441
441
  bzero(&conclusion, sizeof(conclusions));
455
455
      data in the table.
456
456
    */
457
457
    if (opt_preserve == false)
458
 
      drop_schema(mysql, create_schema_string);
 
458
      drop_schema(drizzle, create_schema_string);
459
459
 
460
460
    /* First we create */
461
461
    if (create_statements)
462
 
      create_schema(mysql, create_schema_string, create_statements, eptr, sptr);
 
462
      create_schema(drizzle, create_schema_string, create_statements, eptr, sptr);
463
463
 
464
464
    /*
465
465
      If we generated GUID we need to build a list of them from creation that
468
468
    if (verbose >= 2)
469
469
      printf("Generating primary key list\n");
470
470
    if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
471
 
      generate_primary_key_list(mysql, eptr);
 
471
      generate_primary_key_list(drizzle, eptr);
472
472
 
473
473
    if (commit_rate)
474
 
      run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
 
474
      run_query(drizzle, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
475
475
 
476
476
    if (pre_system)
477
477
      system(pre_system);
478
478
 
479
 
    /* 
480
 
      Pre statements are always run after all other logic so they can 
481
 
      correct/adjust any item that they want. 
 
479
    /*
 
480
      Pre statements are always run after all other logic so they can
 
481
      correct/adjust any item that they want.
482
482
    */
483
483
    if (pre_statements)
484
 
      run_statements(mysql, pre_statements);
 
484
      run_statements(drizzle, pre_statements);
485
485
 
486
 
    run_scheduler(sptr, query_statements, current, client_limit); 
487
 
    
 
486
    run_scheduler(sptr, query_statements, current, client_limit);
 
487
   
488
488
    if (post_statements)
489
 
      run_statements(mysql, post_statements);
 
489
      run_statements(drizzle, post_statements);
490
490
 
491
491
    if (post_system)
492
492
      system(post_system);
517
517
    0, 0, 0, 0, 0, 0},
518
518
  {"auto-generate-sql-select-columns", OPT_SLAP_AUTO_GENERATE_SELECT_COLUMNS,
519
519
    "Provide a string to use for the select fields used in auto tests.",
520
 
    (char**) &auto_generate_selected_columns_opt, 
 
520
    (char**) &auto_generate_selected_columns_opt,
521
521
    (char**) &auto_generate_selected_columns_opt,
522
522
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
523
523
  {"auto-generate-sql", 'a',
526
526
    0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
527
527
  {"auto-generate-sql-add-autoincrement", OPT_SLAP_AUTO_GENERATE_ADD_AUTO,
528
528
    "Add an AUTO_INCREMENT column to auto-generated tables.",
529
 
    (char**) &auto_generate_sql_autoincrement, 
 
529
    (char**) &auto_generate_sql_autoincrement,
530
530
    (char**) &auto_generate_sql_autoincrement,
531
531
    0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
532
532
  {"auto-generate-sql-execute-number", OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES,
535
535
    0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
536
536
  {"auto-generate-sql-guid-primary", OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY,
537
537
    "Add GUID based primary keys to auto-generated tables.",
538
 
    (char**) &auto_generate_sql_guid_primary, 
 
538
    (char**) &auto_generate_sql_guid_primary,
539
539
    (char**) &auto_generate_sql_guid_primary,
540
540
    0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
541
541
  {"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE,
542
542
    "Specify test load type: mixed, update, write, key, or read; default is mixed.",
543
543
    (char**) &opt_auto_generate_sql_type, (char**) &opt_auto_generate_sql_type,
544
544
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
545
 
  {"auto-generate-sql-secondary-indexes", 
546
 
    OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES, 
 
545
  {"auto-generate-sql-secondary-indexes",
 
546
    OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES,
547
547
    "Number of secondary indexes to add to auto-generated tables.",
548
 
    (char**) &auto_generate_sql_secondary_indexes, 
 
548
    (char**) &auto_generate_sql_secondary_indexes,
549
549
    (char**) &auto_generate_sql_secondary_indexes, 0,
550
550
    GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
551
 
  {"auto-generate-sql-unique-query-number", 
 
551
  {"auto-generate-sql-unique-query-number",
552
552
    OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM,
553
553
    "Number of unique queries to generate for automatic tests.",
554
 
    (char**) &auto_generate_sql_unique_query_number, 
 
554
    (char**) &auto_generate_sql_unique_query_number,
555
555
    (char**) &auto_generate_sql_unique_query_number,
556
556
    0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0},
557
 
  {"auto-generate-sql-unique-write-number", 
 
557
  {"auto-generate-sql-unique-write-number",
558
558
    OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM,
559
559
    "Number of unique queries to generate for auto-generate-sql-write-number.",
560
 
    (char**) &auto_generate_sql_unique_write_number, 
 
560
    (char**) &auto_generate_sql_unique_write_number,
561
561
    (char**) &auto_generate_sql_unique_write_number,
562
562
    0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0},
563
563
  {"auto-generate-sql-write-number", OPT_SLAP_AUTO_GENERATE_WRITE_NUM,
567
567
  {"burnin", OPT_SLAP_BURNIN, "Run full test case in infinite loop.",
568
568
    (char**) &opt_burnin, (char**) &opt_burnin, 0, GET_BOOL, NO_ARG, 0, 0, 0,
569
569
    0, 0, 0},
570
 
  {"ignore-sql-errors", OPT_SLAP_IGNORE_SQL_ERRORS, 
 
570
  {"ignore-sql-errors", OPT_SLAP_IGNORE_SQL_ERRORS,
571
571
    "Ignore SQL erros in query run.",
572
 
    (char**) &opt_ignore_sql_errors, 
573
 
    (char**) &opt_ignore_sql_errors, 
 
572
    (char**) &opt_ignore_sql_errors,
 
573
    (char**) &opt_ignore_sql_errors,
574
574
    0, GET_BOOL, NO_ARG, 0, 0, 0,
575
575
    0, 0, 0},
576
576
  {"commit", OPT_SLAP_COMMIT, "Commit records every X number of statements.",
586
586
    (char**) &create_string, (char**) &create_string, 0, GET_STR, REQUIRED_ARG,
587
587
    0, 0, 0, 0, 0, 0},
588
588
  {"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.",
589
 
    (char**) &create_schema_string, (char**) &create_schema_string, 0, GET_STR, 
 
589
    (char**) &create_schema_string, (char**) &create_schema_string, 0, GET_STR,
590
590
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
591
591
  {"csv", OPT_SLAP_CSV,
592
 
        "Generate CSV output to named file or to stdout if no file is named.",
593
 
    (char**) &opt_csv_str, (char**) &opt_csv_str, 0, GET_STR, 
 
592
  "Generate CSV output to named file or to stdout if no file is named.",
 
593
    (char**) &opt_csv_str, (char**) &opt_csv_str, 0, GET_STR,
594
594
    OPT_ARG, 0, 0, 0, 0, 0, 0},
595
595
  {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
596
596
   (char**) &debug_check_flag, (char**) &debug_check_flag, 0,
597
597
   GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
598
598
  {"debug-info", 'T', "Print some debug info at exit.", (char**) &debug_info_flag,
599
599
   (char**) &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
600
 
  {"delayed-start", OPT_SLAP_DELAYED_START, 
 
600
  {"delayed-start", OPT_SLAP_DELAYED_START,
601
601
    "Delay the startup of threads by a random number of microsends (the maximum of the delay)",
602
 
    (char**) &opt_delayed_start, (char**) &opt_delayed_start, 0, GET_UINT, 
 
602
    (char**) &opt_delayed_start, (char**) &opt_delayed_start, 0, GET_UINT,
603
603
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
604
604
  {"delimiter", 'F',
605
605
    "Delimiter to use in SQL statements supplied in file or command line.",
607
607
    0, 0, 0, 0, 0, 0},
608
608
  {"detach", OPT_SLAP_DETACH,
609
609
    "Detach (close and reopen) connections after X number of requests.",
610
 
    (char**) &detach_rate, (char**) &detach_rate, 0, GET_UINT, REQUIRED_ARG, 
 
610
    (char**) &detach_rate, (char**) &detach_rate, 0, GET_UINT, REQUIRED_ARG,
611
611
    0, 0, 0, 0, 0, 0},
612
612
  {"engine", 'e', "Storage engine to use for creating the table.",
613
613
    (char**) &default_engine, (char**) &default_engine, 0,
619
619
  {"label", OPT_SLAP_LABEL, "Label to use for print and csv output.",
620
620
    (char**) &opt_label, (char**) &opt_label, 0,
621
621
    GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
622
 
  {"number-blob-cols", OPT_SLAP_BLOB_COL, 
 
622
  {"number-blob-cols", OPT_SLAP_BLOB_COL,
623
623
    "Number of BLOB columns to create table with if specifying --auto-generate-sql. Example --number-blob-cols=3:1024/2048 would give you 3 blobs with a random size between 1024 and 2048. ",
624
624
    (char**) &num_blob_cols_opt, (char**) &num_blob_cols_opt, 0, GET_STR, REQUIRED_ARG,
625
625
    0, 0, 0, 0, 0, 0},
626
 
  {"number-char-cols", 'x', 
 
626
  {"number-char-cols", 'x',
627
627
    "Number of VARCHAR columns to create in table if specifying --auto-generate-sql.",
628
628
    (char**) &num_char_cols_opt, (char**) &num_char_cols_opt, 0, GET_STR, REQUIRED_ARG,
629
629
    0, 0, 0, 0, 0, 0},
630
 
  {"number-int-cols", 'y', 
 
630
  {"number-int-cols", 'y',
631
631
    "Number of INT columns to create in table if specifying --auto-generate-sql.",
632
 
    (char**) &num_int_cols_opt, (char**) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG, 
 
632
    (char**) &num_int_cols_opt, (char**) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG,
633
633
    0, 0, 0, 0, 0, 0},
634
 
  {"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY, 
 
634
  {"number-of-queries", OPT_DRIZZLE_NUMBER_OF_QUERY,
635
635
    "Limit each client to this number of queries (this is not exact).",
636
636
    (char**) &num_of_query, (char**) &num_of_query, 0,
637
637
    GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
638
 
  {"only-print", OPT_MYSQL_ONLY_PRINT,
639
 
    "This causes mysqlslap to not connect to the databases, but instead print "
 
638
  {"only-print", OPT_DRIZZLE_ONLY_PRINT,
 
639
    "This causes drizzleslap to not connect to the databases, but instead print "
640
640
      "out what it would have done instead.",
641
641
    (char**) &opt_only_print, (char**) &opt_only_print, 0, GET_BOOL,  NO_ARG,
642
642
    0, 0, 0, 0, 0, 0},
643
643
  {"password", 'p',
644
644
    "Password to use when connecting to server. If password is not given it's "
645
645
      "asked from the tty.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
646
 
  {"port", 'P', "Port number to use for connection.", (char**) &opt_mysql_port,
647
 
    (char**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0,
 
646
  {"port", 'P', "Port number to use for connection.", (char**) &opt_drizzle_port,
 
647
    (char**) &opt_drizzle_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0,
648
648
    0},
649
649
  {"post-query", OPT_SLAP_POST_QUERY,
650
650
    "Query to run or file containing query to execute after tests have completed.",
651
 
    (char**) &user_supplied_post_statements, 
 
651
    (char**) &user_supplied_post_statements,
652
652
    (char**) &user_supplied_post_statements,
653
653
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
654
654
  {"post-system", OPT_SLAP_POST_SYSTEM,
655
655
    "system() string to execute after tests have completed.",
656
 
    (char**) &post_system, 
 
656
    (char**) &post_system,
657
657
    (char**) &post_system,
658
658
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
659
 
  {"pre-query", OPT_SLAP_PRE_QUERY, 
 
659
  {"pre-query", OPT_SLAP_PRE_QUERY,
660
660
    "Query to run or file containing query to execute before running tests.",
661
 
    (char**) &user_supplied_pre_statements, 
 
661
    (char**) &user_supplied_pre_statements,
662
662
    (char**) &user_supplied_pre_statements,
663
663
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
664
 
  {"pre-system", OPT_SLAP_PRE_SYSTEM, 
 
664
  {"pre-system", OPT_SLAP_PRE_SYSTEM,
665
665
    "system() string to execute before running tests.",
666
 
    (char**) &pre_system, 
 
666
    (char**) &pre_system,
667
667
    (char**) &pre_system,
668
668
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
669
 
  {"protocol", OPT_MYSQL_PROTOCOL,
 
669
  {"protocol", OPT_DRIZZLE_PROTOCOL,
670
670
    "The protocol of connection (tcp,socket,pipe,memory).",
671
671
    0, 0, 0, GET_STR,  REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
672
672
  {"query", 'q', "Query to run or file containing query to run.",
673
673
    (char**) &user_supplied_query, (char**) &user_supplied_query,
674
674
    0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
675
 
  {"set-random-seed", OPT_SLAP_SET_RANDOM_SEED, 
 
675
  {"set-random-seed", OPT_SLAP_SET_RANDOM_SEED,
676
676
    "Seed for random number generator (srandom(3))",
677
677
    (char**)&opt_set_random_seed,
678
678
    (char**)&opt_set_random_seed,0,
681
681
    (char**) &opt_silent, (char**) &opt_silent, 0, GET_BOOL,  NO_ARG,
682
682
    0, 0, 0, 0, 0, 0},
683
683
  {"socket", 'S', "Socket file to use for connection.",
684
 
    (char**) &opt_mysql_unix_port, (char**) &opt_mysql_unix_port, 0, GET_STR,
 
684
    (char**) &opt_drizzle_unix_port, (char**) &opt_drizzle_unix_port, 0, GET_STR,
685
685
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
686
 
  {"timer-length", OPT_SLAP_TIMER_LENGTH, 
687
 
    "Require mysqlslap to run each specific test a certain amount of time in seconds.", 
688
 
    (char**) &opt_timer_length, (char**) &opt_timer_length, 0, GET_UINT, 
 
686
  {"timer-length", OPT_SLAP_TIMER_LENGTH,
 
687
    "Require drizzleslap to run each specific test a certain amount of time in seconds.",
 
688
    (char**) &opt_timer_length, (char**) &opt_timer_length, 0, GET_UINT,
689
689
    REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
690
690
#ifndef DONT_ALLOW_USER_CHANGE
691
691
  {"user", 'u', "User for login if not current user.", (char**) &user,
693
693
#endif
694
694
  {"verbose", 'v',
695
695
    "More verbose output; you can use this multiple times to get even more "
696
 
      "verbose output.", (char**) &verbose, (char**) &verbose, 0, 
 
696
      "verbose output.", (char**) &verbose, (char**) &verbose, 0,
697
697
      GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
698
698
  {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
699
699
    NO_ARG, 0, 0, 0, 0, 0, 0},
711
711
static void usage(void)
712
712
{
713
713
  print_version();
714
 
  puts("Copyright (C) 2005 MySQL AB");
 
714
  puts("Copyright (C) 2005 DRIZZLE AB");
715
715
  puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\
716
716
       \nand you are welcome to modify and redistribute it under the GPL \
717
717
       license\n");
736
736
      char *start= argument;
737
737
      my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
738
738
      opt_password= my_strdup(argument,MYF(MY_FAE));
739
 
      while (*argument) *argument++= 'x';               /* Destroy argument */
 
739
      while (*argument) *argument++= 'x';    /* Destroy argument */
740
740
      if (*start)
741
 
        start[1]= 0;                            /* Cut length of argument */
 
741
        start[1]= 0;        /* Cut length of argument */
742
742
      tty_password= 0;
743
743
    }
744
744
    else
749
749
    exit(0);
750
750
    break;
751
751
  case '?':
752
 
  case 'I':                                     /* Info */
 
752
  case 'I':          /* Info */
753
753
    usage();
754
754
    exit(0);
755
755
  }
812
812
      if (count) /* Except for the first pass we add a comma */
813
813
        dynstr_append(&table_string, ",");
814
814
 
815
 
      if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(32) unique key", count) 
 
815
      if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(32) unique key", count)
816
816
          > HUGE_STRING_LENGTH)
817
817
      {
818
818
        fprintf(stderr, "Memory Allocation error in create table\n");
830
830
    {
831
831
      if (num_int_cols_index)
832
832
      {
833
 
        if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32), INDEX(intcol%d)", 
 
833
        if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32), INDEX(intcol%d)",
834
834
                     col_count, col_count) > HUGE_STRING_LENGTH)
835
835
        {
836
836
          fprintf(stderr, "Memory Allocation error in create table\n");
839
839
      }
840
840
      else
841
841
      {
842
 
        if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32) ", col_count) 
 
842
        if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d INT(32) ", col_count)
843
843
            > HUGE_STRING_LENGTH)
844
844
        {
845
845
          fprintf(stderr, "Memory Allocation error in create table\n");
857
857
    {
858
858
      if (num_char_cols_index)
859
859
      {
860
 
        if (snprintf(buf, HUGE_STRING_LENGTH, 
861
 
                     "charcol%d VARCHAR(128), INDEX(charcol%d) ", 
 
860
        if (snprintf(buf, HUGE_STRING_LENGTH,
 
861
                     "charcol%d VARCHAR(128), INDEX(charcol%d) ",
862
862
                     col_count, col_count) > HUGE_STRING_LENGTH)
863
863
        {
864
864
          fprintf(stderr, "Memory Allocation error in creating table\n");
867
867
      }
868
868
      else
869
869
      {
870
 
        if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d VARCHAR(128)", 
 
870
        if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d VARCHAR(128)",
871
871
                     col_count) > HUGE_STRING_LENGTH)
872
872
        {
873
873
          fprintf(stderr, "Memory Allocation error in creating table\n");
883
883
  if (num_blob_cols)
884
884
    for (col_count= 1; col_count <= num_blob_cols; col_count++)
885
885
    {
886
 
      if (snprintf(buf, HUGE_STRING_LENGTH, "blobcol%d blob", 
 
886
      if (snprintf(buf, HUGE_STRING_LENGTH, "blobcol%d blob",
887
887
                   col_count) > HUGE_STRING_LENGTH)
888
888
      {
889
889
        fprintf(stderr, "Memory Allocation error in creating table\n");
896
896
    }
897
897
 
898
898
  dynstr_append(&table_string, ")");
899
 
  ptr= (statement *)my_malloc(sizeof(statement), 
 
899
  ptr= (statement *)my_malloc(sizeof(statement),
900
900
                              MYF(MY_ZEROFILL|MY_FAE|MY_WME));
901
901
  ptr->string = (char *)my_malloc(table_string.length+1,
902
902
                                  MYF(MY_ZEROFILL|MY_FAE|MY_WME));
929
929
  if (num_int_cols)
930
930
    for (col_count= 1; col_count <= num_int_cols; col_count++)
931
931
    {
932
 
      if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d = %ld", col_count, 
 
932
      if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d = %ld", col_count,
933
933
                   random()) > HUGE_STRING_LENGTH)
934
934
      {
935
935
        fprintf(stderr, "Memory Allocation error in creating update\n");
947
947
      char rand_buffer[RAND_STRING_SIZE];
948
948
      int buf_len= get_random_string(rand_buffer, RAND_STRING_SIZE);
949
949
 
950
 
      if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d = '%.*s'", col_count, 
951
 
                   buf_len, rand_buffer) 
 
950
      if (snprintf(buf, HUGE_STRING_LENGTH, "charcol%d = '%.*s'", col_count,
 
951
                   buf_len, rand_buffer)
952
952
          > HUGE_STRING_LENGTH)
953
953
      {
954
954
        fprintf(stderr, "Memory Allocation error in creating update\n");
964
964
    dynstr_append(&update_string, " WHERE id = ");
965
965
 
966
966
 
967
 
  ptr= (statement *)my_malloc(sizeof(statement), 
 
967
  ptr= (statement *)my_malloc(sizeof(statement),
968
968
                              MYF(MY_ZEROFILL|MY_FAE|MY_WME));
969
969
 
970
970
  ptr->string= (char *)my_malloc(update_string.length + 1,
1082
1082
      unsigned int size;
1083
1083
      unsigned int difference= num_blob_cols_size - num_blob_cols_size_min;
1084
1084
 
1085
 
      size= difference ? (num_blob_cols_size_min + (random() % difference)) : 
 
1085
      size= difference ? (num_blob_cols_size_min + (random() % difference)) :
1086
1086
                          num_blob_cols_size;
1087
1087
 
1088
1088
      buf_len= get_random_string(blob_ptr, size);
1146
1146
  {
1147
1147
    for (col_count= 1; col_count <= num_int_cols; col_count++)
1148
1148
    {
1149
 
      if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d", col_count) 
 
1149
      if (snprintf(buf, HUGE_STRING_LENGTH, "intcol%d", col_count)
1150
1150
          > HUGE_STRING_LENGTH)
1151
1151
      {
1152
1152
        fprintf(stderr, "Memory Allocation error in creating select\n");
1188
1188
  }
1189
1189
  dynstr_append(&query_string, " FROM t1");
1190
1190
 
1191
 
  if ((key) && 
 
1191
  if ((key) &&
1192
1192
      (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary))
1193
1193
    dynstr_append(&query_string, " WHERE id = ");
1194
1194
 
1197
1197
  ptr->string= (char *)my_malloc(query_string.length + 1,
1198
1198
                              MYF(MY_ZEROFILL|MY_FAE|MY_WME));
1199
1199
  ptr->length= query_string.length+1;
1200
 
  if ((key) && 
 
1200
  if ((key) &&
1201
1201
      (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary))
1202
1202
    ptr->type= SELECT_TYPE_REQUIRES_PREFIX;
1203
1203
  else
1239
1239
      exit(1);
1240
1240
  }
1241
1241
 
1242
 
  if (auto_generate_sql && auto_generate_sql_guid_primary && 
 
1242
  if (auto_generate_sql && auto_generate_sql_guid_primary &&
1243
1243
      auto_generate_sql_autoincrement)
1244
1244
  {
1245
1245
      fprintf(stderr,
1261
1261
  if (opt_csv_str)
1262
1262
  {
1263
1263
    opt_silent= true;
1264
 
    
 
1264
   
1265
1265
    if (opt_csv_str[0] == '-')
1266
1266
    {
1267
1267
      csv_file= fileno(stdout);
1340
1340
      printf("Building Create Statements for Auto\n");
1341
1341
 
1342
1342
    create_statements= build_table_string();
1343
 
    /* 
1344
 
      Pre-populate table 
 
1343
    /*
 
1344
      Pre-populate table
1345
1345
    */
1346
 
    for (ptr_statement= create_statements, x= 0; 
1347
 
         x < auto_generate_sql_unique_write_number; 
 
1346
    for (ptr_statement= create_statements, x= 0;
 
1347
         x < auto_generate_sql_unique_write_number;
1348
1348
         x++, ptr_statement= ptr_statement->next)
1349
1349
    {
1350
1350
      ptr_statement->next= build_insert_string();
1356
1356
    if (!opt_auto_generate_sql_type)
1357
1357
      opt_auto_generate_sql_type= "mixed";
1358
1358
 
1359
 
    query_statements_count= 
 
1359
    query_statements_count=
1360
1360
      parse_option(opt_auto_generate_sql_type, &query_options, ',');
1361
1361
 
1362
1362
    query_statements= (statement **)my_malloc(sizeof(statement *) * query_statements_count,
1371
1371
          printf("Generating SELECT Statements for Auto\n");
1372
1372
 
1373
1373
        query_statements[sql_type_count]= build_select_string(false);
1374
 
        for (ptr_statement= query_statements[sql_type_count], x= 0; 
1375
 
             x < auto_generate_sql_unique_query_number; 
 
1374
        for (ptr_statement= query_statements[sql_type_count], x= 0;
 
1375
             x < auto_generate_sql_unique_query_number;
1376
1376
             x++, ptr_statement= ptr_statement->next)
1377
1377
        {
1378
1378
          ptr_statement->next= build_select_string(false);
1393
1393
        }
1394
1394
 
1395
1395
        query_statements[sql_type_count]= build_select_string(true);
1396
 
        for (ptr_statement= query_statements[sql_type_count], x= 0; 
1397
 
             x < auto_generate_sql_unique_query_number; 
 
1396
        for (ptr_statement= query_statements[sql_type_count], x= 0;
 
1397
             x < auto_generate_sql_unique_query_number;
1398
1398
             x++, ptr_statement= ptr_statement->next)
1399
1399
        {
1400
1400
          ptr_statement->next= build_select_string(true);
1403
1403
      else if (sql_type->string[0] == 'w')
1404
1404
      {
1405
1405
        /*
1406
 
          We generate a number of strings in case the engine is 
 
1406
          We generate a number of strings in case the engine is
1407
1407
          Archive (since strings which were identical one after another
1408
1408
          would be too easily optimized).
1409
1409
        */
1410
1410
        if (verbose >= 2)
1411
1411
          printf("Generating INSERT Statements for Auto\n");
1412
1412
        query_statements[sql_type_count]= build_insert_string();
1413
 
        for (ptr_statement= query_statements[sql_type_count], x= 0; 
1414
 
             x < auto_generate_sql_unique_query_number; 
 
1413
        for (ptr_statement= query_statements[sql_type_count], x= 0;
 
1414
             x < auto_generate_sql_unique_query_number;
1415
1415
             x++, ptr_statement= ptr_statement->next)
1416
1416
        {
1417
1417
          ptr_statement->next= build_insert_string();
1429
1429
        }
1430
1430
 
1431
1431
        query_statements[sql_type_count]= build_update_string();
1432
 
        for (ptr_statement= query_statements[sql_type_count], x= 0; 
1433
 
             x < auto_generate_sql_unique_query_number; 
 
1432
        for (ptr_statement= query_statements[sql_type_count], x= 0;
 
1433
             x < auto_generate_sql_unique_query_number;
1434
1434
             x++, ptr_statement= ptr_statement->next)
1435
1435
        {
1436
1436
          ptr_statement->next= build_update_string();
1441
1441
        int coin= 0;
1442
1442
 
1443
1443
        query_statements[sql_type_count]= build_insert_string();
1444
 
        /* 
 
1444
        /*
1445
1445
          This logic should be extended to do a more mixed load,
1446
1446
          at the moment it results in "every other".
1447
1447
        */
1448
 
        for (ptr_statement= query_statements[sql_type_count], x= 0; 
1449
 
             x < auto_generate_sql_unique_query_number; 
 
1448
        for (ptr_statement= query_statements[sql_type_count], x= 0;
 
1449
             x < auto_generate_sql_unique_query_number;
1450
1450
             x++, ptr_statement= ptr_statement->next)
1451
1451
        {
1452
1452
          if (coin)
1496
1496
    /* Set this up till we fully support options on user generated queries */
1497
1497
    if (user_supplied_query)
1498
1498
    {
1499
 
      query_statements_count= 
 
1499
      query_statements_count=
1500
1500
        parse_option("default", &query_options, ',');
1501
1501
 
1502
1502
      query_statements= (statement **)my_malloc(sizeof(statement *),
1526
1526
        actual_queries= parse_delimiter(tmp_string, &query_statements[0],
1527
1527
                                        delimiter[0]);
1528
1528
      my_free(tmp_string, MYF(0));
1529
 
    } 
 
1529
    }
1530
1530
    else if (user_supplied_query)
1531
1531
    {
1532
1532
      actual_queries= parse_delimiter(user_supplied_query, &query_statements[0],
1558
1558
      (void)parse_delimiter(tmp_string, &pre_statements,
1559
1559
                            delimiter[0]);
1560
1560
    my_free(tmp_string, MYF(0));
1561
 
  } 
 
1561
  }
1562
1562
  else if (user_supplied_pre_statements)
1563
1563
  {
1564
1564
    (void)parse_delimiter(user_supplied_pre_statements,
1590
1590
      (void)parse_delimiter(tmp_string, &post_statements,
1591
1591
                            delimiter[0]);
1592
1592
    my_free(tmp_string, MYF(0));
1593
 
  } 
 
1593
  }
1594
1594
  else if (user_supplied_post_statements)
1595
1595
  {
1596
1596
    (void)parse_delimiter(user_supplied_post_statements, &post_statements,
1609
1609
}
1610
1610
 
1611
1611
 
1612
 
static int run_query(MYSQL *mysql, const char *query, int len)
 
1612
static int run_query(DRIZZLE *drizzle, const char *query, int len)
1613
1613
{
1614
1614
  if (opt_only_print)
1615
1615
  {
1619
1619
 
1620
1620
  if (verbose >= 3)
1621
1621
    printf("%.*s;\n", len, query);
1622
 
  return mysql_real_query(mysql, query, len);
 
1622
  return drizzle_real_query(drizzle, query, len);
1623
1623
}
1624
1624
 
1625
1625
 
1626
1626
static int
1627
 
generate_primary_key_list(MYSQL *mysql, option_string *engine_stmt)
 
1627
generate_primary_key_list(DRIZZLE *drizzle, option_string *engine_stmt)
1628
1628
{
1629
 
  MYSQL_RES *result;
1630
 
  MYSQL_ROW row;
 
1629
  DRIZZLE_RES *result;
 
1630
  DRIZZLE_ROW row;
1631
1631
  unsigned long long counter;
1632
1632
 
1633
1633
 
1634
 
  /* 
1635
 
    Blackhole is a special case, this allows us to test the upper end 
 
1634
  /*
 
1635
    Blackhole is a special case, this allows us to test the upper end
1636
1636
    of the server during load runs.
1637
1637
  */
1638
 
  if (opt_only_print || (engine_stmt && 
 
1638
  if (opt_only_print || (engine_stmt &&
1639
1639
                         strstr(engine_stmt->string, "blackhole")))
1640
1640
  {
1641
1641
    primary_keys_number_of= 1;
1642
 
    primary_keys= (char **)my_malloc((uint)(sizeof(char *) * 
1643
 
                                            primary_keys_number_of), 
 
1642
    primary_keys= (char **)my_malloc((uint)(sizeof(char *) *
 
1643
                                            primary_keys_number_of),
1644
1644
                                    MYF(MY_ZEROFILL|MY_FAE|MY_WME));
1645
1645
    /* Yes, we strdup a const string to simplify the interface */
1646
 
    primary_keys[0]= my_strdup("796c4422-1d94-102a-9d6d-00e0812d", MYF(0)); 
 
1646
    primary_keys[0]= my_strdup("796c4422-1d94-102a-9d6d-00e0812d", MYF(0));
1647
1647
  }
1648
1648
  else
1649
1649
  {
1650
 
    if (run_query(mysql, "SELECT id from t1", strlen("SELECT id from t1")))
 
1650
    if (run_query(drizzle, "SELECT id from t1", strlen("SELECT id from t1")))
1651
1651
    {
1652
1652
      fprintf(stderr,"%s: Cannot select GUID primary keys. (%s)\n", my_progname,
1653
 
              mysql_error(mysql));
 
1653
              drizzle_error(drizzle));
1654
1654
      exit(1);
1655
1655
    }
1656
1656
 
1657
 
    result= mysql_store_result(mysql);
1658
 
    primary_keys_number_of= mysql_num_rows(result);
 
1657
    result= drizzle_store_result(drizzle);
 
1658
    primary_keys_number_of= drizzle_num_rows(result);
1659
1659
 
1660
1660
    /* So why check this? Blackhole :) */
1661
1661
    if (primary_keys_number_of)
1663
1663
      /*
1664
1664
        We create the structure and loop and create the items.
1665
1665
      */
1666
 
      primary_keys= (char **)my_malloc((uint)(sizeof(char *) * 
1667
 
                                              primary_keys_number_of), 
 
1666
      primary_keys= (char **)my_malloc((uint)(sizeof(char *) *
 
1667
                                              primary_keys_number_of),
1668
1668
                                       MYF(MY_ZEROFILL|MY_FAE|MY_WME));
1669
 
      row= mysql_fetch_row(result);
1670
 
      for (counter= 0; counter < primary_keys_number_of; 
1671
 
           counter++, row= mysql_fetch_row(result))
 
1669
      row= drizzle_fetch_row(result);
 
1670
      for (counter= 0; counter < primary_keys_number_of;
 
1671
           counter++, row= drizzle_fetch_row(result))
1672
1672
        primary_keys[counter]= my_strdup(row[0], MYF(0));
1673
1673
    }
1674
1674
 
1675
 
    mysql_free_result(result);
 
1675
    drizzle_free_result(result);
1676
1676
  }
1677
1677
 
1678
1678
  return(0);
1695
1695
}
1696
1696
 
1697
1697
static int
1698
 
create_schema(MYSQL *mysql, const char *db, statement *stmt, 
 
1698
create_schema(DRIZZLE *drizzle, const char *db, statement *stmt,
1699
1699
              option_string *engine_stmt, stats *sptr)
1700
1700
{
1701
1701
  char query[HUGE_STRING_LENGTH];
1713
1713
  if (verbose >= 2)
1714
1714
    printf("Loading Pre-data\n");
1715
1715
 
1716
 
  if (run_query(mysql, query, len))
 
1716
  if (run_query(drizzle, query, len))
1717
1717
  {
1718
1718
    fprintf(stderr,"%s: Cannot create schema %s : %s\n", my_progname, db,
1719
 
            mysql_error(mysql));
 
1719
            drizzle_error(drizzle));
1720
1720
    exit(1);
1721
1721
  }
1722
1722
  else
1733
1733
    if (verbose >= 3)
1734
1734
      printf("%s;\n", query);
1735
1735
 
1736
 
    if (mysql_select_db(mysql,  db))
 
1736
    if (drizzle_select_db(drizzle,  db))
1737
1737
    {
1738
1738
      fprintf(stderr,"%s: Cannot select schema '%s': %s\n",my_progname, db,
1739
 
              mysql_error(mysql));
 
1739
              drizzle_error(drizzle));
1740
1740
      exit(1);
1741
1741
    }
1742
1742
    sptr->create_count++;
1746
1746
  {
1747
1747
    len= snprintf(query, HUGE_STRING_LENGTH, "set storage_engine=`%s`",
1748
1748
                  engine_stmt->string);
1749
 
    if (run_query(mysql, query, len))
 
1749
    if (run_query(drizzle, query, len))
1750
1750
    {
1751
1751
      fprintf(stderr,"%s: Cannot set default engine: %s\n", my_progname,
1752
 
              mysql_error(mysql));
 
1752
              drizzle_error(drizzle));
1753
1753
      exit(1);
1754
1754
    }
1755
1755
    sptr->create_count++;
1768
1768
    {
1769
1769
      char buffer[HUGE_STRING_LENGTH];
1770
1770
 
1771
 
      snprintf(buffer, HUGE_STRING_LENGTH, "%s %s", ptr->string, 
 
1771
      snprintf(buffer, HUGE_STRING_LENGTH, "%s %s", ptr->string,
1772
1772
               engine_stmt->option);
1773
 
      if (run_query(mysql, buffer, strlen(buffer)))
 
1773
      if (run_query(drizzle, buffer, strlen(buffer)))
1774
1774
      {
1775
1775
        fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
1776
 
                my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
 
1776
                my_progname, (uint)ptr->length, ptr->string, drizzle_error(drizzle));
1777
1777
        if (!opt_ignore_sql_errors)
1778
1778
          exit(1);
1779
1779
      }
1781
1781
    }
1782
1782
    else
1783
1783
    {
1784
 
      if (run_query(mysql, ptr->string, ptr->length))
 
1784
      if (run_query(drizzle, ptr->string, ptr->length))
1785
1785
      {
1786
1786
        fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
1787
 
                my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
 
1787
                my_progname, (uint)ptr->length, ptr->string, drizzle_error(drizzle));
1788
1788
        if (!opt_ignore_sql_errors)
1789
1789
          exit(1);
1790
1790
      }
1807
1807
}
1808
1808
 
1809
1809
static int
1810
 
drop_schema(MYSQL *mysql, const char *db)
 
1810
drop_schema(DRIZZLE *drizzle, const char *db)
1811
1811
{
1812
1812
  char query[HUGE_STRING_LENGTH];
1813
1813
  int len;
1814
1814
 
1815
1815
  len= snprintf(query, HUGE_STRING_LENGTH, "DROP SCHEMA IF EXISTS `%s`", db);
1816
1816
 
1817
 
  if (run_query(mysql, query, len))
 
1817
  if (run_query(drizzle, query, len))
1818
1818
  {
1819
1819
    fprintf(stderr,"%s: Cannot drop database '%s' ERROR : %s\n",
1820
 
            my_progname, db, mysql_error(mysql));
 
1820
            my_progname, db, drizzle_error(drizzle));
1821
1821
    exit(1);
1822
1822
  }
1823
1823
 
1827
1827
}
1828
1828
 
1829
1829
static int
1830
 
run_statements(MYSQL *mysql, statement *stmt) 
 
1830
run_statements(DRIZZLE *drizzle, statement *stmt)
1831
1831
{
1832
1832
  statement *ptr;
1833
 
  MYSQL_RES *result;
 
1833
  DRIZZLE_RES *result;
1834
1834
 
1835
1835
 
1836
1836
  for (ptr= stmt; ptr && ptr->length; ptr= ptr->next)
1837
1837
  {
1838
 
    if (run_query(mysql, ptr->string, ptr->length))
 
1838
    if (run_query(drizzle, ptr->string, ptr->length))
1839
1839
    {
1840
1840
      fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
1841
 
              my_progname, (uint)ptr->length, ptr->string, mysql_error(mysql));
 
1841
              my_progname, (uint)ptr->length, ptr->string, drizzle_error(drizzle));
1842
1842
      exit(1);
1843
1843
    }
1844
1844
    if (!opt_only_print)
1845
1845
    {
1846
 
      if (mysql_field_count(mysql))
 
1846
      if (drizzle_field_count(drizzle))
1847
1847
      {
1848
 
        result= mysql_store_result(mysql);
1849
 
        mysql_free_result(result);
 
1848
        result= drizzle_store_result(drizzle);
 
1849
        drizzle_free_result(result);
1850
1850
      }
1851
1851
    }
1852
1852
  }
1869
1869
 
1870
1870
  pthread_attr_init(&attr);
1871
1871
  pthread_attr_setdetachstate(&attr,
1872
 
                  PTHREAD_CREATE_DETACHED);
 
1872
      PTHREAD_CREATE_DETACHED);
1873
1873
 
1874
1874
  pthread_mutex_lock(&counter_mutex);
1875
1875
  thread_counter= 0;
1880
1880
 
1881
1881
  real_concurrency= 0;
1882
1882
 
1883
 
  for (y= 0, sql_type= query_options; 
1884
 
       y < query_statements_count; 
 
1883
  for (y= 0, sql_type= query_options;
 
1884
       y < query_statements_count;
1885
1885
       y++, sql_type= sql_type->next)
1886
1886
  {
1887
1887
    unsigned int options_loop= 1;
1888
1888
 
1889
1889
    if (sql_type->option)
1890
1890
    {
1891
 
      options_loop= strtol(sql_type->option, 
 
1891
      options_loop= strtol(sql_type->option,
1892
1892
                           (char **)NULL, 10);
1893
1893
      options_loop= options_loop ? options_loop : 1;
1894
1894
    }
1902
1902
 
1903
1903
        real_concurrency++;
1904
1904
        /* now you create the thread */
1905
 
        if (pthread_create(&mainthread, &attr, run_task, 
 
1905
        if (pthread_create(&mainthread, &attr, run_task,
1906
1906
                           (void *)con) != 0)
1907
1907
        {
1908
1908
          fprintf(stderr,"%s: Could not create thread\n", my_progname);
1912
1912
      }
1913
1913
  }
1914
1914
 
1915
 
  /* 
1916
 
    The timer_thread belongs to all threads so it too obeys the wakeup 
 
1915
  /*
 
1916
    The timer_thread belongs to all threads so it too obeys the wakeup
1917
1917
    call that run tasks obey.
1918
1918
  */
1919
1919
  if (opt_timer_length)
1922
1922
    timer_alarm= true;
1923
1923
    pthread_mutex_unlock(&timer_alarm_mutex);
1924
1924
 
1925
 
    if (pthread_create(&mainthread, &attr, timer_thread, 
 
1925
    if (pthread_create(&mainthread, &attr, timer_thread,
1926
1926
                       (void *)&opt_timer_length) != 0)
1927
1927
    {
1928
1928
      fprintf(stderr,"%s: Could not create timer thread\n", my_progname);
1972
1972
 
1973
1973
 
1974
1974
 
1975
 
  if (mysql_thread_init())
 
1975
  if (drizzle_thread_init())
1976
1976
  {
1977
 
    fprintf(stderr,"%s: mysql_thread_init() failed.\n",
 
1977
    fprintf(stderr,"%s: drizzle_thread_init() failed.\n",
1978
1978
            my_progname);
1979
1979
    exit(1);
1980
1980
  }
1981
1981
 
1982
 
  /* 
1983
 
    We lock around the initial call in case were we in a loop. This 
 
1982
  /*
 
1983
    We lock around the initial call in case were we in a loop. This
1984
1984
    also keeps the value properly syncronized across call threads.
1985
1985
  */
1986
1986
  pthread_mutex_lock(&sleeper_mutex);
2000
2000
  timer_alarm= false;
2001
2001
  pthread_mutex_unlock(&timer_alarm_mutex);
2002
2002
 
2003
 
  mysql_thread_end();
 
2003
  drizzle_thread_end();
2004
2004
  return(0);
2005
2005
}
2006
2006
 
2009
2009
  uint64_t counter= 0, queries;
2010
2010
  uint64_t detach_counter;
2011
2011
  unsigned int commit_counter;
2012
 
  MYSQL mysql;
2013
 
  MYSQL_RES *result;
2014
 
  MYSQL_ROW row;
 
2012
  DRIZZLE drizzle;
 
2013
  DRIZZLE_RES *result;
 
2014
  DRIZZLE_ROW row;
2015
2015
  statement *ptr;
2016
2016
  thread_context *con= (thread_context *)p;
2017
2017
 
2018
 
  if (mysql_thread_init())
 
2018
  if (drizzle_thread_init())
2019
2019
  {
2020
 
    fprintf(stderr,"%s: mysql_thread_init() failed.\n",
 
2020
    fprintf(stderr,"%s: drizzle_thread_init() failed.\n",
2021
2021
            my_progname);
2022
2022
    exit(1);
2023
2023
  }
2029
2029
  }
2030
2030
  pthread_mutex_unlock(&sleeper_mutex);
2031
2031
 
2032
 
  slap_connect(&mysql, true);
 
2032
  slap_connect(&drizzle, true);
2033
2033
 
2034
2034
  if (verbose >= 3)
2035
2035
    printf("connected!\n");
2037
2037
 
2038
2038
  commit_counter= 0;
2039
2039
  if (commit_rate)
2040
 
    run_query(&mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
 
2040
    run_query(&drizzle, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
2041
2041
 
2042
2042
limit_not_met:
2043
 
    for (ptr= con->stmt, detach_counter= 0; 
2044
 
         ptr && ptr->length; 
 
2043
    for (ptr= con->stmt, detach_counter= 0;
 
2044
         ptr && ptr->length;
2045
2045
         ptr= ptr->next, detach_counter++)
2046
2046
    {
2047
2047
      if (!opt_only_print && detach_rate && !(detach_counter % detach_rate))
2048
2048
      {
2049
 
        slap_close(&mysql);
2050
 
        slap_connect(&mysql, true);
 
2049
        slap_close(&drizzle);
 
2050
        slap_connect(&drizzle, true);
2051
2051
      }
2052
2052
 
2053
 
      /* 
 
2053
      /*
2054
2054
        We have to execute differently based on query type. This should become a function.
2055
2055
      */
2056
2056
      if ((ptr->type == UPDATE_TYPE_REQUIRES_PREFIX) ||
2061
2061
        char *key;
2062
2062
        char buffer[HUGE_STRING_LENGTH];
2063
2063
 
2064
 
        /* 
 
2064
        /*
2065
2065
          This should only happen if some sort of new engine was
2066
2066
          implemented that didn't properly handle UPDATEs.
2067
2067
 
2076
2076
 
2077
2077
          assert(key);
2078
2078
 
2079
 
          length= snprintf(buffer, HUGE_STRING_LENGTH, "%.*s '%s'", 
 
2079
          length= snprintf(buffer, HUGE_STRING_LENGTH, "%.*s '%s'",
2080
2080
                           (int)ptr->length, ptr->string, key);
2081
2081
 
2082
 
          if (run_query(&mysql, buffer, length))
 
2082
          if (run_query(&drizzle, buffer, length))
2083
2083
          {
2084
2084
            fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
2085
 
                    my_progname, (uint)length, buffer, mysql_error(&mysql));
 
2085
                    my_progname, (uint)length, buffer, drizzle_error(&drizzle));
2086
2086
            exit(1);
2087
2087
          }
2088
2088
        }
2089
2089
      }
2090
2090
      else
2091
2091
      {
2092
 
        if (run_query(&mysql, ptr->string, ptr->length))
 
2092
        if (run_query(&drizzle, ptr->string, ptr->length))
2093
2093
        {
2094
2094
          fprintf(stderr,"%s: Cannot run query %.*s ERROR : %s\n",
2095
 
                  my_progname, (uint)ptr->length, ptr->string, mysql_error(&mysql));
 
2095
                  my_progname, (uint)ptr->length, ptr->string, drizzle_error(&drizzle));
2096
2096
          exit(1);
2097
2097
        }
2098
2098
      }
2101
2101
      {
2102
2102
        do
2103
2103
        {
2104
 
          if (mysql_field_count(&mysql))
 
2104
          if (drizzle_field_count(&drizzle))
2105
2105
          {
2106
 
            result= mysql_store_result(&mysql);
2107
 
            while ((row = mysql_fetch_row(result)))
 
2106
            result= drizzle_store_result(&drizzle);
 
2107
            while ((row = drizzle_fetch_row(result)))
2108
2108
              counter++;
2109
 
            mysql_free_result(result);
 
2109
            drizzle_free_result(result);
2110
2110
          }
2111
 
        } while(mysql_next_result(&mysql) == 0);
 
2111
        } while(drizzle_next_result(&drizzle) == 0);
2112
2112
      }
2113
2113
      queries++;
2114
2114
 
2115
2115
      if (commit_rate && (++commit_counter == commit_rate))
2116
2116
      {
2117
2117
        commit_counter= 0;
2118
 
        run_query(&mysql, "COMMIT", strlen("COMMIT"));
 
2118
        run_query(&drizzle, "COMMIT", strlen("COMMIT"));
2119
2119
      }
2120
2120
 
2121
2121
      /* If the timer is set, and the alarm is not active then end */
2136
2136
 
2137
2137
end:
2138
2138
  if (commit_rate)
2139
 
    run_query(&mysql, "COMMIT", strlen("COMMIT"));
 
2139
    run_query(&drizzle, "COMMIT", strlen("COMMIT"));
2140
2140
 
2141
 
  slap_close(&mysql);
 
2141
  slap_close(&drizzle);
2142
2142
 
2143
2143
  pthread_mutex_lock(&counter_mutex);
2144
2144
  thread_counter--;
2147
2147
 
2148
2148
  my_free(con, MYF(0));
2149
2149
 
2150
 
  mysql_thread_end();
 
2150
  drizzle_thread_end();
2151
2151
  return(0);
2152
2152
}
2153
2153
 
2180
2180
 
2181
2181
    bzero(buffer, HUGE_STRING_LENGTH);
2182
2182
 
2183
 
    string= strchr(begin_ptr, delm); 
 
2183
    string= strchr(begin_ptr, delm);
2184
2184
 
2185
2185
    if (string)
2186
2186
    {
2239
2239
 
2240
2240
  for (tmp= *sptr= (statement *)my_malloc(sizeof(statement),
2241
2241
                                          MYF(MY_ZEROFILL|MY_FAE|MY_WME));
2242
 
       (retstr= strchr(ptr, delm)); 
 
2242
       (retstr= strchr(ptr, delm));
2243
2243
       tmp->next=  (statement *)my_malloc(sizeof(statement),
2244
2244
                                          MYF(MY_ZEROFILL|MY_FAE|MY_WME)),
2245
2245
       tmp= tmp->next)
2254
2254
 
2255
2255
  if (ptr != script+length)
2256
2256
  {
2257
 
    tmp->string= my_strndup(ptr, (uint)((script + length) - ptr), 
 
2257
    tmp->string= my_strndup(ptr, (uint)((script + length) - ptr),
2258
2258
                                       MYF(MY_FAE));
2259
2259
    tmp->length= (size_t)((script + length) - ptr);
2260
2260
    count++;
2279
2279
 
2280
2280
  for (;*ptr; ptr++)
2281
2281
    if (*ptr == ',') count++;
2282
 
  
 
2282
 
2283
2283
  /* One extra spot for the NULL */
2284
 
  nptr= *range= (uint *)my_malloc(sizeof(uint) * (count + 1), 
 
2284
  nptr= *range= (uint *)my_malloc(sizeof(uint) * (count + 1),
2285
2285
                                  MYF(MY_ZEROFILL|MY_FAE|MY_WME));
2286
2286
 
2287
2287
  ptr= (char *)string;
2315
2315
         con->min_timing / 1000, con->min_timing % 1000);
2316
2316
  printf("\tMaximum number of seconds to run all queries: %ld.%03ld seconds\n",
2317
2317
         con->max_timing / 1000, con->max_timing % 1000);
2318
 
  printf("\tTotal time for tests: %ld.%03ld seconds\n", 
 
2318
  printf("\tTotal time for tests: %ld.%03ld seconds\n",
2319
2319
         con->sum_of_time / 1000, con->sum_of_time % 1000);
2320
2320
  printf("\tStandard Deviation: %ld.%03ld\n", con->std_dev / 1000, con->std_dev % 1000);
2321
2321
  printf("\tNumber of queries in create queries: %llu\n", con->create_count);
2322
 
  printf("\tNumber of clients running queries: %u/%u\n", 
 
2322
  printf("\tNumber of clients running queries: %u/%u\n",
2323
2323
         con->users, con->real_users);
2324
2324
  printf("\tNumber of times test was run: %u\n", iterations);
2325
 
  printf("\tAverage number of queries per client: %llu\n", con->avg_rows); 
 
2325
  printf("\tAverage number of queries per client: %llu\n", con->avg_rows);
2326
2326
  printf("\n");
2327
2327
}
2328
2328
 
2347
2347
      else
2348
2348
        label_buffer[x]= opt_label[x] ;
2349
2349
    }
2350
 
  } 
 
2350
  }
2351
2351
  else if (opt_auto_generate_sql_type)
2352
2352
  {
2353
2353
    string_len= strlen(opt_auto_generate_sql_type);
2363
2363
  else
2364
2364
    snprintf(label_buffer, HUGE_STRING_LENGTH, "query");
2365
2365
 
2366
 
  snprintf(buffer, HUGE_STRING_LENGTH, 
 
2366
  snprintf(buffer, HUGE_STRING_LENGTH,
2367
2367
           "%s,%s,%ld.%03ld,%ld.%03ld,%ld.%03ld,%ld.%03ld,%ld.%03ld,%u,%u,%u,%llu\n",
2368
2368
           con->engine ? con->engine : "", /* Storage engine we ran against */
2369
2369
           label_buffer, /* Load type */
2386
2386
  stats *ptr;
2387
2387
  unsigned int x;
2388
2388
 
2389
 
  con->min_timing= sptr->timing; 
 
2389
  con->min_timing= sptr->timing;
2390
2390
  con->max_timing= sptr->timing;
2391
2391
  con->min_rows= sptr->rows;
2392
2392
  con->max_rows= sptr->rows;
2393
 
  
 
2393
 
2394
2394
  /* At the moment we assume uniform */
2395
2395
  con->users= sptr->users;
2396
2396
  con->real_users= sptr->real_users;
2397
2397
  con->avg_rows= sptr->rows;
2398
 
  
 
2398
 
2399
2399
  /* With no next, we know it is the last element that was malloced */
2400
2400
  for (ptr= sptr, x= 0; x < iterations; ptr++, x++)
2401
2401
  {
2417
2417
  standard_deviation(con, sptr);
2418
2418
 
2419
2419
  /* Now we do the create time operations */
2420
 
  con->create_min_timing= sptr->create_timing; 
 
2420
  con->create_min_timing= sptr->create_timing;
2421
2421
  con->create_max_timing= sptr->create_timing;
2422
 
  
 
2422
 
2423
2423
  /* At the moment we assume uniform */
2424
2424
  con->create_count= sptr->create_count;
2425
 
  
 
2425
 
2426
2426
  /* With no next, we know it is the last element that was malloced */
2427
2427
  for (ptr= sptr, x= 0; x < iterations; ptr++, x++)
2428
2428
  {
2447
2447
  {
2448
2448
    nptr= ptr->next;
2449
2449
    if (ptr->string)
2450
 
      my_free(ptr->string, MYF(0)); 
 
2450
      my_free(ptr->string, MYF(0));
2451
2451
    if (ptr->option)
2452
 
      my_free(ptr->option, MYF(0)); 
 
2452
      my_free(ptr->option, MYF(0));
2453
2453
    my_free(ptr, MYF(0));
2454
2454
  }
2455
2455
}
2465
2465
  {
2466
2466
    nptr= ptr->next;
2467
2467
    if (ptr->string)
2468
 
      my_free(ptr->string, MYF(0)); 
 
2468
      my_free(ptr->string, MYF(0));
2469
2469
    my_free(ptr, MYF(0));
2470
2470
  }
2471
2471
}
2472
2472
 
2473
 
void 
2474
 
slap_close(MYSQL *mysql)
 
2473
void
 
2474
slap_close(DRIZZLE *drizzle)
2475
2475
{
2476
 
  if (opt_only_print) 
 
2476
  if (opt_only_print)
2477
2477
    return;
2478
2478
 
2479
 
  mysql_close(mysql);
 
2479
  drizzle_close(drizzle);
2480
2480
}
2481
2481
 
2482
 
void 
2483
 
slap_connect(MYSQL *mysql, bool connect_to_schema)
 
2482
void
 
2483
slap_connect(DRIZZLE *drizzle, bool connect_to_schema)
2484
2484
{
2485
2485
  /* Connect to server */
2486
2486
  static ulong connection_retry_sleep= 100000; /* Microseconds */
2487
2487
  int x, connect_error= 1;
2488
2488
 
2489
 
  if (opt_only_print) 
 
2489
  if (opt_only_print)
2490
2490
    return;
2491
2491
 
2492
2492
  if (opt_delayed_start)
2493
2493
    my_sleep(random()%opt_delayed_start);
2494
2494
 
2495
 
  mysql_init(mysql);
 
2495
  drizzle_create(drizzle);
2496
2496
 
2497
2497
  if (opt_compress)
2498
 
    mysql_options(mysql,MYSQL_OPT_COMPRESS,NullS);
 
2498
    drizzle_options(drizzle,DRIZZLE_OPT_COMPRESS,NullS);
2499
2499
  /* We always do opt_protocol to TCP/IP */
2500
 
  mysql_options(mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
2501
 
  mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset);
 
2500
  drizzle_options(drizzle,DRIZZLE_OPT_PROTOCOL,(char*)&opt_protocol);
 
2501
  drizzle_options(drizzle, DRIZZLE_SET_CHARSET_NAME, default_charset);
2502
2502
 
2503
2503
  for (x= 0; x < 10; x++)
2504
2504
  {
2505
2505
 
2506
2506
 
2507
 
    if (mysql_real_connect(mysql, host, user, opt_password,
 
2507
    if (drizzle_connect(drizzle, host, user, opt_password,
2508
2508
                           connect_to_schema ? create_schema_string : NULL,
2509
 
                           opt_mysql_port,
2510
 
                           opt_mysql_unix_port,
 
2509
                           opt_drizzle_port,
 
2510
                           opt_drizzle_unix_port,
2511
2511
                           connect_flags))
2512
2512
    {
2513
2513
      /* Connect suceeded */
2519
2519
  if (connect_error)
2520
2520
  {
2521
2521
    fprintf(stderr,"%s: Error when connecting to server: %d %s\n",
2522
 
            my_progname, mysql_errno(mysql), mysql_error(mysql));
 
2522
            my_progname, drizzle_errno(drizzle), drizzle_error(drizzle));
2523
2523
    exit(1);
2524
2524
  }
2525
2525
 
2526
2526
  return;
2527
2527
}
2528
2528
 
2529
 
void 
 
2529
void
2530
2530
standard_deviation (conclusions *con, stats *sptr)
2531
2531
{
2532
2532
  unsigned int x;