20
20
* Written by:
21
21
* Sasha Pachev <sasha@mysql.com>
22
22
* Matt Wagner <matt@mysql.com>
23
- *
23
+ * Monty
24
24
**/
25
25
26
- #define MTEST_VERSION "1.1 "
26
+ #define MTEST_VERSION "1.2 "
27
27
28
28
#include "global.h"
29
29
#include "my_sys.h"
41
41
#include <unistd.h>
42
42
#include <errno.h>
43
43
44
- #define MAX_QUERY 16384
44
+ #define MAX_QUERY 65536
45
45
#define PAD_SIZE 128
46
46
#define MAX_CONS 1024
47
47
#define MAX_INCLUDE_DEPTH 16
51
51
#define BLOCK_STACK_DEPTH 32
52
52
53
53
int record = 0 , verbose = 0 , silent = 0 ;
54
- const char * record_mode = "r" ;
55
54
static char * db = 0 , * pass = 0 ;
56
55
const char * user = 0 , * host = 0 , * unix_sock = 0 ;
57
56
int port = 0 ;
57
+ static uint start_lineno , * lineno ;
58
+
58
59
static const char * load_default_groups []= { "mysqltest" ,"client" ,0 };
59
60
60
61
FILE * file_stack [MAX_INCLUDE_DEPTH ];
61
62
FILE * * cur_file ;
62
63
FILE * * file_stack_end ;
64
+ uint lineno_stack [MAX_INCLUDE_DEPTH ];
63
65
64
66
int block_stack [BLOCK_STACK_DEPTH ];
65
67
int * cur_block , * block_stack_end ;
@@ -182,7 +184,7 @@ static void verbose_msg(const char* fmt, ...)
182
184
183
185
va_start (args , fmt );
184
186
185
- fprintf (stderr , "%s: " , my_progname );
187
+ fprintf (stderr , "%s: At line %u: " , my_progname , start_lineno );
186
188
vfprintf (stderr , fmt , args );
187
189
fprintf (stderr , "\n" );
188
190
va_end (args );
@@ -365,6 +367,7 @@ int open_file(const char* name)
365
367
die ("Source directives are nesting too deep" );
366
368
if (!(* cur_file = my_fopen (name , O_RDONLY , MYF (MY_WME ))))
367
369
die ("Could not read '%s': errno %d\n" , name , errno );
370
+ * ++ lineno = 1 ;
368
371
369
372
return 0 ;
370
373
}
@@ -751,6 +754,7 @@ int read_line(char* buf, int size)
751
754
R_ESC_SLASH_Q1 , R_ESC_SLASH_Q2 ,
752
755
R_Q2 , R_COMMENT , R_LINE_START } state = R_LINE_START ;
753
756
757
+ start_lineno = * lineno ;
754
758
for (; p < buf_end ;)
755
759
{
756
760
no_save = 0 ;
@@ -764,15 +768,15 @@ int read_line(char* buf, int size)
764
768
else
765
769
{
766
770
cur_file -- ;
771
+ lineno -- ;
767
772
continue ;
768
773
}
769
774
}
770
775
771
776
switch (state ) {
772
777
case R_NORMAL :
773
- if (c == ';' || c == '{' ) /* '{' allows some interesting syntax
774
- * but we don't care, as long as the
775
- * correct sytnax gets parsed right */
778
+ /* Only accept '{' in the beginning of a line */
779
+ if (c == ';' )
776
780
{
777
781
* p = 0 ;
778
782
return 0 ;
@@ -782,13 +786,16 @@ int read_line(char* buf, int size)
782
786
else if (c == '"' )
783
787
state = R_Q2 ;
784
788
else if (c == '\n' )
789
+ {
785
790
state = R_LINE_START ;
786
-
791
+ (* lineno )++ ;
792
+ }
787
793
break ;
788
794
case R_COMMENT :
789
795
if (c == '\n' )
790
796
{
791
797
* p = 0 ;
798
+ (* lineno )++ ;
792
799
return 0 ;
793
800
}
794
801
break ;
@@ -798,7 +805,11 @@ int read_line(char* buf, int size)
798
805
state = R_COMMENT ;
799
806
}
800
807
else if (isspace (c ))
808
+ {
809
+ if (c == '\n' )
810
+ start_lineno = ++ * lineno ; /* Query hasn't started yet */
801
811
no_save = 1 ;
812
+ }
802
813
else if (c == '}' )
803
814
{
804
815
* buf ++ = '}' ;
@@ -828,6 +839,8 @@ int read_line(char* buf, int size)
828
839
}
829
840
if (c != '\'' )
830
841
state = R_NORMAL ;
842
+ else
843
+ state = R_Q1 ;
831
844
break ;
832
845
case R_ESC_SLASH_Q1 :
833
846
state = R_Q1 ;
@@ -847,6 +860,8 @@ int read_line(char* buf, int size)
847
860
}
848
861
if (c != '"' )
849
862
state = R_NORMAL ;
863
+ else
864
+ state = R_Q2 ;
850
865
break ;
851
866
case R_ESC_SLASH_Q2 :
852
867
state = R_Q2 ;
@@ -860,12 +875,14 @@ int read_line(char* buf, int size)
860
875
return feof (* cur_file );
861
876
}
862
877
878
+ static char read_query_buf [MAX_QUERY ];
879
+
863
880
int read_query (struct query * * q_ptr )
864
881
{
865
- char buf [MAX_QUERY ];
866
- char * p = buf ,* p1 ;
882
+ char * p = read_query_buf , * p1 ;
867
883
int c , expected_errno ;
868
884
struct query * q ;
885
+
869
886
if (parser .current_line < parser .read_lines )
870
887
{
871
888
get_dynamic (& q_lines , (gptr )q_ptr , parser .current_line ) ;
@@ -882,7 +899,7 @@ int read_query(struct query** q_ptr)
882
899
q -> first_word_len = 0 ;
883
900
q -> expected_errno = 0 ;
884
901
q -> type = Q_UNKNOWN ;
885
- if (read_line (buf , sizeof (buf )))
902
+ if (read_line (read_query_buf , sizeof (read_query_buf )))
886
903
return 1 ;
887
904
888
905
if (* p == '#' )
@@ -961,7 +978,7 @@ static void print_version(void)
961
978
void usage ()
962
979
{
963
980
print_version ();
964
- printf ("MySQL AB, by Sasha & Matt \n" );
981
+ printf ("MySQL AB, by Sasha, Matt & Monty \n" );
965
982
printf ("This software comes with ABSOLUTELY NO WARRANTY\n\n" );
966
983
printf ("Runs a test against the mysql server and compares output with a results file.\n\n" );
967
984
printf ("Usage: %s [OPTIONS] [database] < test_file\n" , my_progname );
@@ -975,7 +992,7 @@ void usage()
975
992
-P, --port=... Port number to use for connection.\n\
976
993
-S, --socket=... Socket file to use for connection.\n\
977
994
-r, --record Record output of test_file into result file.\n\
978
- -R, --result-file=... Store result in this file\n\
995
+ -R, --result-file=... Read/ Store result from/ in this file\n\
979
996
-v, --verbose Write more.\n\
980
997
-q, --quiet, --silent Suppress all normal output.\n\
981
998
-V, --version Output version information and exit.\n\n" );
@@ -997,7 +1014,6 @@ int parse_args(int argc, char **argv)
997
1014
break ;
998
1015
case 'r' :
999
1016
record = 1 ;
1000
- record_mode = "w" ;
1001
1017
break ;
1002
1018
case 'u' :
1003
1019
user = optarg ;
@@ -1069,7 +1085,8 @@ char* safe_str_append(char* buf, const char* str, int size)
1069
1085
void str_to_file (const char * fname , char * str , int size )
1070
1086
{
1071
1087
int fd ;
1072
- if ((fd = my_open (fname , O_WRONLY |O_CREAT , MYF (MY_WME | MY_FFNF ))) < 0 )
1088
+ if ((fd = my_open (fname , O_WRONLY | O_CREAT | O_TRUNC ,
1089
+ MYF (MY_WME | MY_FFNF ))) < 0 )
1073
1090
die ("Could not open %s: errno = %d" , fname , errno );
1074
1091
if (my_write (fd , (byte * )str , size , MYF (MY_WME |MY_FNABP )))
1075
1092
die ("write failed" );
@@ -1079,8 +1096,6 @@ void str_to_file(const char* fname, char* str, int size)
1079
1096
void reject_dump (const char * record_file , char * buf , int size )
1080
1097
{
1081
1098
char reject_file [FN_REFLEN ];
1082
- char * p ;
1083
-
1084
1099
if (strlen (record_file ) >= FN_REFLEN - 8 )
1085
1100
die ("too long path name for reject" );
1086
1101
strmov (strmov (reject_file , record_file ),".reject" );
@@ -1111,7 +1126,8 @@ int run_query(MYSQL* mysql, struct query* q)
1111
1126
if (q -> require_file )
1112
1127
abort_not_supported_test ();
1113
1128
if (q -> abort_on_error )
1114
- die ("query '%s' failed: %s" , q -> q , mysql_error (mysql ));
1129
+ die ("At line %u: query '%s' failed: %d: %s" , start_lineno , q -> q ,
1130
+ mysql_errno (mysql ), mysql_error (mysql ));
1115
1131
else
1116
1132
{
1117
1133
if (q -> expected_errno )
@@ -1123,7 +1139,8 @@ int run_query(MYSQL* mysql, struct query* q)
1123
1139
goto end ;
1124
1140
}
1125
1141
1126
- verbose_msg ("query '%s' failed: %s" , q -> q , mysql_error (mysql ));
1142
+ verbose_msg ("query '%s' failed: %d: %s" , q -> q , mysql_errno (mysql ),
1143
+ mysql_error (mysql ));
1127
1144
/* if we do not abort on error, failure to run the query does
1128
1145
not fail the whole test case
1129
1146
*/
@@ -1145,10 +1162,12 @@ int run_query(MYSQL* mysql, struct query* q)
1145
1162
if (q -> require_file )
1146
1163
abort_not_supported_test ();
1147
1164
if (q -> abort_on_error )
1148
- die ("failed in mysql_store_result for query '%s'" , q -> q );
1165
+ die ("At line %u: Failed in mysql_store_result for query '%s' (%d)" ,
1166
+ start_lineno , q -> q , mysql_errno (mysql ));
1149
1167
else
1150
1168
{
1151
- verbose_msg ("failed in mysql_store_result for query '%s'" , q -> q );
1169
+ verbose_msg ("failed in mysql_store_result for query '%s' (%d)" , q -> q ,
1170
+ mysql_errno (mysql ));
1152
1171
error = 1 ;
1153
1172
goto end ;
1154
1173
}
@@ -1193,7 +1212,7 @@ int run_query(MYSQL* mysql, struct query* q)
1193
1212
if (record )
1194
1213
{
1195
1214
if (!q -> record_file [0 ] && !result_file )
1196
- die ("Missing result file" );
1215
+ die ("At line %u: Missing result file" , start_lineno );
1197
1216
if (!result_file )
1198
1217
str_to_file (q -> record_file , ds -> str , ds -> len );
1199
1218
}
@@ -1247,6 +1266,7 @@ int main(int argc, char** argv)
1247
1266
memset (file_stack , 0 , sizeof (file_stack ));
1248
1267
file_stack_end = file_stack + MAX_INCLUDE_DEPTH ;
1249
1268
cur_file = file_stack ;
1269
+ lineno = lineno_stack ;
1250
1270
init_dynamic_array (& q_lines , sizeof (struct query * ), INIT_Q_LINES ,
1251
1271
INIT_Q_LINES );
1252
1272
memset (block_stack , 0 , sizeof (block_stack ));
@@ -1256,7 +1276,7 @@ int main(int argc, char** argv)
1256
1276
parse_args (argc , argv );
1257
1277
if (!* cur_file )
1258
1278
* cur_file = stdin ;
1259
-
1279
+ * lineno = 1 ;
1260
1280
1261
1281
if (!( mysql_init (& cur_con -> mysql )))
1262
1282
die ("Failed in mysql_init()" );
0 commit comments