Auto-merge from mysql-5.1 for bug#57450.
This commit is contained in:
commit
792073a36a
@ -28,11 +28,13 @@ typedef struct st_line_buffer
|
|||||||
uint eof;
|
uint eof;
|
||||||
ulong max_size;
|
ulong max_size;
|
||||||
ulong read_length; /* Length of last read string */
|
ulong read_length; /* Length of last read string */
|
||||||
|
int error;
|
||||||
|
bool truncated;
|
||||||
} LINE_BUFFER;
|
} LINE_BUFFER;
|
||||||
|
|
||||||
extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file);
|
extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file);
|
||||||
extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str);
|
extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str);
|
||||||
extern char *batch_readline(LINE_BUFFER *buffer, bool *truncated);
|
extern char *batch_readline(LINE_BUFFER *buffer);
|
||||||
extern void batch_readline_end(LINE_BUFFER *buffer);
|
extern void batch_readline_end(LINE_BUFFER *buffer);
|
||||||
|
|
||||||
#endif /* CLIENT_MY_READLINE_INCLUDED */
|
#endif /* CLIENT_MY_READLINE_INCLUDED */
|
||||||
|
@ -1839,14 +1839,13 @@ static int read_and_execute(bool interactive)
|
|||||||
ulong line_number=0;
|
ulong line_number=0;
|
||||||
bool ml_comment= 0;
|
bool ml_comment= 0;
|
||||||
COMMANDS *com;
|
COMMANDS *com;
|
||||||
bool truncated= 0;
|
|
||||||
status.exit_status=1;
|
status.exit_status=1;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (!interactive)
|
if (!interactive)
|
||||||
{
|
{
|
||||||
line=batch_readline(status.line_buff, &truncated);
|
line=batch_readline(status.line_buff);
|
||||||
/*
|
/*
|
||||||
Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF.
|
Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF.
|
||||||
Editors like "notepad" put this marker in
|
Editors like "notepad" put this marker in
|
||||||
@ -1909,9 +1908,13 @@ static int read_and_execute(bool interactive)
|
|||||||
if (opt_outfile && line)
|
if (opt_outfile && line)
|
||||||
fprintf(OUTFILE, "%s\n", line);
|
fprintf(OUTFILE, "%s\n", line);
|
||||||
}
|
}
|
||||||
if (!line) // End of file
|
// End of file or system error
|
||||||
|
if (!line)
|
||||||
{
|
{
|
||||||
status.exit_status=0;
|
if (status.line_buff && status.line_buff->error)
|
||||||
|
status.exit_status= 1;
|
||||||
|
else
|
||||||
|
status.exit_status= 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1932,7 +1935,8 @@ static int read_and_execute(bool interactive)
|
|||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (add_line(glob_buffer,line,&in_string,&ml_comment, truncated))
|
if (add_line(glob_buffer, line, &in_string, &ml_comment,
|
||||||
|
status.line_buff ? status.line_buff->truncated : 0))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* if in batch mode, send last query even if it doesn't end with \g or go */
|
/* if in batch mode, send last query even if it doesn't end with \g or go */
|
||||||
|
@ -24,7 +24,7 @@ static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size,
|
|||||||
ulong max_size);
|
ulong max_size);
|
||||||
static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str);
|
static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str);
|
||||||
static size_t fill_buffer(LINE_BUFFER *buffer);
|
static size_t fill_buffer(LINE_BUFFER *buffer);
|
||||||
static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated);
|
static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length);
|
||||||
|
|
||||||
|
|
||||||
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
||||||
@ -42,13 +42,12 @@ LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *batch_readline(LINE_BUFFER *line_buff, bool *truncated)
|
char *batch_readline(LINE_BUFFER *line_buff)
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
ulong out_length;
|
ulong out_length;
|
||||||
DBUG_ASSERT(truncated != NULL);
|
|
||||||
|
|
||||||
if (!(pos=intern_read_line(line_buff,&out_length, truncated)))
|
if (!(pos=intern_read_line(line_buff, &out_length)))
|
||||||
return 0;
|
return 0;
|
||||||
if (out_length && pos[out_length-1] == '\n')
|
if (out_length && pos[out_length-1] == '\n')
|
||||||
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
|
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
|
||||||
@ -162,7 +161,10 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
if (!(buffer->buffer = (char*) my_realloc(buffer->buffer,
|
if (!(buffer->buffer = (char*) my_realloc(buffer->buffer,
|
||||||
buffer->bufread+1,
|
buffer->bufread+1,
|
||||||
MYF(MY_WME | MY_FAE))))
|
MYF(MY_WME | MY_FAE))))
|
||||||
return (uint) -1;
|
{
|
||||||
|
buffer->error= my_errno;
|
||||||
|
return (size_t) -1;
|
||||||
|
}
|
||||||
buffer->start_of_line=buffer->buffer+start_offset;
|
buffer->start_of_line=buffer->buffer+start_offset;
|
||||||
buffer->end=buffer->buffer+bufbytes;
|
buffer->end=buffer->buffer+bufbytes;
|
||||||
}
|
}
|
||||||
@ -177,7 +179,10 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
/* Read in new stuff. */
|
/* Read in new stuff. */
|
||||||
if ((read_count= my_read(buffer->file, (uchar*) buffer->end, read_count,
|
if ((read_count= my_read(buffer->file, (uchar*) buffer->end, read_count,
|
||||||
MYF(MY_WME))) == MY_FILE_ERROR)
|
MYF(MY_WME))) == MY_FILE_ERROR)
|
||||||
|
{
|
||||||
|
buffer->error= my_errno;
|
||||||
return (size_t) -1;
|
return (size_t) -1;
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count));
|
DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count));
|
||||||
|
|
||||||
@ -198,8 +203,7 @@ static size_t fill_buffer(LINE_BUFFER *buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length)
|
||||||
char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated)
|
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
size_t length;
|
size_t length;
|
||||||
@ -214,22 +218,25 @@ char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated)
|
|||||||
if (pos == buffer->end)
|
if (pos == buffer->end)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
fill_buffer() can return 0 either on EOF in which case we abort
|
fill_buffer() can return NULL on EOF (in which case we abort),
|
||||||
or when the internal buffer has hit the size limit. In the latter case
|
on error, or when the internal buffer has hit the size limit.
|
||||||
return what we have read so far and signal string truncation.
|
In the latter case return what we have read so far and signal
|
||||||
|
string truncation.
|
||||||
*/
|
*/
|
||||||
if (!(length=fill_buffer(buffer)) || length == (uint) -1)
|
if (!(length= fill_buffer(buffer)))
|
||||||
{
|
{
|
||||||
if (buffer->eof)
|
if (buffer->eof)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
else if (length == (size_t) -1)
|
||||||
|
DBUG_RETURN(NULL);
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
pos--; /* break line here */
|
pos--; /* break line here */
|
||||||
*truncated= 1;
|
buffer->truncated= 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*truncated= 0;
|
buffer->truncated= 0;
|
||||||
buffer->end_of_line=pos+1;
|
buffer->end_of_line=pos+1;
|
||||||
*out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line);
|
*out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line);
|
||||||
DBUG_RETURN(buffer->start_of_line);
|
DBUG_RETURN(buffer->start_of_line);
|
||||||
|
@ -425,6 +425,12 @@ drop table t1;
|
|||||||
--echo
|
--echo
|
||||||
--exec $MYSQL --skip-column-names --vertical test -e "select 1 as a"
|
--exec $MYSQL --skip-column-names --vertical test -e "select 1 as a"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#57450: mysql client enter in an infinite loop if the standard input is a directory
|
||||||
|
#
|
||||||
|
--error 1
|
||||||
|
--exec $MYSQL < .
|
||||||
|
|
||||||
--echo
|
--echo
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
Loading…
x
Reference in New Issue
Block a user