Commit d2c97cde authored by unknown's avatar unknown
Browse files

Fix 'source' command in mysql client to handle delimiter command

in sourced file properly. (Bug #11523)


client/mysql.cc:
  Rename read_lines() to read_and_execute() and change interface so it
  is clear when we are reading and processing lines interactively versus
  in batch mode or from a file being sourced.
mysql-test/r/mysql.result:
  Add results
mysql-test/t/mysql_delimiter.sql:
  Add new test
mysql-test/t/mysql_delimiter_source.sql:
  New BitKeeper file ``mysql-test/t/mysql_delimiter_source.sql''
parent c4187de6
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ static int com_nopager(String *str, char*), com_pager(String *str, char*),
           com_edit(String *str,char*), com_shell(String *str, char *);
#endif

static int read_lines(bool execute_commands);
static int read_and_execute(bool interactive);
static int sql_connect(char *host,char *database,char *user,char *password,
		       uint silent);
static int put_info(const char *str,INFO_TYPE info,uint error=0,
@@ -468,7 +468,7 @@ int main(int argc,char *argv[])
	  "Type 'help [[%]function name[%]]' to get help on usage of function.\n");
#endif
  put_info(buff,INFO_INFO);
  status.exit_status=read_lines(1);		// read lines and execute them
  status.exit_status= read_and_execute(!status.batch);
  if (opt_outfile)
    end_tee();
  mysql_end(0);
@@ -948,7 +948,7 @@ static int get_options(int argc, char **argv)
  return(0);
}

static int read_lines(bool execute_commands)
static int read_and_execute(bool interactive)
{
#if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
  char linebuffer[254];
@@ -963,7 +963,7 @@ static int read_lines(bool execute_commands)
  
  for (;;)
  {
    if (status.batch || !execute_commands)
    if (!interactive)
    {
      line=batch_readline(status.line_buff);
      line_number++;
@@ -1041,7 +1041,7 @@ static int read_lines(bool execute_commands)
      Check if line is a mysql command line
      (We want to allow help, print and clear anywhere at line start
    */
    if (execute_commands && (named_cmds || glob_buffer.is_empty()) 
    if ((named_cmds || glob_buffer.is_empty())
	&& !in_string && (com=find_command(line,0)))
    {
      if ((*com->func)(&glob_buffer,line) > 0)
@@ -1049,7 +1049,7 @@ static int read_lines(bool execute_commands)
      if (glob_buffer.is_empty())		// If buffer was emptied
	in_string=0;
#ifdef HAVE_READLINE
      if (status.add_to_history && not_in_history(line))
      if (interactive && status.add_to_history && not_in_history(line))
	add_history(line);
#endif
      continue;
@@ -1059,7 +1059,7 @@ static int read_lines(bool execute_commands)
  }
  /* if in batch mode, send last query even if it doesn't end with \g or go */

  if ((status.batch || !execute_commands) && !status.exit_status)
  if (!interactive && !status.exit_status)
  {
    remove_cntrl(glob_buffer);
    if (!glob_buffer.is_empty())
@@ -2777,7 +2777,7 @@ static int com_source(String *buffer, char *line)
  status.line_buff=line_buff;
  status.file_name=source_name;
  glob_buffer.length(0);			// Empty command buffer
  error=read_lines(0);				// Read lines from file
  error= read_and_execute(false);
  status=old_status;				// Continue as before
  my_fclose(sql_file,MYF(0));
  batch_readline_end(line_buff);
+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ a
Test delimiter delimiter
a
1
Tables_in_test
t1
t2
t3

Test delimiter : from command line
a
+4 −1
Original line number Diff line number Diff line
@@ -45,4 +45,7 @@ delimiter delimiter
select * from t1 delimiter
delimiter ; # Reset delimiter

#
# Bug #11523: \d works differently than delimiter
#
source t/mysql_delimiter_source.sql
+8 −0
Original line number Diff line number Diff line
delimiter //
create table t2 (a int) //
delimiter ;
\d //
create table t3 (a int) //
\d ;
show tables;
drop table t2, t3;