Commit 792073a3 authored by Dmitry Shulga's avatar Dmitry Shulga

Auto-merge from mysql-5.1 for bug#57450.

parents 7e34d8c3 2f0ba4c3
...@@ -28,11 +28,13 @@ typedef struct st_line_buffer ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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; ...@@ -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 #
......
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