diff options
author | monty@mysql.com <> | 2004-03-19 18:33:38 +0200 |
---|---|---|
committer | monty@mysql.com <> | 2004-03-19 18:33:38 +0200 |
commit | b49b24d94af43c965b26d81242dcec17aa7c2181 (patch) | |
tree | 7b70c20edffefc6a9a26014ddd3c8956f5248a2d /client | |
parent | 933278a52bb107feab2d4dcfd8b5ba9f51cc1896 (diff) | |
download | mariadb-git-b49b24d94af43c965b26d81242dcec17aa7c2181.tar.gz |
Added test to show bug in current union implementation
After merge fixes
Portability fixes
Diffstat (limited to 'client')
-rw-r--r-- | client/mysqltest.c | 75 |
1 files changed, 56 insertions, 19 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index 1db385b85cb..4bcfe93c278 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -109,6 +109,7 @@ MYSQL_MANAGER* manager=0; static char **default_argv; static const char *load_default_groups[]= { "mysqltest","client",0 }; +static char line_buffer[MAX_DELIMITER], *line_buffer_pos= line_buffer;; static FILE* file_stack[MAX_INCLUDE_DEPTH]; static FILE** cur_file; @@ -885,7 +886,10 @@ int do_exec(struct st_query* q) if (disable_result_log) { while (fgets(buf, sizeof(buf), res_file)) - {} + { + buf[strlen(buf)-1]=0; + DBUG_PRINT("exec_result",("%s", buf)); + } } else { @@ -1648,24 +1652,48 @@ int do_while(struct st_query* q) } -my_bool end_of_query(int c, char* p) +/* + Read characters from line buffer or file. This is needed to allow + my_ungetc() to buffer MAX_DELIMITER characters for a file + + NOTE: + This works as long as one doesn't change files (with 'source file_name') + when there is things pushed into the buffer. This should however not + happen for any tests in the test suite. +*/ + +char my_getc(FILE *file) +{ + if (line_buffer_pos == line_buffer) + return fgetc(file); + return line_buffer[--line_buffer_pos]; +} + +void my_ungetc(int c) +{ + line_buffer[line_buffer_pos++]= c; +} + + +my_bool end_of_query(int c) { - uint i, j; - int tmp[MAX_DELIMITER]= {0}; + uint i,j; + char tmp[MAX_DELIMITER]; + + if (c != *delimiter) + return 0; - for (i= 0; c == *(delimiter + i) && i < delimiter_length; - i++, c= fgetc(*cur_file)) + for (i= 1; i < delimiter_length && + (c= my_getc(*cur_file)) == *(delimiter + i); + i++) tmp[i]= c; - tmp[i]= c; - for (j= i; j > 0 && i != delimiter_length; j--) - ungetc(tmp[j], *cur_file); if (i == delimiter_length) - { - ungetc(tmp[i], *cur_file); - *p= 0; - return 1; - } + return 1; /* Found delimiter */ + + /* didn't find delimiter, push back things that we read */ + for (j = 1 ; j <= i ; j++) + my_ungetc(tmp[j]); return 0; } @@ -1683,7 +1711,7 @@ int read_line(char* buf, int size) for (; p < buf_end ;) { no_save= 0; - c= fgetc(*cur_file); + c= my_getc(*cur_file); if (feof(*cur_file)) { if ((*cur_file) != stdin) @@ -1698,8 +1726,11 @@ int read_line(char* buf, int size) switch(state) { case R_NORMAL: /* Only accept '{' in the beginning of a line */ - if (end_of_query(c, p)) + if (end_of_query(c)) + { + *p= 0; return 0; + } else if (c == '\'') state = R_Q1; else if (c == '"') @@ -1735,7 +1766,7 @@ int read_line(char* buf, int size) *buf= 0; return 0; } - else if (end_of_query(c, p) || c == '{') + else if (end_of_query(c) || c == '{') { *p= 0; return 0; @@ -1755,8 +1786,11 @@ int read_line(char* buf, int size) state= R_ESC_SLASH_Q1; break; case R_ESC_Q_Q1: - if (end_of_query(c, p)) + if (end_of_query(c)) + { + *p= 0; return 0; + } if (c != '\'') state= R_NORMAL; else @@ -1773,8 +1807,11 @@ int read_line(char* buf, int size) state= R_ESC_SLASH_Q2; break; case R_ESC_Q_Q2: - if (end_of_query(c, p)) + if (end_of_query(c)) + { + *p= 0; return 0; + } if (c != '"') state= R_NORMAL; else |