Commit 888f9676 authored by unknown's avatar unknown
Browse files

Merge bk-internal:/home/bk/mysql-5.1-new

into  neptunus.(none):/home/msvensson/mysql/mysql-5.1

parents 03fa691e 4960c7ad
Loading
Loading
Loading
Loading
+148 −6
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ static my_bool verbose=0,tFlag=0,dFlag=0,quick= 1, extended_insert= 1,
                opt_complete_insert= 0, opt_drop_database= 0,
                opt_replace_into= 0,
                opt_dump_triggers= 0, opt_routines=0, opt_tz_utc=1,
                opt_events= 0,
                opt_alltspcs=0;
static ulong opt_max_allowed_packet, opt_net_buffer_length;
static MYSQL mysql_connection,*sock=0;
@@ -232,6 +233,9 @@ static struct my_option my_long_options[] =
  {"disable-keys", 'K',
   "'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output.", (gptr*) &opt_disable_keys,
   (gptr*) &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
  {"events", 'E', "Dump events.",
     (gptr*) &opt_events, (gptr*) &opt_events, 0, GET_BOOL,
     NO_ARG, 0, 0, 0, 0, 0, 0},
  {"extended-insert", 'e',
   "Allows utilization of the new, much faster INSERT syntax.",
   (gptr*) &extended_insert, (gptr*) &extended_insert, 0, GET_BOOL, NO_ARG,
@@ -1239,9 +1243,136 @@ static void print_xml_row(FILE *xml_file, const char *row_name,
  check_io(xml_file);
}


/*
 create_delimiter
 Generate a new (null-terminated) string that does not exist in  query 
 and is therefore suitable for use as a query delimiter.  Store this
 delimiter in  delimiter_buff .
 
 This is quite simple in that it doesn't even try to parse statements as an
 interpreter would.  It merely returns a string that is not in the query, which
 is much more than adequate for constructing a delimiter.

 RETURN
   ptr to the delimiter  on Success
   NULL                  on Failure
*/
static char *create_delimiter(char *query, char *delimiter_buff, 
                              int delimiter_max_size) 
{
  int proposed_length;
  char *presence;

  delimiter_buff[0]= ';';  /* start with one semicolon, and */

  for (proposed_length= 2; proposed_length < delimiter_max_size; 
      delimiter_max_size++) {

    delimiter_buff[proposed_length-1]= ';';  /* add semicolons, until */
    delimiter_buff[proposed_length]= '\0';

    presence = strstr(query, delimiter_buff);
    if (presence == NULL) { /* the proposed delimiter is not in the query. */
       return delimiter_buff;
    }

  }
  return NULL;  /* but if we run out of space, return nothing at all. */
}


/*
  dump_events_for_db
  -- retrieves list of events for a given db, and prints out
  the CREATE EVENT statement into the output (the dump).

  RETURN
    0  Success
    1  Error
*/
static uint dump_events_for_db(char *db)
{
  char       query_buff[QUERY_LENGTH];
  char       db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
  char       *event_name;
  char       delimiter[QUERY_LENGTH], *delimit_test;
  FILE       *sql_file= md_result_file;
  MYSQL_RES  *event_res, *event_list_res;
  MYSQL_ROW  row, event_list_row;
  DBUG_ENTER("dump_events_for_db");
  DBUG_PRINT("enter", ("db: '%s'", db));

  mysql_real_escape_string(sock, db_name_buff, db, strlen(db));

  /* nice comments */
  if (opt_comments)
    fprintf(sql_file, "\n--\n-- Dumping events for database '%s'\n--\n", db);

  /*
    not using "mysql_query_with_error_report" because we may have not
    enough privileges to lock mysql.events.
  */
  if (lock_tables)
    mysql_query(sock, "LOCK TABLES mysql.event READ");

  if (mysql_query_with_error_report(sock, &event_list_res, "show events"))
  {
    safe_exit(EX_MYSQLERR);
    DBUG_RETURN(0);
  }

  strcpy(delimiter, ";");
  if (mysql_num_rows(event_list_res) > 0)
  {
    while ((event_list_row= mysql_fetch_row(event_list_res)) != NULL)
    {
      event_name= quote_name(event_list_row[1], name_buff, 0);
      DBUG_PRINT("info", ("retrieving CREATE EVENT for %s", name_buff));
      my_snprintf(query_buff, sizeof(query_buff), "SHOW CREATE EVENT %s", 
          event_name);

      if (mysql_query_with_error_report(sock, &event_res, query_buff))
        DBUG_RETURN(1);

      while ((row= mysql_fetch_row(event_res)) != NULL)
      {
        /*
          if the user has EXECUTE privilege he can see event names, but not the
          event body!
        */
        if (strlen(row[2]) != 0)
        {
          if (opt_drop)
            fprintf(sql_file, "/*!50106 DROP EVENT IF EXISTS %s */%s\n", 
                event_name, delimiter);

          delimit_test= create_delimiter(row[2], delimiter, sizeof(delimiter)); 
          if (delimit_test == NULL) {
            fprintf(stderr, "%s: Warning: Can't dump event '%s'\n", 
                event_name, my_progname);
            DBUG_RETURN(1);
          }

          fprintf(sql_file, "DELIMITER %s\n", delimiter);
          fprintf(sql_file, "/*!50106 %s */ %s\n", row[2], delimiter);
        }
      } /* end of event printing */
    } /* end of list of events */
    fprintf(sql_file, "DELIMITER ;\n");
    mysql_free_result(event_res);
  }
  mysql_free_result(event_list_res);

  if (lock_tables)
    VOID(mysql_query_with_error_report(sock, 0, "UNLOCK TABLES"));
  DBUG_RETURN(0);
}


/*
  dump_routines_for_db
  -- retrievs list of routines for a given db, and prints out
  -- retrieves list of routines for a given db, and prints out
  the CREATE PROCEDURE definition into the output (the dump).

  This function has logic to print the appropriate syntax depending on whether
@@ -1254,7 +1385,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name,

static uint dump_routines_for_db(char *db)
{
  char       query_buff[512];
  char       query_buff[QUERY_LENGTH];
  const char *routine_type[]= {"FUNCTION", "PROCEDURE"};
  char       db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
  char       *routine_name;
@@ -1295,9 +1426,9 @@ static uint dump_routines_for_db(char *db)

      while ((routine_list_row= mysql_fetch_row(routine_list_res)))
      {
        routine_name= quote_name(routine_list_row[1], name_buff, 0);
        DBUG_PRINT("info", ("retrieving CREATE %s for %s", routine_type[i],
                            name_buff));
        routine_name= quote_name(routine_list_row[1], name_buff, 0);
        my_snprintf(query_buff, sizeof(query_buff), "SHOW CREATE %s %s",
                    routine_type[i], routine_name);

@@ -1410,7 +1541,7 @@ static uint get_table_structure(char *table, char *db, char *table_type,
  char	     *result_table, *opt_quoted_table;
  const char *insert_option;
  char	     name_buff[NAME_LEN+3],table_buff[NAME_LEN*2+3];
  char	     table_buff2[NAME_LEN*2+3], query_buff[512];
  char	     table_buff2[NAME_LEN*2+3], query_buff[QUERY_LENGTH];
  FILE       *sql_file = md_result_file;
  int        len;
  MYSQL_RES  *result;
@@ -1886,7 +2017,7 @@ static void dump_triggers_for_table (char *table, char *db)
{
  char	     *result_table;
  char	     name_buff[NAME_LEN*4+3], table_buff[NAME_LEN*2+3];
  char       query_buff[512];
  char       query_buff[QUERY_LENGTH];
  uint old_opt_compatible_mode=opt_compatible_mode;
  FILE       *sql_file = md_result_file;
  MYSQL_RES  *result;
@@ -2546,7 +2677,6 @@ static int dump_all_tablespaces()
{
  MYSQL_ROW row;
  MYSQL_RES *tableres;
  int result=0;
  char buf[FN_REFLEN];
  int first;

@@ -2844,6 +2974,12 @@ static int dump_all_tables_in_db(char *database)
        dump_triggers_for_table(table, database);
    }
  }
  if (opt_events && !opt_xml &&
      mysql_get_server_version(sock) >= 50106)
  {
    DBUG_PRINT("info", ("Dumping events for database %s", database));
    dump_events_for_db(database);
  }
  if (opt_routines && !opt_xml &&
      mysql_get_server_version(sock) >= 50009)
  {
@@ -3054,6 +3190,12 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
      get_view_structure(table_name, db);
    }
  }
  if (opt_events && !opt_xml &&
      mysql_get_server_version(sock) >= 50106)
  {
    DBUG_PRINT("info", ("Dumping events for database %s", db));
    dump_events_for_db(db);
  }
  /* obtain dump of routines (procs/functions) */
  if (opt_routines  && !opt_xml &&
      mysql_get_server_version(sock) >= 50009)
+37 −0
Original line number Diff line number Diff line
@@ -2907,3 +2907,40 @@ mysql-import: Error: 1146, Table 'test.words' doesn't exist, when using table: w
drop table t1;
drop table t2;
drop table words2;
create database first;
use first;
set time_zone = 'UTC';
create event ee1 on schedule at '2035-12-31 20:01:23' do set @a=5;
show events;
Db	Name	Definer	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
first	ee1	root@localhost	ONE TIME	2035-12-31 20:01:23	NULL	NULL	NULL	NULL	ENABLED
show create event ee1;
Event	sql_mode	Create Event
ee1		CREATE EVENT `ee1` ON SCHEDULE AT '2035-12-31 20:01:23' ON COMPLETION NOT PRESERVE ENABLE DO set @a=5
drop database first;
create database second;
use second;
show events;
Db	Name	Definer	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
second	ee1	root@localhost	ONE TIME	2035-12-31 20:01:23	NULL	NULL	NULL	NULL	ENABLED
show create event ee1;
Event	sql_mode	Create Event
ee1	NO_AUTO_VALUE_ON_ZERO	CREATE EVENT `ee1` ON SCHEDULE AT '2035-12-31 20:01:23' ON COMPLETION NOT PRESERVE ENABLE DO set @a=5
create event ee2 on schedule at '2018-12-31 21:01:23' do set @a=5;
create event ee3 on schedule at '2030-12-31 22:01:23' do set @a=5;
show events;
Db	Name	Definer	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
second	ee1	root@localhost	ONE TIME	2035-12-31 20:01:23	NULL	NULL	NULL	NULL	ENABLED
second	ee2	root@localhost	ONE TIME	2018-12-31 21:01:23	NULL	NULL	NULL	NULL	ENABLED
second	ee3	root@localhost	ONE TIME	2030-12-31 22:01:23	NULL	NULL	NULL	NULL	ENABLED
drop database second;
create database third;
use third;
show events;
Db	Name	Definer	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
third	ee1	root@localhost	ONE TIME	2035-12-31 20:01:23	NULL	NULL	NULL	NULL	ENABLED
third	ee2	root@localhost	ONE TIME	2018-12-31 21:01:23	NULL	NULL	NULL	NULL	ENABLED
third	ee3	root@localhost	ONE TIME	2030-12-31 22:01:23	NULL	NULL	NULL	NULL	ENABLED
drop database third;
set time_zone = 'SYSTEM';
use test;
+6 −4
Original line number Diff line number Diff line
drop table if exists t1, t2, t3, t4, t5, t6, t7, t8;
CREATE TABLE t1 (
a int unsigned NOT NULL PRIMARY KEY,
b int unsigned not null,
c int unsigned,
UNIQUE(b)	
a int NOT NULL PRIMARY KEY,
b int not null,
c int,
UNIQUE ib(b)
) engine=ndbcluster;
insert t1 values(1, 2, 3), (2, 3, 5), (3, 4, 6), (4, 5, 8), (5,6, 2), (6,7, 2);
select * from t1 order by b;
@@ -43,6 +43,8 @@ a b c
6	7	2
7	8	3
8	2	3
alter table t1 drop index ib;
insert into t1 values(1, 2, 3);
drop table t1;
CREATE TABLE t1 (
a int unsigned NOT NULL PRIMARY KEY,
+6 −0
Original line number Diff line number Diff line
@@ -422,4 +422,10 @@ partition_name partition_description table_rows
x123	11,12	1
x234	NULL,1	1
drop table t1;
create table t1 (a int)
partition by list (a)
(partition p0 values in (1));
alter table t1 rebuild partition;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
drop table t1;
End of 5.1 tests
+40 −0
Original line number Diff line number Diff line
@@ -1166,3 +1166,43 @@ drop table t1;
drop table t2;

drop table words2;

#
# BUG# 16853: mysqldump doesn't show events
#
create database first;
use first;
set time_zone = 'UTC';

## prove one works
create event ee1 on schedule at '2035-12-31 20:01:23' do set @a=5;
show events;
show create event ee1;
--exec $MYSQL_DUMP --events first > $MYSQLTEST_VARDIR/tmp/bug16853-1.sql
drop database first;

create database second;
use second;
--exec $MYSQL second < $MYSQLTEST_VARDIR/tmp/bug16853-1.sql
show events;
show create event ee1;

## prove three works
# start with one from the previous restore
create event ee2 on schedule at '2018-12-31 21:01:23' do set @a=5;
create event ee3 on schedule at '2030-12-31 22:01:23' do set @a=5;
show events;
--exec $MYSQL_DUMP --events second > $MYSQLTEST_VARDIR/tmp/bug16853-2.sql
drop database second;

create database third;
use third;
--exec $MYSQL third < $MYSQLTEST_VARDIR/tmp/bug16853-2.sql
show events;
drop database third;

# revert back to normal settings
set time_zone = 'SYSTEM';
use test;

#####
Loading