Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
361067e9
Commit
361067e9
authored
Dec 27, 2000
by
monty@donna.mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extended mysqltest with --commands and 'require'
Fixed test results. Added mysqld variable 'have_isam'
parent
988a98c3
Changes
93
Show whitespace changes
Inline
Side-by-side
Showing
93 changed files
with
872 additions
and
813 deletions
+872
-813
.bzrignore
.bzrignore
+1
-0
Docs/manual.texi
Docs/manual.texi
+5
-5
client/mysqltest.c
client/mysqltest.c
+482
-456
configure.in
configure.in
+1
-1
myisam/myisamlog.c
myisam/myisamlog.c
+1
-1
mysql-test/include/have_bdb.inc
mysql-test/include/have_bdb.inc
+2
-0
mysql-test/include/have_isam.inc
mysql-test/include/have_isam.inc
+2
-0
mysql-test/mysql-test-run.sh
mysql-test/mysql-test-run.sh
+17
-7
mysql-test/r/3.23/README
mysql-test/r/3.23/README
+0
-0
mysql-test/r/alt000001.result
mysql-test/r/alt000001.result
+5
-5
mysql-test/r/bdb.result
mysql-test/r/bdb.result
+27
-24
mysql-test/r/crypt.result
mysql-test/r/crypt.result
+2
-2
mysql-test/r/equal.result
mysql-test/r/equal.result
+15
-15
mysql-test/r/ft0000001.a.result
mysql-test/r/ft0000001.a.result
+3
-3
mysql-test/r/ft0000001.b.result
mysql-test/r/ft0000001.b.result
+3
-3
mysql-test/r/ft0000001.c.result
mysql-test/r/ft0000001.c.result
+3
-3
mysql-test/r/ft0000001.d.result
mysql-test/r/ft0000001.d.result
+2
-2
mysql-test/r/ft0000001.e.result
mysql-test/r/ft0000001.e.result
+8
-8
mysql-test/r/ft0000002.a.result
mysql-test/r/ft0000002.a.result
+4
-4
mysql-test/r/ft0000002.b.result
mysql-test/r/ft0000002.b.result
+4
-4
mysql-test/r/ft0000002.c.result
mysql-test/r/ft0000002.c.result
+4
-4
mysql-test/r/have_bdb.require
mysql-test/r/have_bdb.require
+2
-0
mysql-test/r/have_isam.require
mysql-test/r/have_isam.require
+2
-0
mysql-test/r/ins000001.result
mysql-test/r/ins000001.result
+4
-4
mysql-test/r/mrg000001.dummy.result
mysql-test/r/mrg000001.dummy.result
+1
-1
mysql-test/r/mrg000001.result
mysql-test/r/mrg000001.result
+5
-5
mysql-test/r/mrg000002.result
mysql-test/r/mrg000002.result
+1
-1
mysql-test/r/rpl000001.a.result
mysql-test/r/rpl000001.a.result
+3
-3
mysql-test/r/rpl000001.b.result
mysql-test/r/rpl000001.b.result
+2
-2
mysql-test/r/rpl000002.result
mysql-test/r/rpl000002.result
+4
-4
mysql-test/r/rpl000003.result
mysql-test/r/rpl000003.result
+4
-4
mysql-test/r/rpl000004.a.result
mysql-test/r/rpl000004.a.result
+2
-2
mysql-test/r/rpl000004.b.result
mysql-test/r/rpl000004.b.result
+2
-2
mysql-test/r/rpl000005.result
mysql-test/r/rpl000005.result
+4
-4
mysql-test/r/rpl000006.result
mysql-test/r/rpl000006.result
+2
-2
mysql-test/r/rpl000007.result
mysql-test/r/rpl000007.result
+2
-2
mysql-test/r/rpl000008.result
mysql-test/r/rpl000008.result
+2
-2
mysql-test/r/rpl000009.result
mysql-test/r/rpl000009.result
+2
-2
mysql-test/r/rpl000010.result
mysql-test/r/rpl000010.result
+3
-3
mysql-test/r/rpl000011.result
mysql-test/r/rpl000011.result
+3
-3
mysql-test/r/rpl000012.result
mysql-test/r/rpl000012.result
+7
-7
mysql-test/r/rpl000012.status.result
mysql-test/r/rpl000012.status.result
+2
-2
mysql-test/r/rpl000013.result
mysql-test/r/rpl000013.result
+7
-7
mysql-test/r/rpl000013.status.result
mysql-test/r/rpl000013.status.result
+2
-2
mysql-test/r/rpl000014.result
mysql-test/r/rpl000014.result
+16
-16
mysql-test/r/rpl000015.result
mysql-test/r/rpl000015.result
+14
-14
mysql-test/r/rpl000016.result
mysql-test/r/rpl000016.result
+14
-14
mysql-test/r/sel000001.result
mysql-test/r/sel000001.result
+2
-2
mysql-test/r/sel000002.result
mysql-test/r/sel000002.result
+4
-4
mysql-test/r/sel000003.result
mysql-test/r/sel000003.result
+3
-3
mysql-test/r/sel000004.result
mysql-test/r/sel000004.result
+2
-2
mysql-test/r/sel000005.result
mysql-test/r/sel000005.result
+2
-2
mysql-test/r/sel000006.result
mysql-test/r/sel000006.result
+2
-2
mysql-test/r/sel000007.result
mysql-test/r/sel000007.result
+2
-2
mysql-test/r/sel000008.result
mysql-test/r/sel000008.result
+2
-2
mysql-test/r/sel000009.result
mysql-test/r/sel000009.result
+2
-2
mysql-test/r/sel000010.result
mysql-test/r/sel000010.result
+2
-2
mysql-test/r/sel000011.result
mysql-test/r/sel000011.result
+2
-2
mysql-test/r/sel000012.result
mysql-test/r/sel000012.result
+2
-2
mysql-test/r/sel000013.result
mysql-test/r/sel000013.result
+2
-2
mysql-test/r/sel000014.result
mysql-test/r/sel000014.result
+2
-2
mysql-test/r/sel000015.result
mysql-test/r/sel000015.result
+2
-2
mysql-test/r/sel000016.result
mysql-test/r/sel000016.result
+2
-2
mysql-test/r/sel000017.result
mysql-test/r/sel000017.result
+2
-2
mysql-test/r/sel000018.result
mysql-test/r/sel000018.result
+2
-2
mysql-test/r/sel000019.result
mysql-test/r/sel000019.result
+2
-2
mysql-test/r/sel000020.result
mysql-test/r/sel000020.result
+2
-2
mysql-test/r/sel000021.result
mysql-test/r/sel000021.result
+2
-2
mysql-test/r/sel000022.result
mysql-test/r/sel000022.result
+2
-2
mysql-test/r/sel000023.result
mysql-test/r/sel000023.result
+2
-2
mysql-test/r/sel000024.result
mysql-test/r/sel000024.result
+2
-2
mysql-test/r/sel000025.result
mysql-test/r/sel000025.result
+2
-2
mysql-test/r/sel000026.result
mysql-test/r/sel000026.result
+2
-2
mysql-test/r/sel000027.result
mysql-test/r/sel000027.result
+2
-2
mysql-test/r/sel000028.result
mysql-test/r/sel000028.result
+2
-2
mysql-test/r/sel000029.result
mysql-test/r/sel000029.result
+2
-2
mysql-test/r/sel000030.result
mysql-test/r/sel000030.result
+2
-2
mysql-test/r/sel000031.result
mysql-test/r/sel000031.result
+4
-4
mysql-test/r/sel000032.result
mysql-test/r/sel000032.result
+4
-4
mysql-test/r/sel000033.result
mysql-test/r/sel000033.result
+4
-4
mysql-test/r/sel000100.result
mysql-test/r/sel000100.result
+2
-2
mysql-test/r/shw000001.result
mysql-test/r/shw000001.result
+2
-2
mysql-test/r/slave-running.result
mysql-test/r/slave-running.result
+2
-2
mysql-test/r/slave-stopped.result
mysql-test/r/slave-stopped.result
+2
-2
mysql-test/t/bdb.test
mysql-test/t/bdb.test
+18
-0
mysql-test/t/include/master-slave.inc
mysql-test/t/include/master-slave.inc
+0
-11
mysql-test/t/replace.test
mysql-test/t/replace.test
+3
-3
sql/gen_lex_hash.cc
sql/gen_lex_hash.cc
+8
-6
sql/ha_berkeley.cc
sql/ha_berkeley.cc
+1
-1
sql/ha_berkeley.h
sql/ha_berkeley.h
+1
-1
sql/handler.h
sql/handler.h
+2
-2
sql/mysqld.cc
sql/mysqld.cc
+52
-50
sql/sql_class.h
sql/sql_class.h
+1
-1
No files found.
.bzrignore
View file @
361067e9
...
@@ -183,3 +183,4 @@ mysqld.S
...
@@ -183,3 +183,4 @@ mysqld.S
mysqld.sym
mysqld.sym
.snprj/*
.snprj/*
sql-bench/output/*
sql-bench/output/*
sql-bench/Results-linux/ATIS-mysql_bdb-Linux_2.2.14_my_SMP_i686
Docs/manual.texi
View file @
361067e9
...
@@ -20271,7 +20271,7 @@ differ somewhat:
...
@@ -20271,7 +20271,7 @@ differ somewhat:
| flush | OFF |
| flush | OFF |
| flush_time | 0 |
| flush_time | 0 |
| have_bdb | YES |
| have_bdb | YES |
| have_gem
e
ni | NO |
| have_gem
i
ni | NO |
| have_innobase | YES |
| have_innobase | YES |
| have_raid | YES |
| have_raid | YES |
| have_ssl | NO |
| have_ssl | NO |
...
@@ -20449,9 +20449,9 @@ very little resources.
...
@@ -20449,9 +20449,9 @@ very little resources.
@item @code{have_bdb}
@item @code{have_bdb}
@code{YES} if @code{mysqld} supports Berkeley DB tables. @code{DISABLED}
@code{YES} if @code{mysqld} supports Berkeley DB tables. @code{DISABLED}
if @code{--skip-bdb} is used.
if @code{--skip-bdb} is used.
@item @code{have_gem
e
ni}
@item @code{have_gem
i
ni}
@code{YES} if @code{mysqld} supports Gem
e
ni tables. @code{DISABLED}
@code{YES} if @code{mysqld} supports Gem
i
ni tables. @code{DISABLED}
if @code{--skip-gem
e
ni} is used.
if @code{--skip-gem
i
ni} is used.
@item @code{have_innobase}
@item @code{have_innobase}
@code{YES} if @code{mysqld} supports Innobase tables. @code{DISABLED}
@code{YES} if @code{mysqld} supports Innobase tables. @code{DISABLED}
if @code{--skip-innobase} is used.
if @code{--skip-innobase} is used.
...
@@ -40052,7 +40052,7 @@ though, so Version 3.23 is not released as a stable version yet.
...
@@ -40052,7 +40052,7 @@ though, so Version 3.23 is not released as a stable version yet.
@item
@item
Added option @code{--safe-show-databases}.
Added option @code{--safe-show-databases}.
@item
@item
Added @code{have_bdb}, @code{have_gem
e
ni}, @code{have_innobase},
Added @code{have_bdb}, @code{have_gem
i
ni}, @code{have_innobase},
@code{have_raid} and @code{have_ssl} to @code{SHOW VARIABLES} to make it
@code{have_raid} and @code{have_ssl} to @code{SHOW VARIABLES} to make it
easy to test for supported extensions.
easy to test for supported extensions.
@item
@item
client/mysqltest.c
View file @
361067e9
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
*
*
**/
**/
#define MTEST_VERSION "1.
0
"
#define MTEST_VERSION "1.
1
"
#include "global.h"
#include "global.h"
#include "my_sys.h"
#include "my_sys.h"
...
@@ -100,21 +100,31 @@ VAR var_reg[10];
...
@@ -100,21 +100,31 @@ VAR var_reg[10];
struct
connection
cons
[
MAX_CONS
];
struct
connection
cons
[
MAX_CONS
];
struct
connection
*
cur_con
,
*
next_con
,
*
cons_end
;
struct
connection
*
cur_con
,
*
next_con
,
*
cons_end
;
/* this should really be called command*/
/* this should really be called command
*/
struct
query
struct
query
{
{
char
q
[
MAX_QUERY
];
char
q
[
MAX_QUERY
];
int
has_result_set
;
int
first_word_len
;
int
first_word_len
;
int
abort_on_error
;
my_bool
abort_on_error
,
require_file
;
uint
expected_errno
;
uint
expected_errno
;
char
record_file
[
FN_REFLEN
];
char
record_file
[
FN_REFLEN
];
enum
{
Q_CONNECTION
,
Q_QUERY
,
Q_CONNECT
,
/* Add new commands before Q_UNKNOWN */
enum
{
Q_CONNECTION
=
1
,
Q_QUERY
,
Q_CONNECT
,
Q_SLEEP
,
Q_INC
,
Q_DEC
,
Q_SOURCE
,
Q_SLEEP
,
Q_INC
,
Q_DEC
,
Q_SOURCE
,
Q_DISCONNECT
,
Q_LET
,
Q_ECHO
,
Q_WHILE
,
Q_END_BLOCK
,
Q_DISCONNECT
,
Q_LET
,
Q_ECHO
,
Q_WHILE
,
Q_END_BLOCK
,
Q_SYSTEM
,
Q_UNKNOWN
}
type
;
Q_SYSTEM
,
Q_RESULT
,
Q_REQUIRE
,
Q_UNKNOWN
,
Q_COMMENT
,
Q_COMMENT_WITH_COMMAND
}
type
;
};
};
const
char
*
command_names
[]
=
{
"connection"
,
"query"
,
"connect"
,
"sleep"
,
"inc"
,
"dec"
,
"source"
,
"disconnect"
,
"let"
,
"echo"
,
"while"
,
"end"
,
"system"
,
"result"
,
"require"
,
0
};
TYPELIB
command_typelib
=
{
array_elements
(
command_names
),
""
,
command_names
};
#define DS_CHUNK 16384
#define DS_CHUNK 16384
typedef
struct
dyn_string
typedef
struct
dyn_string
...
@@ -131,11 +141,53 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len);
...
@@ -131,11 +141,53 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len);
int
dyn_string_cmp
(
DYN_STRING
*
ds
,
const
char
*
fname
);
int
dyn_string_cmp
(
DYN_STRING
*
ds
,
const
char
*
fname
);
void
reject_dump
(
const
char
*
record_file
,
char
*
buf
,
int
size
);
void
reject_dump
(
const
char
*
record_file
,
char
*
buf
,
int
size
);
static
void
die
(
const
char
*
fmt
,
...);
int
close_connection
(
struct
query
*
q
);
int
close_connection
(
struct
query
*
q
);
VAR
*
var_get
(
char
*
var_name
,
char
*
var_name_end
,
int
raw
);
VAR
*
var_get
(
char
*
var_name
,
char
*
var_name_end
,
int
raw
);
void
verbose_msg
(
const
char
*
fmt
,
...);
static
void
close_cons
()
{
for
(
--
next_con
;
next_con
>=
cons
;
--
next_con
)
{
mysql_close
(
&
next_con
->
mysql
);
my_free
(
next_con
->
name
,
MYF
(
MY_ALLOW_ZERO_PTR
));
}
}
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
args
;
va_start
(
args
,
fmt
);
fprintf
(
stderr
,
"%s: "
,
my_progname
);
vfprintf
(
stderr
,
fmt
,
args
);
fprintf
(
stderr
,
"
\n
"
);
va_end
(
args
);
close_cons
();
exit
(
1
);
}
static
void
abort_not_supported_test
()
{
fprintf
(
stderr
,
"This test is not supported by this installation
\n
"
);
if
(
!
silent
)
printf
(
"skipped
\n
"
);
close_cons
();
exit
(
2
);
}
static
void
verbose_msg
(
const
char
*
fmt
,
...)
{
va_list
args
;
if
(
!
verbose
)
return
;
va_start
(
args
,
fmt
);
fprintf
(
stderr
,
"%s: "
,
my_progname
);
vfprintf
(
stderr
,
fmt
,
args
);
fprintf
(
stderr
,
"
\n
"
);
va_end
(
args
);
}
void
init_parser
()
void
init_parser
()
{
{
...
@@ -145,9 +197,9 @@ void init_parser()
...
@@ -145,9 +197,9 @@ void init_parser()
int
hex_val
(
int
c
)
int
hex_val
(
int
c
)
{
{
if
(
isdigit
(
c
))
if
(
isdigit
(
c
))
return
c
-
'0'
;
return
c
-
'0'
;
else
if
((
c
=
tolower
(
c
))
>=
'a'
&&
c
<=
'f'
)
else
if
((
c
=
tolower
(
c
))
>=
'a'
&&
c
<=
'f'
)
return
c
-
'a'
+
10
;
return
c
-
'a'
+
10
;
else
else
return
-
1
;
return
-
1
;
...
@@ -155,7 +207,7 @@ int hex_val(int c)
...
@@ -155,7 +207,7 @@ int hex_val(int c)
void
dyn_string_init
(
DYN_STRING
*
ds
)
void
dyn_string_init
(
DYN_STRING
*
ds
)
{
{
if
(
!
(
ds
->
str
=
(
char
*
)
my_malloc
(
DS_CHUNK
,
MYF
(
0
))))
if
(
!
(
ds
->
str
=
(
char
*
)
my_malloc
(
DS_CHUNK
,
MYF
(
0
))))
die
(
"Out of memory"
);
die
(
"Out of memory"
);
ds
->
len
=
0
;
ds
->
len
=
0
;
ds
->
max_len
=
DS_CHUNK
;
ds
->
max_len
=
DS_CHUNK
;
...
@@ -170,14 +222,14 @@ void dyn_string_end(DYN_STRING* ds)
...
@@ -170,14 +222,14 @@ void dyn_string_end(DYN_STRING* ds)
void
dyn_string_append
(
DYN_STRING
*
ds
,
const
char
*
str
,
int
len
)
void
dyn_string_append
(
DYN_STRING
*
ds
,
const
char
*
str
,
int
len
)
{
{
int
new_len
;
int
new_len
;
if
(
!
len
)
if
(
!
len
)
len
=
strlen
(
str
);
len
=
strlen
(
str
);
new_len
=
ds
->
len
+
len
;
new_len
=
ds
->
len
+
len
;
if
(
new_len
>
ds
->
max_len
)
if
(
new_len
>
ds
->
max_len
)
{
{
int
new_alloc_len
=
(
new_len
&
~
(
DS_CHUNK
-
1
))
+
DS_CHUNK
;
int
new_alloc_len
=
(
new_len
&
~
(
DS_CHUNK
-
1
))
+
DS_CHUNK
;
char
*
tmp
=
(
char
*
)
my_malloc
(
new_alloc_len
,
MYF
(
0
));
char
*
tmp
=
(
char
*
)
my_malloc
(
new_alloc_len
,
MYF
(
0
));
if
(
!
tmp
)
if
(
!
tmp
)
die
(
"Out of memory"
);
die
(
"Out of memory"
);
memcpy
(
tmp
,
ds
->
str
,
ds
->
len
);
memcpy
(
tmp
,
ds
->
str
,
ds
->
len
);
memcpy
(
tmp
+
ds
->
len
,
str
,
len
);
memcpy
(
tmp
+
ds
->
len
,
str
,
len
);
...
@@ -192,21 +244,23 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len)
...
@@ -192,21 +244,23 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len)
ds
->
len
+=
len
;
ds
->
len
+=
len
;
}
}
}
}
int
dyn_string_cmp
(
DYN_STRING
*
ds
,
const
char
*
fname
)
int
dyn_string_cmp
(
DYN_STRING
*
ds
,
const
char
*
fname
)
{
{
MY_STAT
stat_info
;
MY_STAT
stat_info
;
char
*
tmp
;
char
*
tmp
;
int
res
;
int
res
;
int
fd
;
int
fd
;
if
(
!
my_stat
(
fname
,
&
stat_info
,
MYF
(
MY_WME
)))
if
(
!
my_stat
(
fname
,
&
stat_info
,
MYF
(
MY_WME
)))
die
(
"Could not stat %s: errno =%d"
,
fname
,
errno
);
die
(
"Could not stat %s: errno =%d"
,
fname
,
errno
);
if
(
stat_info
.
st_size
!=
ds
->
len
)
if
(
stat_info
.
st_size
!=
ds
->
len
)
return
2
;
return
2
;
if
(
!
(
tmp
=
(
char
*
)
my_malloc
(
ds
->
len
,
MYF
(
0
))))
if
(
!
(
tmp
=
(
char
*
)
my_malloc
(
ds
->
len
,
MYF
(
0
))))
die
(
"Out of memory"
);
die
(
"Out of memory"
);
if
((
fd
=
my_open
(
fname
,
O_RDONLY
,
MYF
(
MY_WME
)))
<
0
)
if
((
fd
=
my_open
(
fname
,
O_RDONLY
,
MYF
(
MY_WME
)))
<
0
)
die
(
"Could not open %s: errno = %d"
,
fname
,
errno
);
die
(
"Could not open %s: errno = %d"
,
fname
,
errno
);
if
(
my_read
(
fd
,
(
byte
*
)
tmp
,
stat_info
.
st_size
,
MYF
(
MY_WME
|
MY_NABP
)))
if
(
my_read
(
fd
,
(
byte
*
)
tmp
,
stat_info
.
st_size
,
MYF
(
MY_WME
|
MY_NABP
)))
die
(
"read failed"
);
die
(
"read failed"
);
res
=
(
memcmp
(
tmp
,
ds
->
str
,
stat_info
.
st_size
))
?
1
:
0
;
res
=
(
memcmp
(
tmp
,
ds
->
str
,
stat_info
.
st_size
))
?
1
:
0
;
my_free
((
gptr
)
tmp
,
MYF
(
0
));
my_free
((
gptr
)
tmp
,
MYF
(
0
));
...
@@ -214,10 +268,15 @@ int dyn_string_cmp(DYN_STRING* ds, const char* fname)
...
@@ -214,10 +268,15 @@ int dyn_string_cmp(DYN_STRING* ds, const char* fname)
return
res
;
return
res
;
}
}
int
check_result
(
DYN_STRING
*
ds
,
const
char
*
fname
)
static
int
check_result
(
DYN_STRING
*
ds
,
const
char
*
fname
,
my_bool
require_option
)
{
{
int
error
=
0
;
int
error
=
0
;
switch
(
dyn_string_cmp
(
ds
,
fname
))
int
res
=
dyn_string_cmp
(
ds
,
fname
);
if
(
res
&&
require_option
)
abort_not_supported_test
();
switch
(
res
)
{
{
case
0
:
case
0
:
break
;
/* ok */
break
;
/* ok */
...
@@ -232,7 +291,7 @@ int check_result(DYN_STRING* ds, const char* fname)
...
@@ -232,7 +291,7 @@ int check_result(DYN_STRING* ds, const char* fname)
default:
/* impossible */
default:
/* impossible */
die
(
"Unknown error code from dyn_string_cmp()"
);
die
(
"Unknown error code from dyn_string_cmp()"
);
}
}
if
(
error
)
if
(
error
)
reject_dump
(
fname
,
ds
->
str
,
ds
->
len
);
reject_dump
(
fname
,
ds
->
str
,
ds
->
len
);
return
error
;
return
error
;
}
}
...
@@ -241,26 +300,26 @@ VAR* var_get(char* var_name, char* var_name_end, int raw)
...
@@ -241,26 +300,26 @@ VAR* var_get(char* var_name, char* var_name_end, int raw)
{
{
int
digit
;
int
digit
;
VAR
*
v
;
VAR
*
v
;
if
(
*
var_name
++
!=
'$'
)
if
(
*
var_name
++
!=
'$'
)
{
{
--
var_name
;
--
var_name
;
goto
err
;
goto
err
;
}
}
digit
=
*
var_name
-
'0'
;
digit
=
*
var_name
-
'0'
;
if
(
!
(
digit
<
10
&&
digit
>=
0
))
if
(
!
(
digit
<
10
&&
digit
>=
0
))
{
{
--
var_name
;
--
var_name
;
goto
err
;
goto
err
;
}
}
v
=
var_reg
+
digit
;
v
=
var_reg
+
digit
;
if
(
!
raw
&&
v
->
int_dirty
)
if
(
!
raw
&&
v
->
int_dirty
)
{
{
sprintf
(
v
->
str_val
,
"%d"
,
v
->
int_val
);
sprintf
(
v
->
str_val
,
"%d"
,
v
->
int_val
);
v
->
int_dirty
=
0
;
v
->
int_dirty
=
0
;
}
}
return
v
;
return
v
;
err:
err:
if
(
var_name_end
)
if
(
var_name_end
)
*
var_name_end
=
0
;
*
var_name_end
=
0
;
die
(
"Unsupported variable name: %s"
,
var_name
);
die
(
"Unsupported variable name: %s"
,
var_name
);
return
0
;
return
0
;
...
@@ -272,23 +331,23 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
...
@@ -272,23 +331,23 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
int
digit
;
int
digit
;
int
val_len
;
int
val_len
;
VAR
*
v
;
VAR
*
v
;
if
(
*
var_name
++
!=
'$'
)
if
(
*
var_name
++
!=
'$'
)
{
{
--
var_name
;
--
var_name
;
*
var_name_end
=
0
;
*
var_name_end
=
0
;
die
(
"Variable name in %s does not start with '$'"
,
var_name
);
die
(
"Variable name in %s does not start with '$'"
,
var_name
);
}
}
digit
=
*
var_name
-
'0'
;
digit
=
*
var_name
-
'0'
;
if
(
!
(
digit
<
10
&&
digit
>=
0
))
if
(
!
(
digit
<
10
&&
digit
>=
0
))
{
{
*
var_name_end
=
0
;
*
var_name_end
=
0
;
die
(
"Unsupported variable name: %s"
,
var_name
);
die
(
"Unsupported variable name: %s"
,
var_name
);
}
}
v
=
var_reg
+
digit
;
v
=
var_reg
+
digit
;
if
(
v
->
alloced_len
<
(
val_len
=
(
int
)(
var_val_end
-
var_val
)
+
1
))
if
(
v
->
alloced_len
<
(
val_len
=
(
int
)(
var_val_end
-
var_val
)
+
1
))
{
{
v
->
alloced_len
=
(
val_len
<
MIN_VAR_ALLOC
)
?
MIN_VAR_ALLOC
:
val_len
;
v
->
alloced_len
=
(
val_len
<
MIN_VAR_ALLOC
)
?
MIN_VAR_ALLOC
:
val_len
;
if
(
!
(
v
->
str_val
=
if
(
!
(
v
->
str_val
=
v
->
str_val
?
my_realloc
(
v
->
str_val
,
v
->
alloced_len
,
MYF
(
MY_WME
))
:
v
->
str_val
?
my_realloc
(
v
->
str_val
,
v
->
alloced_len
,
MYF
(
MY_WME
))
:
my_malloc
(
v
->
alloced_len
,
MYF
(
MY_WME
))))
my_malloc
(
v
->
alloced_len
,
MYF
(
MY_WME
))))
die
(
"Out of memory"
);
die
(
"Out of memory"
);
...
@@ -302,9 +361,9 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
...
@@ -302,9 +361,9 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
int
open_file
(
const
char
*
name
)
int
open_file
(
const
char
*
name
)
{
{
if
(
*
cur_file
&&
++
cur_file
==
file_stack_end
)
if
(
*
cur_file
&&
++
cur_file
==
file_stack_end
)
die
(
"Source directives are nesting too deep"
);
die
(
"Source directives are nesting too deep"
);
if
(
!
(
*
cur_file
=
fopen
(
name
,
"r"
)))
if
(
!
(
*
cur_file
=
my_fopen
(
name
,
O_RDONLY
,
MYF
(
MY_WME
)
)))
die
(
"Could not read '%s': errno %d
\n
"
,
name
,
errno
);
die
(
"Could not read '%s': errno %d
\n
"
,
name
,
errno
);
return
0
;
return
0
;
...
@@ -315,7 +374,7 @@ int do_source(struct query* q)
...
@@ -315,7 +374,7 @@ int do_source(struct query* q)
char
*
p
,
*
name
;
char
*
p
,
*
name
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
if
(
!*
p
)
die
(
"Missing file name in source
\n
"
);
die
(
"Missing file name in source
\n
"
);
name
=
p
;
name
=
p
;
while
(
*
p
&&
!
isspace
(
*
p
))
while
(
*
p
&&
!
isspace
(
*
p
))
...
@@ -329,9 +388,9 @@ int do_source(struct query* q)
...
@@ -329,9 +388,9 @@ int do_source(struct query* q)
int
eval_expr
(
VAR
*
v
,
char
*
p
,
char
*
p_end
)
int
eval_expr
(
VAR
*
v
,
char
*
p
,
char
*
p_end
)
{
{
VAR
*
vp
;
VAR
*
vp
;
if
(
*
p
==
'$'
)
if
(
*
p
==
'$'
)
{
{
if
((
vp
=
var_get
(
p
,
p_end
,
0
)))
if
((
vp
=
var_get
(
p
,
p_end
,
0
)))
{
{
memcpy
(
v
,
vp
,
sizeof
(
VAR
));
memcpy
(
v
,
vp
,
sizeof
(
VAR
));
return
0
;
return
0
;
...
@@ -344,7 +403,7 @@ int eval_expr(VAR* v, char* p, char* p_end)
...
@@ -344,7 +403,7 @@ int eval_expr(VAR* v, char* p, char* p_end)
return
0
;
return
0
;
}
}
if
(
p_end
)
if
(
p_end
)
*
p_end
=
0
;
*
p_end
=
0
;
die
(
"Invalid expr: %s"
,
p
);
die
(
"Invalid expr: %s"
,
p
);
return
1
;
return
1
;
...
@@ -381,14 +440,14 @@ int do_system(struct query* q)
...
@@ -381,14 +440,14 @@ int do_system(struct query* q)
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
eval_expr
(
&
v
,
p
,
0
);
/* NULL terminated */
eval_expr
(
&
v
,
p
,
0
);
/* NULL terminated */
if
(
v
.
str_val_len
>
1
)
if
(
v
.
str_val_len
>
1
)
{
{
char
expr_buf
[
512
];
char
expr_buf
[
512
];
if
((
uint
)
v
.
str_val_len
>
sizeof
(
expr_buf
)
-
1
)
if
((
uint
)
v
.
str_val_len
>
sizeof
(
expr_buf
)
-
1
)
v
.
str_val_len
=
sizeof
(
expr_buf
)
-
1
;
v
.
str_val_len
=
sizeof
(
expr_buf
)
-
1
;
memcpy
(
expr_buf
,
v
.
str_val
,
v
.
str_val_len
);
memcpy
(
expr_buf
,
v
.
str_val
,
v
.
str_val_len
);
expr_buf
[
v
.
str_val_len
]
=
0
;
expr_buf
[
v
.
str_val_len
]
=
0
;
if
(
system
(
expr_buf
)
&&
q
->
abort_on_error
)
if
(
system
(
expr_buf
)
&&
q
->
abort_on_error
)
die
(
"system command '%s' failed"
,
expr_buf
);
die
(
"system command '%s' failed"
,
expr_buf
);
}
}
return
0
;
return
0
;
...
@@ -401,7 +460,7 @@ int do_echo(struct query* q)
...
@@ -401,7 +460,7 @@ int do_echo(struct query* q)
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
eval_expr
(
&
v
,
p
,
0
);
/* NULL terminated */
eval_expr
(
&
v
,
p
,
0
);
/* NULL terminated */
if
(
v
.
str_val_len
>
1
)
if
(
v
.
str_val_len
>
1
)
{
{
fflush
(
stdout
);
fflush
(
stdout
);
write
(
1
,
v
.
str_val
,
v
.
str_val_len
-
1
);
write
(
1
,
v
.
str_val
,
v
.
str_val_len
-
1
);
...
@@ -415,13 +474,13 @@ int do_let(struct query* q)
...
@@ -415,13 +474,13 @@ int do_let(struct query* q)
char
*
p
,
*
var_name
,
*
var_name_end
,
*
var_val_start
;
char
*
p
,
*
var_name
,
*
var_name_end
,
*
var_val_start
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
if
(
!*
p
)
die
(
"Missing variable name in let
\n
"
);
die
(
"Missing variable name in let
\n
"
);
var_name
=
p
;
var_name
=
p
;
while
(
*
p
&&
(
*
p
!=
'='
||
isspace
(
*
p
)))
while
(
*
p
&&
(
*
p
!=
'='
||
isspace
(
*
p
)))
p
++
;
p
++
;
var_name_end
=
p
;
var_name_end
=
p
;
if
(
*
p
==
'='
)
p
++
;
if
(
*
p
==
'='
)
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
p
++
;
var_val_start
=
p
;
var_val_start
=
p
;
...
@@ -437,14 +496,14 @@ int do_sleep(struct query* q)
...
@@ -437,14 +496,14 @@ int do_sleep(struct query* q)
int
dec_mul
=
1000000
;
int
dec_mul
=
1000000
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
if
(
!*
p
)
die
(
"Missing agument in sleep
\n
"
);
die
(
"Missing a
r
gument in sleep
\n
"
);
arg
=
p
;
arg
=
p
;
t
.
tv_sec
=
atoi
(
arg
);
t
.
tv_sec
=
atoi
(
arg
);
t
.
tv_usec
=
0
;
t
.
tv_usec
=
0
;
while
(
*
p
&&
*
p
!=
'.'
&&
!
isspace
(
*
p
))
while
(
*
p
&&
*
p
!=
'.'
&&
!
isspace
(
*
p
))
p
++
;
p
++
;
if
(
*
p
==
'.'
)
if
(
*
p
==
'.'
)
{
{
char
c
;
char
c
;
char
*
p_end
;
char
*
p_end
;
...
@@ -454,7 +513,7 @@ int do_sleep(struct query* q)
...
@@ -454,7 +513,7 @@ int do_sleep(struct query* q)
for
(;
p
<=
p_end
;
++
p
)
for
(;
p
<=
p_end
;
++
p
)
{
{
c
=
*
p
-
'0'
;
c
=
*
p
-
'0'
;
if
(
c
<
10
&&
c
>=
0
)
if
(
c
<
10
&&
c
>=
0
)
{
{
t
.
tv_usec
=
t
.
tv_usec
*
10
+
c
;
t
.
tv_usec
=
t
.
tv_usec
*
10
+
c
;
dec_mul
/=
10
;
dec_mul
/=
10
;
...
@@ -468,6 +527,17 @@ int do_sleep(struct query* q)
...
@@ -468,6 +527,17 @@ int do_sleep(struct query* q)
return
select
(
0
,
0
,
0
,
0
,
&
t
);
return
select
(
0
,
0
,
0
,
0
,
&
t
);
}
}
static
void
get_file_name
(
char
*
filename
,
struct
query
*
q
)
{
char
*
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
strnmov
(
filename
,
p
,
FN_REFLEN
);
/* Remove end space */
while
(
p
>
filename
&&
isspace
(
p
[
-
1
]))
p
--
;
p
[
0
]
=
0
;
}
int
select_connection
(
struct
query
*
q
)
int
select_connection
(
struct
query
*
q
)
{
{
...
@@ -475,7 +545,7 @@ int select_connection(struct query* q)
...
@@ -475,7 +545,7 @@ int select_connection(struct query* q)
struct
connection
*
con
;
struct
connection
*
con
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
if
(
!*
p
)
die
(
"Missing connection name in connect
\n
"
);
die
(
"Missing connection name in connect
\n
"
);
name
=
p
;
name
=
p
;
while
(
*
p
&&
!
isspace
(
*
p
))
while
(
*
p
&&
!
isspace
(
*
p
))
...
@@ -483,7 +553,7 @@ int select_connection(struct query* q)
...
@@ -483,7 +553,7 @@ int select_connection(struct query* q)
*
p
=
0
;
*
p
=
0
;
for
(
con
=
cons
;
con
<
next_con
;
con
++
)
for
(
con
=
cons
;
con
<
next_con
;
con
++
)
if
(
!
strcmp
(
con
->
name
,
name
))
if
(
!
strcmp
(
con
->
name
,
name
))
{
{
cur_con
=
con
;
cur_con
=
con
;
return
0
;
return
0
;
...
@@ -499,7 +569,7 @@ int close_connection(struct query* q)
...
@@ -499,7 +569,7 @@ int close_connection(struct query* q)
struct
connection
*
con
;
struct
connection
*
con
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
p
=
(
char
*
)
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
if
(
!*
p
)
die
(
"Missing connection name in connect
\n
"
);
die
(
"Missing connection name in connect
\n
"
);
name
=
p
;
name
=
p
;
while
(
*
p
&&
!
isspace
(
*
p
))
while
(
*
p
&&
!
isspace
(
*
p
))
...
@@ -507,7 +577,7 @@ int close_connection(struct query* q)
...
@@ -507,7 +577,7 @@ int close_connection(struct query* q)
*
p
=
0
;
*
p
=
0
;
for
(
con
=
cons
;
con
<
next_con
;
con
++
)
for
(
con
=
cons
;
con
<
next_con
;
con
++
)
if
(
!
strcmp
(
con
->
name
,
name
))
if
(
!
strcmp
(
con
->
name
,
name
))
{
{
mysql_close
(
&
con
->
mysql
);
mysql_close
(
&
con
->
mysql
);
return
0
;
return
0
;
...
@@ -529,10 +599,10 @@ char* safe_get_param(char* str, char** arg, const char* msg)
...
@@ -529,10 +599,10 @@ char* safe_get_param(char* str, char** arg, const char* msg)
*
arg
=
str
;
*
arg
=
str
;
while
(
*
str
&&
*
str
!=
','
&&
*
str
!=
')'
)
while
(
*
str
&&
*
str
!=
','
&&
*
str
!=
')'
)
{
{
if
(
isspace
(
*
str
))
*
str
=
0
;
if
(
isspace
(
*
str
))
*
str
=
0
;
str
++
;
str
++
;
}
}
if
(
!*
str
)
if
(
!*
str
)
die
(
msg
);
die
(
msg
);
*
str
++
=
0
;
*
str
++
=
0
;
...
@@ -548,7 +618,7 @@ int do_connect(struct query* q)
...
@@ -548,7 +618,7 @@ int do_connect(struct query* q)
p
=
q
->
q
+
q
->
first_word_len
;
p
=
q
->
q
+
q
->
first_word_len
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
*
p
!=
'('
)
if
(
*
p
!=
'('
)
die
(
"Syntax error in connect - expeected '(' found '%c'"
,
*
p
);
die
(
"Syntax error in connect - expeected '(' found '%c'"
,
*
p
);
p
++
;
p
++
;
p
=
safe_get_param
(
p
,
&
con_name
,
"missing connection name"
);
p
=
safe_get_param
(
p
,
&
con_name
,
"missing connection name"
);
...
@@ -558,17 +628,17 @@ int do_connect(struct query* q)
...
@@ -558,17 +628,17 @@ int do_connect(struct query* q)
p
=
safe_get_param
(
p
,
&
con_db
,
"missing connection db"
);
p
=
safe_get_param
(
p
,
&
con_db
,
"missing connection db"
);
p
=
safe_get_param
(
p
,
&
con_port_str
,
"missing connection port"
);
p
=
safe_get_param
(
p
,
&
con_port_str
,
"missing connection port"
);
p
=
safe_get_param
(
p
,
&
con_sock
,
"missing connection scoket"
);
p
=
safe_get_param
(
p
,
&
con_sock
,
"missing connection scoket"
);
if
(
next_con
==
cons_end
)
if
(
next_con
==
cons_end
)
die
(
"Connection limit exhausted - incread MAX_CONS in mysqltest.c"
);
die
(
"Connection limit exhausted - incread MAX_CONS in mysqltest.c"
);
if
(
!
mysql_init
(
&
next_con
->
mysql
))
if
(
!
mysql_init
(
&
next_con
->
mysql
))
die
(
"Failed on mysql_init()"
);
die
(
"Failed on mysql_init()"
);
if
(
!
mysql_real_connect
(
&
next_con
->
mysql
,
con_host
,
con_user
,
con_pass
,
if
(
!
mysql_real_connect
(
&
next_con
->
mysql
,
con_host
,
con_user
,
con_pass
,
con_db
,
atoi
(
con_port_str
),
con_sock
,
0
))
con_db
,
atoi
(
con_port_str
),
con_sock
,
0
))
die
(
"Could not open connection '%s': %s"
,
con_name
,
die
(
"Could not open connection '%s': %s"
,
con_name
,
mysql_error
(
&
next_con
->
mysql
));
mysql_error
(
&
next_con
->
mysql
));
if
(
!
(
next_con
->
name
=
my_strdup
(
con_name
,
MYF
(
MY_WME
))))
if
(
!
(
next_con
->
name
=
my_strdup
(
con_name
,
MYF
(
MY_WME
))))
die
(
"Out of memory"
);
die
(
"Out of memory"
);
cur_con
=
next_con
++
;
cur_con
=
next_con
++
;
...
@@ -578,13 +648,13 @@ int do_connect(struct query* q)
...
@@ -578,13 +648,13 @@ int do_connect(struct query* q)
int
do_done
(
struct
query
*
q
)
int
do_done
(
struct
query
*
q
)
{
{
q
->
type
=
Q_END_BLOCK
;
q
->
type
=
Q_END_BLOCK
;
if
(
cur_block
==
block_stack
)
if
(
cur_block
==
block_stack
)
die
(
"Stray '}' - end of block before beginning"
);
die
(
"Stray '}' - end of block before beginning"
);
if
(
block_ok
)
if
(
block_ok
)
parser
.
current_line
=
*--
cur_block
;
parser
.
current_line
=
*--
cur_block
;
else
else
{
{
if
(
!--
false_block_depth
)
if
(
!--
false_block_depth
)
block_ok
=
1
;
block_ok
=
1
;
++
parser
.
current_line
;
++
parser
.
current_line
;
}
}
...
@@ -596,22 +666,22 @@ int do_while(struct query* q)
...
@@ -596,22 +666,22 @@ int do_while(struct query* q)
char
*
p
=
q
->
q
+
q
->
first_word_len
;
char
*
p
=
q
->
q
+
q
->
first_word_len
;
char
*
expr_start
,
*
expr_end
;
char
*
expr_start
,
*
expr_end
;
VAR
v
;
VAR
v
;
if
(
cur_block
==
block_stack_end
)
if
(
cur_block
==
block_stack_end
)
die
(
"Nesting too deep"
);
die
(
"Nesting too deep"
);
if
(
!
block_ok
)
if
(
!
block_ok
)
{
{
++
false_block_depth
;
++
false_block_depth
;
return
0
;
return
0
;
}
}
expr_start
=
strchr
(
p
,
'('
);
expr_start
=
strchr
(
p
,
'('
);
if
(
!
expr_start
)
if
(
!
expr_start
)
die
(
"missing '(' in while"
);
die
(
"missing '(' in while"
);
expr_end
=
strrchr
(
expr_start
,
')'
);
expr_end
=
strrchr
(
expr_start
,
')'
);
if
(
!
expr_end
)
if
(
!
expr_end
)
die
(
"missing ')' in while"
);
die
(
"missing ')' in while"
);
eval_expr
(
&
v
,
++
expr_start
,
--
expr_end
);
eval_expr
(
&
v
,
++
expr_start
,
--
expr_end
);
*
cur_block
++
=
parser
.
current_line
++
;
*
cur_block
++
=
parser
.
current_line
++
;
if
(
!
v
.
int_val
)
if
(
!
v
.
int_val
)
{
{
block_ok
=
0
;
block_ok
=
0
;
false_block_depth
=
1
;
false_block_depth
=
1
;
...
@@ -619,14 +689,6 @@ int do_while(struct query* q)
...
@@ -619,14 +689,6 @@ int do_while(struct query* q)
return
0
;
return
0
;
}
}
void
close_cons
()
{
for
(
--
next_con
;
next_con
>=
cons
;
--
next_con
)
{
mysql_close
(
&
next_con
->
mysql
);
my_free
(
next_con
->
name
,
MYF
(
MY_ALLOW_ZERO_PTR
));
}
}
int
safe_copy_unescape
(
char
*
dest
,
char
*
src
,
int
size
)
int
safe_copy_unescape
(
char
*
dest
,
char
*
src
,
int
size
)
{
{
...
@@ -642,7 +704,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
...
@@ -642,7 +704,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
switch
(
state
)
switch
(
state
)
{
{
case
ST_NORMAL
:
case
ST_NORMAL
:
if
(
c
==
'\\'
)
if
(
c
==
'\\'
)
{
{
state
=
ST_ESCAPED
;
state
=
ST_ESCAPED
;
}
}
...
@@ -650,7 +712,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
...
@@ -650,7 +712,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
*
p_dest
++
=
c
;
*
p_dest
++
=
c
;
break
;
break
;
case
ST_ESCAPED
:
case
ST_ESCAPED
:
if
((
val
=
hex_val
(
c
))
>
0
)
if
((
val
=
hex_val
(
c
))
>
0
)
{
{
*
p_dest
=
val
;
*
p_dest
=
val
;
state
=
ST_HEX2
;
state
=
ST_HEX2
;
...
@@ -662,7 +724,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
...
@@ -662,7 +724,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
}
}
break
;
break
;
case
ST_HEX2
:
case
ST_HEX2
:
if
((
val
=
hex_val
(
c
))
>
0
)
if
((
val
=
hex_val
(
c
))
>
0
)
{
{
*
p_dest
=
(
*
p_dest
<<
4
)
+
val
;
*
p_dest
=
(
*
p_dest
<<
4
)
+
val
;
p_dest
++
;
p_dest
++
;
...
@@ -683,21 +745,21 @@ int safe_copy_unescape(char* dest, char* src, int size)
...
@@ -683,21 +745,21 @@ int safe_copy_unescape(char* dest, char* src, int size)
int
read_line
(
char
*
buf
,
int
size
)
int
read_line
(
char
*
buf
,
int
size
)
{
{
int
c
;
int
c
;
char
*
p
=
buf
,
*
buf_end
=
buf
+
size
;
char
*
p
=
buf
,
*
buf_end
=
buf
+
size
-
1
;
int
no_save
=
0
;
int
no_save
=
0
;
enum
{
R_NORMAL
,
R_Q1
,
R_ESC_Q_Q1
,
R_ESC_Q_Q2
,
enum
{
R_NORMAL
,
R_Q1
,
R_ESC_Q_Q1
,
R_ESC_Q_Q2
,
R_ESC_SLASH_Q1
,
R_ESC_SLASH_Q2
,
R_ESC_SLASH_Q1
,
R_ESC_SLASH_Q2
,
R_Q2
,
R_COMMENT
,
R_LINE_START
}
state
=
R_LINE_START
;
R_Q2
,
R_COMMENT
,
R_LINE_START
}
state
=
R_LINE_START
;
for
(;
p
<
buf_end
;)
for
(;
p
<
buf_end
;)
{
{
no_save
=
0
;
no_save
=
0
;
c
=
fgetc
(
*
cur_file
);
c
=
fgetc
(
*
cur_file
);
if
(
feof
(
*
cur_file
))
if
(
feof
(
*
cur_file
))
{
{
fclose
(
*
cur_file
);
my_fclose
(
*
cur_file
,
MYF
(
0
)
);
if
(
cur_file
==
file_stack
)
if
(
cur_file
==
file_stack
)
return
1
;
return
1
;
else
else
{
{
...
@@ -706,45 +768,44 @@ int read_line(char* buf, int size)
...
@@ -706,45 +768,44 @@ int read_line(char* buf, int size)
}
}
}
}
switch
(
state
)
switch
(
state
)
{
{
case
R_NORMAL
:
case
R_NORMAL
:
if
(
c
==
';'
||
c
==
'{'
)
/* '{' allows some interesting syntax
if
(
c
==
';'
||
c
==
'{'
)
/* '{' allows some interesting syntax
* but we don't care, as long as the
* but we don't care, as long as the
* correct sytnax gets parsed right */
* correct sytnax gets parsed right */
{
{
*
p
=
0
;
*
p
=
0
;
return
0
;
return
0
;
}
}
else
if
(
c
==
'\''
)
else
if
(
c
==
'\''
)
state
=
R_Q1
;
state
=
R_Q1
;
else
if
(
c
==
'"'
)
else
if
(
c
==
'"'
)
state
=
R_Q2
;
state
=
R_Q2
;
else
if
(
c
==
'\n'
)
else
if
(
c
==
'\n'
)
state
=
R_LINE_START
;
state
=
R_LINE_START
;
break
;
break
;
case
R_COMMENT
:
case
R_COMMENT
:
no_save
=
1
;
if
(
c
==
'\n'
)
if
(
c
==
'\n'
)
{
state
=
R_LINE_START
;
*
p
=
0
;
return
0
;
}
break
;
break
;
case
R_LINE_START
:
case
R_LINE_START
:
if
(
c
==
'#
'
)
if
(
c
==
'#'
||
c
==
'-
'
)
{
{
state
=
R_COMMENT
;
state
=
R_COMMENT
;
no_save
=
1
;
}
}
else
if
(
isspace
(
c
))
else
if
(
isspace
(
c
))
no_save
=
1
;
no_save
=
1
;
else
if
(
c
==
'}'
)
else
if
(
c
==
'}'
)
{
{
*
buf
++
=
'}'
;
*
buf
++
=
'}'
;
*
buf
=
0
;
*
buf
=
0
;
return
0
;
return
0
;
}
}
else
if
(
c
==
';'
||
c
==
'{'
)
else
if
(
c
==
';'
||
c
==
'{'
)
{
{
*
p
=
0
;
*
p
=
0
;
return
0
;
return
0
;
...
@@ -754,18 +815,18 @@ int read_line(char* buf, int size)
...
@@ -754,18 +815,18 @@ int read_line(char* buf, int size)
break
;
break
;
case
R_Q1
:
case
R_Q1
:
if
(
c
==
'\''
)
if
(
c
==
'\''
)
state
=
R_ESC_Q_Q1
;
state
=
R_ESC_Q_Q1
;
else
if
(
c
==
'\\'
)
else
if
(
c
==
'\\'
)
state
=
R_ESC_SLASH_Q1
;
state
=
R_ESC_SLASH_Q1
;
break
;
break
;
case
R_ESC_Q_Q1
:
case
R_ESC_Q_Q1
:
if
(
c
==
';'
)
if
(
c
==
';'
)
{
{
*
p
=
0
;
*
p
=
0
;
return
0
;
return
0
;
}
}
if
(
c
!=
'\''
)
if
(
c
!=
'\''
)
state
=
R_NORMAL
;
state
=
R_NORMAL
;
break
;
break
;
case
R_ESC_SLASH_Q1
:
case
R_ESC_SLASH_Q1
:
...
@@ -773,18 +834,18 @@ int read_line(char* buf, int size)
...
@@ -773,18 +834,18 @@ int read_line(char* buf, int size)
break
;
break
;
case
R_Q2
:
case
R_Q2
:
if
(
c
==
'"'
)
if
(
c
==
'"'
)
state
=
R_ESC_Q_Q2
;
state
=
R_ESC_Q_Q2
;
else
if
(
c
==
'\\'
)
else
if
(
c
==
'\\'
)
state
=
R_ESC_SLASH_Q2
;
state
=
R_ESC_SLASH_Q2
;
break
;
break
;
case
R_ESC_Q_Q2
:
case
R_ESC_Q_Q2
:
if
(
c
==
';'
)
if
(
c
==
';'
)
{
{
*
p
=
0
;
*
p
=
0
;
return
0
;
return
0
;
}
}
if
(
c
!=
'"'
)
if
(
c
!=
'"'
)
state
=
R_NORMAL
;
state
=
R_NORMAL
;
break
;
break
;
case
R_ESC_SLASH_Q2
:
case
R_ESC_SLASH_Q2
:
...
@@ -792,9 +853,10 @@ int read_line(char* buf, int size)
...
@@ -792,9 +853,10 @@ int read_line(char* buf, int size)
break
;
break
;
}
}
if
(
!
no_save
)
if
(
!
no_save
)
*
p
++
=
c
;
*
p
++
=
c
;
}
}
*
p
=
0
;
/* Always end with \0 */
return
feof
(
*
cur_file
);
return
feof
(
*
cur_file
);
}
}
...
@@ -804,58 +866,69 @@ int read_query(struct query** q_ptr)
...
@@ -804,58 +866,69 @@ int read_query(struct query** q_ptr)
char
*
p
=
buf
,
*
p1
;
char
*
p
=
buf
,
*
p1
;
int
c
,
expected_errno
;
int
c
,
expected_errno
;
struct
query
*
q
;
struct
query
*
q
;
if
(
parser
.
current_line
<
parser
.
read_lines
)
if
(
parser
.
current_line
<
parser
.
read_lines
)
{
{
get_dynamic
(
&
q_lines
,
(
gptr
)
q_ptr
,
parser
.
current_line
)
;
get_dynamic
(
&
q_lines
,
(
gptr
)
q_ptr
,
parser
.
current_line
)
;
return
0
;
return
0
;
}
}
if
(
!
(
*
q_ptr
=
q
=
(
struct
query
*
)
my_malloc
(
sizeof
(
*
q
),
MYF
(
MY_WME
)))
if
(
!
(
*
q_ptr
=
q
=
(
struct
query
*
)
my_malloc
(
sizeof
(
*
q
),
MYF
(
MY_WME
)))
||
insert_dynamic
(
&
q_lines
,
(
gptr
)
&
q
)
||
insert_dynamic
(
&
q_lines
,
(
gptr
)
&
q
)
)
)
die
(
"Out of memory"
);
die
(
"Out of memory"
);
q
->
record_file
[
0
]
=
0
;
q
->
record_file
[
0
]
=
0
;
q
->
require_file
=
0
;
q
->
abort_on_error
=
1
;
q
->
abort_on_error
=
1
;
q
->
has_result_set
=
0
;
q
->
first_word_len
=
0
;
q
->
first_word_len
=
0
;
q
->
expected_errno
=
0
;
q
->
expected_errno
=
0
;
q
->
type
=
Q_UNKNOWN
;
q
->
type
=
Q_UNKNOWN
;
if
(
read_line
(
buf
,
sizeof
(
buf
)))
if
(
read_line
(
buf
,
sizeof
(
buf
)))
return
1
;
return
1
;
if
(
*
p
==
'!'
)
if
(
*
p
==
'#'
)
{
q
->
type
=
Q_COMMENT
;
}
else
if
(
p
[
0
]
==
'-'
&&
p
[
1
]
==
'-'
)
{
q
->
type
=
Q_COMMENT_WITH_COMMAND
;
p
+=
2
;
/* To calculate first word */
}
else
{
if
(
*
p
==
'!'
)
{
{
q
->
abort_on_error
=
0
;
q
->
abort_on_error
=
0
;
p
++
;
p
++
;
if
(
*
p
==
'$'
)
if
(
*
p
==
'$'
)
{
{
expected_errno
=
0
;
expected_errno
=
0
;
p
++
;
p
++
;
for
(;
isdigit
(
*
p
);
p
++
)
for
(;
isdigit
(
*
p
);
p
++
)
expected_errno
=
expected_errno
*
10
+
*
p
-
'0'
;
expected_errno
=
expected_errno
*
10
+
*
p
-
'0'
;
q
->
expected_errno
=
expected_errno
;
q
->
expected_errno
=
expected_errno
;
}
}
}
}
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
*
p
==
'@'
)
if
(
*
p
==
'@'
)
{
{
q
->
has_result_set
=
1
;
p
++
;
p
++
;
p1
=
q
->
record_file
;
p1
=
q
->
record_file
;
while
(
!
isspace
(
c
=
*
p
)
&&
while
(
!
isspace
(
c
=
*
p
)
&&
p1
<
q
->
record_file
+
sizeof
(
q
->
record_file
)
-
1
)
p1
<
q
->
record_file
+
sizeof
(
q
->
record_file
)
-
1
)
*
p1
++
=
*
p
++
;
*
p1
++
=
*
p
++
;
*
p1
=
0
;
*
p1
=
0
;
}
}
}
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
/* Calculate first word */
p1
=
q
->
q
;
p1
=
q
->
q
;
while
(
*
p
&&
!
isspace
(
*
p
))
while
(
*
p
&&
!
isspace
(
*
p
))
*
p1
++
=
*
p
++
;
*
p1
++
=
*
p
++
;
q
->
first_word_len
=
p1
-
q
->
q
;
q
->
first_word_len
=
p1
-
q
->
q
;
str
cpy
(
p1
,
p
);
str
mov
(
p1
,
p
);
parser
.
read_lines
++
;
parser
.
read_lines
++
;
return
0
;
return
0
;
}
}
...
@@ -878,31 +951,6 @@ struct option long_options[] =
...
@@ -878,31 +951,6 @@ struct option long_options[] =
{
0
,
0
,
0
,
0
}
{
0
,
0
,
0
,
0
}
};
};
void
die
(
const
char
*
fmt
,
...)
{
va_list
args
;
va_start
(
args
,
fmt
);
fprintf
(
stderr
,
"%s: "
,
my_progname
);
vfprintf
(
stderr
,
fmt
,
args
);
fprintf
(
stderr
,
"
\n
"
);
va_end
(
args
);
close_cons
();
exit
(
1
);
}
void
verbose_msg
(
const
char
*
fmt
,
...)
{
va_list
args
;
if
(
!
verbose
)
return
;
va_start
(
args
,
fmt
);
fprintf
(
stderr
,
"%s: "
,
my_progname
);
vfprintf
(
stderr
,
fmt
,
args
);
fprintf
(
stderr
,
"
\n
"
);
va_end
(
args
);
}
static
void
print_version
(
void
)
static
void
print_version
(
void
)
{
{
...
@@ -990,7 +1038,7 @@ int parse_args(int argc, char **argv)
...
@@ -990,7 +1038,7 @@ int parse_args(int argc, char **argv)
exit
(
0
);
exit
(
0
);
default:
default:
usage
();
usage
();
exit
(
0
);
exit
(
1
);
}
}
}
}
...
@@ -1002,10 +1050,7 @@ int parse_args(int argc, char **argv)
...
@@ -1002,10 +1050,7 @@ int parse_args(int argc, char **argv)
exit
(
1
);
exit
(
1
);
}
}
if
(
argc
==
1
)
if
(
argc
==
1
)
{
db
=
*
argv
;
my_free
(
db
,
MYF
(
MY_ALLOW_ZERO_PTR
));
db
=
my_strdup
(
*
argv
,
MYF
(
MY_WME
));
}
if
(
tty_password
)
if
(
tty_password
)
pass
=
get_tty_password
(
NullS
);
pass
=
get_tty_password
(
NullS
);
...
@@ -1024,9 +1069,9 @@ char* safe_str_append(char* buf, const char* str, int size)
...
@@ -1024,9 +1069,9 @@ char* safe_str_append(char* buf, const char* str, int size)
void
str_to_file
(
const
char
*
fname
,
char
*
str
,
int
size
)
void
str_to_file
(
const
char
*
fname
,
char
*
str
,
int
size
)
{
{
int
fd
;
int
fd
;
if
((
fd
=
my_open
(
fname
,
O_WRONLY
|
O_CREAT
,
MYF
(
MY_WME
|
MY_FFNF
)))
<
0
)
if
((
fd
=
my_open
(
fname
,
O_WRONLY
|
O_CREAT
,
MYF
(
MY_WME
|
MY_FFNF
)))
<
0
)
die
(
"Could not open %s: errno = %d"
,
fname
,
errno
);
die
(
"Could not open %s: errno = %d"
,
fname
,
errno
);
if
(
my_write
(
fd
,
(
byte
*
)
str
,
size
,
MYF
(
MY_WME
|
MY_FNABP
)))
if
(
my_write
(
fd
,
(
byte
*
)
str
,
size
,
MYF
(
MY_WME
|
MY_FNABP
)))
die
(
"write failed"
);
die
(
"write failed"
);
my_close
(
fd
,
MYF
(
0
));
my_close
(
fd
,
MYF
(
0
));
}
}
...
@@ -1042,6 +1087,7 @@ void reject_dump(const char* record_file, char* buf, int size)
...
@@ -1042,6 +1087,7 @@ void reject_dump(const char* record_file, char* buf, int size)
str_to_file
(
reject_file
,
buf
,
size
);
str_to_file
(
reject_file
,
buf
,
size
);
}
}
int
run_query
(
MYSQL
*
mysql
,
struct
query
*
q
)
int
run_query
(
MYSQL
*
mysql
,
struct
query
*
q
)
{
{
MYSQL_RES
*
res
=
0
;
MYSQL_RES
*
res
=
0
;
...
@@ -1055,23 +1101,23 @@ int run_query(MYSQL* mysql, struct query* q)
...
@@ -1055,23 +1101,23 @@ int run_query(MYSQL* mysql, struct query* q)
DYN_STRING
ds_tmp
;
DYN_STRING
ds_tmp
;
dyn_string_init
(
&
ds_tmp
);
dyn_string_init
(
&
ds_tmp
);
if
(
q
->
record_file
[
0
])
if
(
q
->
record_file
[
0
])
{
{
ds
=
&
ds_tmp
;
ds
=
&
ds_tmp
;
}
}
if
(
mysql_query
(
mysql
,
q
->
q
))
if
(
mysql_query
(
mysql
,
q
->
q
))
{
{
if
(
q
->
abort_on_error
)
if
(
q
->
require_file
)
abort_not_supported_test
();
if
(
q
->
abort_on_error
)
die
(
"query '%s' failed: %s"
,
q
->
q
,
mysql_error
(
mysql
));
die
(
"query '%s' failed: %s"
,
q
->
q
,
mysql_error
(
mysql
));
else
else
{
{
if
(
q
->
expected_errno
)
if
(
q
->
expected_errno
)
{
{
error
=
(
q
->
expected_errno
!=
mysql_errno
(
mysql
));
error
=
(
q
->
expected_errno
!=
mysql_errno
(
mysql
));
if
(
error
)
if
(
error
)
verbose_msg
(
"query '%s' failed with wrong errno\
verbose_msg
(
"query '%s' failed with wrong errno\
%d instead of %d"
,
q
->
q
,
mysql_errno
(
mysql
),
q
->
expected_errno
);
%d instead of %d"
,
q
->
q
,
mysql_errno
(
mysql
),
q
->
expected_errno
);
goto
end
;
goto
end
;
...
@@ -1085,7 +1131,7 @@ int run_query(MYSQL* mysql, struct query* q)
...
@@ -1085,7 +1131,7 @@ int run_query(MYSQL* mysql, struct query* q)
}
}
}
}
if
(
q
->
expected_errno
)
if
(
q
->
expected_errno
)
{
{
error
=
1
;
error
=
1
;
verbose_msg
(
"query '%s' succeeded - should have failed with errno %d"
,
verbose_msg
(
"query '%s' succeeded - should have failed with errno %d"
,
...
@@ -1094,9 +1140,11 @@ int run_query(MYSQL* mysql, struct query* q)
...
@@ -1094,9 +1140,11 @@ int run_query(MYSQL* mysql, struct query* q)
}
}
if
(
!
(
res
=
mysql_store_result
(
mysql
))
&&
mysql_field_count
(
mysql
))
if
(
!
(
res
=
mysql_store_result
(
mysql
))
&&
mysql_field_count
(
mysql
))
{
{
if
(
q
->
abort_on_error
)
if
(
q
->
require_file
)
abort_not_supported_test
();
if
(
q
->
abort_on_error
)
die
(
"failed in mysql_store_result for query '%s'"
,
q
->
q
);
die
(
"failed in mysql_store_result for query '%s'"
,
q
->
q
);
else
else
{
{
...
@@ -1106,14 +1154,15 @@ int run_query(MYSQL* mysql, struct query* q)
...
@@ -1106,14 +1154,15 @@ int run_query(MYSQL* mysql, struct query* q)
}
}
}
}
if
(
!
res
)
goto
end
;
if
(
!
res
)
goto
end
;
fields
=
mysql_fetch_fields
(
res
);
fields
=
mysql_fetch_fields
(
res
);
num_fields
=
mysql_num_fields
(
res
);
num_fields
=
mysql_num_fields
(
res
);
for
(
i
=
0
;
i
<
num_fields
;
i
++
)
for
(
i
=
0
;
i
<
num_fields
;
i
++
)
{
{
dyn_string_append
(
ds
,
fields
[
i
].
name
,
0
);
if
(
i
)
dyn_string_append
(
ds
,
"
\t
"
,
1
);
dyn_string_append
(
ds
,
"
\t
"
,
1
);
dyn_string_append
(
ds
,
fields
[
i
].
name
,
0
);
}
}
dyn_string_append
(
ds
,
"
\n
"
,
1
);
dyn_string_append
(
ds
,
"
\n
"
,
1
);
...
@@ -1127,107 +1176,67 @@ int run_query(MYSQL* mysql, struct query* q)
...
@@ -1127,107 +1176,67 @@ int run_query(MYSQL* mysql, struct query* q)
val
=
(
char
*
)
row
[
i
];
val
=
(
char
*
)
row
[
i
];
len
=
lengths
[
i
];
len
=
lengths
[
i
];
if
(
!
val
)
if
(
!
val
)
{
{
val
=
(
char
*
)
"NULL"
;
val
=
(
char
*
)
"NULL"
;
len
=
4
;
len
=
4
;
}
}
dyn_string_append
(
ds
,
val
,
len
);
if
(
i
)
dyn_string_append
(
ds
,
"
\t
"
,
1
);
dyn_string_append
(
ds
,
"
\t
"
,
1
);
dyn_string_append
(
ds
,
val
,
len
);
}
}
dyn_string_append
(
ds
,
"
\n
"
,
1
);
dyn_string_append
(
ds
,
"
\n
"
,
1
);
}
}
if
(
record
)
if
(
record
)
{
{
if
(
!
q
->
record_file
[
0
]
&&
!
result_file
)
if
(
!
q
->
record_file
[
0
]
&&
!
result_file
)
die
(
"Missing result file"
);
die
(
"Missing result file"
);
if
(
!
result_file
)
if
(
!
result_file
)
str_to_file
(
q
->
record_file
,
ds
->
str
,
ds
->
len
);
str_to_file
(
q
->
record_file
,
ds
->
str
,
ds
->
len
);
}
}
else
if
(
q
->
record_file
[
0
])
else
if
(
q
->
record_file
[
0
])
{
{
error
=
check_result
(
ds
,
q
->
record
_file
);
error
=
check_result
(
ds
,
q
->
record_file
,
q
->
require
_file
);
}
}
end:
end:
if
(
res
)
mysql_free_result
(
res
);
if
(
res
)
mysql_free_result
(
res
);
return
error
;
return
error
;
}
}
int
check_first_word
(
struct
query
*
q
,
const
char
*
word
,
int
len
)
{
const
char
*
p
,
*
p1
,
*
end
;
if
(
len
!=
q
->
first_word_len
)
return
0
;
p
=
word
;
end
=
p
+
len
;
p1
=
q
->
q
;
for
(;
p
<
end
;
p
++
,
p1
++
)
if
(
tolower
(
*
p
)
!=
tolower
(
*
p1
))
return
0
;
return
1
;
}
void
get_query_type
(
struct
query
*
q
)
void
get_query_type
(
struct
query
*
q
)
{
{
if
(
*
q
->
q
==
'}'
)
char
save
;
uint
type
;
if
(
*
q
->
q
==
'}'
)
{
{
q
->
type
=
Q_END_BLOCK
;
q
->
type
=
Q_END_BLOCK
;
return
;
return
;
}
}
if
(
q
->
type
!=
Q_COMMENT_WITH_COMMAND
)
q
->
type
=
Q_QUERY
;
q
->
type
=
Q_QUERY
;
switch
(
q
->
first_word_len
)
{
case
3
:
if
(
check_first_word
(
q
,
"inc"
,
3
))
q
->
type
=
Q_INC
;
else
if
(
check_first_word
(
q
,
"dec"
,
3
))
q
->
type
=
Q_DEC
;
else
if
(
check_first_word
(
q
,
"let"
,
3
))
q
->
type
=
Q_LET
;
break
;
case
4
:
if
(
check_first_word
(
q
,
"echo"
,
4
))
q
->
type
=
Q_ECHO
;
break
;
case
5
:
if
(
check_first_word
(
q
,
"sleep"
,
5
))
q
->
type
=
Q_SLEEP
;
else
if
(
check_first_word
(
q
,
"while"
,
5
))
q
->
type
=
Q_WHILE
;
break
;
case
6
:
if
(
check_first_word
(
q
,
"source"
,
6
))
q
->
type
=
Q_SOURCE
;
else
if
(
check_first_word
(
q
,
"system"
,
6
))
q
->
type
=
Q_SYSTEM
;
break
;
case
7
:
if
(
check_first_word
(
q
,
"connect"
,
7
))
q
->
type
=
Q_CONNECT
;
break
;
case
10
:
if
(
check_first_word
(
q
,
"connection"
,
10
))
q
->
type
=
Q_CONNECTION
;
else
if
(
check_first_word
(
q
,
"disconnect"
,
10
))
q
->
type
=
Q_DISCONNECT
;
break
;
}
save
=
q
->
q
[
q
->
first_word_len
];
q
->
q
[
q
->
first_word_len
]
=
0
;
type
=
find_type
(
q
->
q
,
&
command_typelib
,
0
);
q
->
q
[
q
->
first_word_len
]
=
save
;
if
(
type
>
0
)
q
->
type
=
type
;
/* Found command */
}
}
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
int
error
=
0
;
int
error
=
0
;
struct
query
*
q
;
struct
query
*
q
;
my_bool
require_file
=
0
;
char
save_file
[
FN_REFLEN
];
save_file
[
0
]
=
0
;
MY_INIT
(
argv
[
0
]);
MY_INIT
(
argv
[
0
]);
memset
(
cons
,
0
,
sizeof
(
cons
));
memset
(
cons
,
0
,
sizeof
(
cons
));
...
@@ -1245,21 +1254,20 @@ int main(int argc, char** argv)
...
@@ -1245,21 +1254,20 @@ int main(int argc, char** argv)
cur_block
=
block_stack
;
cur_block
=
block_stack
;
dyn_string_init
(
&
ds_res
);
dyn_string_init
(
&
ds_res
);
parse_args
(
argc
,
argv
);
parse_args
(
argc
,
argv
);
if
(
!*
cur_file
)
if
(
!*
cur_file
)
*
cur_file
=
stdin
;
*
cur_file
=
stdin
;
if
(
!
(
mysql_init
(
&
cur_con
->
mysql
)))
if
(
!
(
mysql_init
(
&
cur_con
->
mysql
)))
die
(
"Failed in mysql_init()"
);
die
(
"Failed in mysql_init()"
);
mysql_options
(
&
cur_con
->
mysql
,
MYSQL_READ_DEFAULT_GROUP
,
"mysql"
);
mysql_options
(
&
cur_con
->
mysql
,
MYSQL_READ_DEFAULT_GROUP
,
"mysql"
);
cur_con
->
name
=
my_strdup
(
"default"
,
MYF
(
MY_WME
));
cur_con
->
name
=
my_strdup
(
"default"
,
MYF
(
MY_WME
));
if
(
!
cur_con
->
name
)
if
(
!
cur_con
->
name
)
die
(
"Out of memory"
);
die
(
"Out of memory"
);
if
(
!
mysql_real_connect
(
&
cur_con
->
mysql
,
host
,
if
(
!
mysql_real_connect
(
&
cur_con
->
mysql
,
host
,
user
,
pass
,
db
,
port
,
unix_sock
,
user
,
pass
,
db
,
port
,
unix_sock
,
0
))
0
))
die
(
"Failed in mysql_real_connect(): %s"
,
mysql_error
(
&
cur_con
->
mysql
));
die
(
"Failed in mysql_real_connect(): %s"
,
mysql_error
(
&
cur_con
->
mysql
));
...
@@ -1267,13 +1275,12 @@ int main(int argc, char** argv)
...
@@ -1267,13 +1275,12 @@ int main(int argc, char** argv)
for
(;
!
read_query
(
&
q
);)
for
(;
!
read_query
(
&
q
);)
{
{
int
current_line_inc
=
1
,
processed
=
0
;
int
current_line_inc
=
1
,
processed
=
0
;
if
(
q
->
type
==
Q_UNKNOWN
)
if
(
q
->
type
==
Q_UNKNOWN
||
q
->
type
==
Q_COMMENT_WITH_COMMAND
)
get_query_type
(
q
);
get_query_type
(
q
);
if
(
block_ok
)
if
(
block_ok
)
{
{
processed
=
1
;
processed
=
1
;
switch
(
q
->
type
)
switch
(
q
->
type
)
{
{
case
Q_CONNECT
:
do_connect
(
q
);
break
;
case
Q_CONNECT
:
do_connect
(
q
);
break
;
case
Q_CONNECTION
:
select_connection
(
q
);
break
;
case
Q_CONNECTION
:
select_connection
(
q
);
break
;
case
Q_DISCONNECT
:
close_connection
(
q
);
break
;
case
Q_DISCONNECT
:
close_connection
(
q
);
break
;
...
@@ -1284,12 +1291,31 @@ int main(int argc, char** argv)
...
@@ -1284,12 +1291,31 @@ int main(int argc, char** argv)
case
Q_ECHO
:
do_echo
(
q
);
break
;
case
Q_ECHO
:
do_echo
(
q
);
break
;
case
Q_SYSTEM
:
do_system
(
q
);
break
;
case
Q_SYSTEM
:
do_system
(
q
);
break
;
case
Q_LET
:
do_let
(
q
);
break
;
case
Q_LET
:
do_let
(
q
);
break
;
case
Q_QUERY
:
error
|=
run_query
(
&
cur_con
->
mysql
,
q
);
break
;
case
Q_QUERY
:
{
if
(
save_file
[
0
])
{
strmov
(
q
->
record_file
,
save_file
);
q
->
require_file
=
require_file
;
save_file
[
0
]
=
0
;
}
error
|=
run_query
(
&
cur_con
->
mysql
,
q
);
break
;
}
case
Q_RESULT
:
get_file_name
(
save_file
,
q
);
require_file
=
0
;
break
;
case
Q_REQUIRE
:
get_file_name
(
save_file
,
q
);
require_file
=
1
;
break
;
case
Q_COMMENT
:
/* Ignore row */
case
Q_COMMENT_WITH_COMMAND
:
default:
processed
=
0
;
break
;
default:
processed
=
0
;
break
;
}
}
}
}
if
(
!
processed
)
if
(
!
processed
)
{
{
current_line_inc
=
0
;
current_line_inc
=
0
;
switch
(
q
->
type
)
switch
(
q
->
type
)
...
@@ -1305,10 +1331,10 @@ int main(int argc, char** argv)
...
@@ -1305,10 +1331,10 @@ int main(int argc, char** argv)
close_cons
();
close_cons
();
if
(
result_file
&&
ds_res
.
len
)
if
(
result_file
&&
ds_res
.
len
)
{
{
if
(
!
record
)
if
(
!
record
)
error
|=
check_result
(
&
ds_res
,
result
_file
);
error
|=
check_result
(
&
ds_res
,
result_file
,
q
->
require
_file
);
else
else
str_to_file
(
result_file
,
ds_res
.
str
,
ds_res
.
len
);
str_to_file
(
result_file
,
ds_res
.
str
,
ds_res
.
len
);
}
}
...
...
configure.in
View file @
361067e9
...
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
...
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT
(
sql/mysqld.cc
)
AC_INIT
(
sql/mysqld.cc
)
AC_CANONICAL_SYSTEM
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
# The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE
(
mysql, 3.23.
29a
-gamma
)
AM_INIT_AUTOMAKE
(
mysql, 3.23.
30
-gamma
)
AM_CONFIG_HEADER
(
config.h
)
AM_CONFIG_HEADER
(
config.h
)
PROTOCOL_VERSION
=
10
PROTOCOL_VERSION
=
10
...
...
myisam/myisamlog.c
View file @
361067e9
...
@@ -393,7 +393,7 @@ static int examine_log(my_string file_name, char **table_names)
...
@@ -393,7 +393,7 @@ static int examine_log(my_string file_name, char **table_names)
char
*
pos
,
*
to
;
char
*
pos
,
*
to
;
/* Fix if old DOS files to new format */
/* Fix if old DOS files to new format */
for
(
pos
=
file_info
.
name
;
pos
=
strchr
(
pos
,
'\\'
)
;
pos
++
)
for
(
pos
=
file_info
.
name
;
(
pos
=
strchr
(
pos
,
'\\'
)
)
;
pos
++
)
*
pos
=
'/'
;
*
pos
=
'/'
;
pos
=
file_info
.
name
;
pos
=
file_info
.
name
;
...
...
mysql-test/include/have_bdb.inc
0 → 100644
View file @
361067e9
--
require
r
/
have_bdb
.
require
show
variables
like
"have_bdb"
;
mysql-test/include/have_isam.inc
0 → 100644
View file @
361067e9
--
require
r
/
have_isam
.
require
show
variables
like
"have_isam"
;
mysql-test/mysql-test-run.sh
View file @
361067e9
...
@@ -189,6 +189,10 @@ fail_inc () {
...
@@ -189,6 +189,10 @@ fail_inc () {
TOT_FAIL
=
`
$EXPR
$TOT_FAIL
+ 1
`
TOT_FAIL
=
`
$EXPR
$TOT_FAIL
+ 1
`
}
}
skip_inc
()
{
TOT_SKIP
=
`
$EXPR
$TOT_SKIP
+ 1
`
}
total_inc
()
{
total_inc
()
{
TOT_TEST
=
`
$EXPR
$TOT_TEST
+ 1
`
TOT_TEST
=
`
$EXPR
$TOT_TEST
+ 1
`
}
}
...
@@ -463,9 +467,14 @@ run_testcase ()
...
@@ -463,9 +467,14 @@ run_testcase ()
$SETCOLOR_NORMAL
&&
$ECHO
-n
"
$pname
$timestr
"
$SETCOLOR_NORMAL
&&
$ECHO
-n
"
$pname
$timestr
"
total_inc
if
[
$res
!=
0
]
;
then
if
[
$res
==
0
]
;
then
total_inc
pass_inc
echo
"
$RES_SPACE
[ pass ]"
else
if
[
$res
==
1
]
;
then
total_inc
fail_inc
fail_inc
echo
"
$RES_SPACE
[ fail ]"
echo
"
$RES_SPACE
[ fail ]"
$ECHO
"failed output"
$ECHO
"failed output"
...
@@ -483,10 +492,10 @@ run_testcase ()
...
@@ -483,10 +492,10 @@ run_testcase ()
echo
"Resuming Tests"
echo
"Resuming Tests"
else
else
pass_inc
pass_inc
echo
"
$RES_SPACE
[ pass ]"
echo
"
$RES_SPACE
[ skipped ]"
fi
fi
fi
fi
fi
}
}
...
@@ -525,7 +534,8 @@ then
...
@@ -525,7 +534,8 @@ then
done
done
fi
fi
else
else
tf
=
$TESTDIR
/
$1
.
$TESTSUFFIX
tname
=
`
$BASENAME
$1
.test
`
tf
=
$TESTDIR
/
$tname
.
$TESTSUFFIX
if
[
-f
$tf
]
;
then
if
[
-f
$tf
]
;
then
run_testcase
$tf
run_testcase
$tf
else
else
...
...
mysql-test/r/3.23/README
deleted
100644 → 0
View file @
988a98c3
mysql-test/r/alt000001.result
View file @
361067e9
mysql-test/r/bdb.result
View file @
361067e9
...
@@ -22,3 +22,6 @@ id code name
...
@@ -22,3 +22,6 @@ id code name
7 4 Matt
7 4 Matt
8 1 Sinisa
8 1 Sinisa
12 1 Ralph
12 1 Ralph
gesuchnr benutzer_id
1 1
2 1
mysql-test/r/crypt.result
View file @
361067e9
mysql-test/r/equal.result
View file @
361067e9
mysql-test/r/ft0000001.a.result
View file @
361067e9
mysql-test/r/ft0000001.b.result
View file @
361067e9
mysql-test/r/ft0000001.c.result
View file @
361067e9
mysql-test/r/ft0000001.d.result
View file @
361067e9
mysql-test/r/ft0000001.e.result
View file @
361067e9
mysql-test/r/ft0000002.a.result
View file @
361067e9
mysql-test/r/ft0000002.b.result
View file @
361067e9
mysql-test/r/ft0000002.c.result
View file @
361067e9
mysql-test/r/have_bdb.require
0 → 100644
View file @
361067e9
Variable_name Value
have_bdb YES
mysql-test/r/have_isam.require
0 → 100644
View file @
361067e9
Variable_name Value
have_isam YES
mysql-test/r/ins000001.result
View file @
361067e9
mysql-test/r/mrg000001.dummy.result
View file @
361067e9
mysql-test/r/mrg000001.result
View file @
361067e9
mysql-test/r/mrg000002.result
View file @
361067e9
mysql-test/r/rpl000001.a.result
View file @
361067e9
mysql-test/r/rpl000001.b.result
View file @
361067e9
mysql-test/r/rpl000002.result
View file @
361067e9
mysql-test/r/rpl000003.result
View file @
361067e9
mysql-test/r/rpl000004.a.result
View file @
361067e9
mysql-test/r/rpl000004.b.result
View file @
361067e9
mysql-test/r/rpl000005.result
View file @
361067e9
mysql-test/r/rpl000006.result
View file @
361067e9
mysql-test/r/rpl000007.result
View file @
361067e9
mysql-test/r/rpl000008.result
View file @
361067e9
mysql-test/r/rpl000009.result
View file @
361067e9
mysql-test/r/rpl000010.result
View file @
361067e9
mysql-test/r/rpl000011.result
View file @
361067e9
mysql-test/r/rpl000012.result
View file @
361067e9
mysql-test/r/rpl000012.status.result
View file @
361067e9
mysql-test/r/rpl000013.result
View file @
361067e9
mysql-test/r/rpl000013.status.result
View file @
361067e9
mysql-test/r/rpl000014.result
View file @
361067e9
mysql-test/r/rpl000015.result
View file @
361067e9
mysql-test/r/rpl000016.result
View file @
361067e9
mysql-test/r/sel000001.result
View file @
361067e9
mysql-test/r/sel000002.result
View file @
361067e9
mysql-test/r/sel000003.result
View file @
361067e9
mysql-test/r/sel000004.result
View file @
361067e9
mysql-test/r/sel000005.result
View file @
361067e9
mysql-test/r/sel000006.result
View file @
361067e9
mysql-test/r/sel000007.result
View file @
361067e9
mysql-test/r/sel000008.result
View file @
361067e9
mysql-test/r/sel000009.result
View file @
361067e9
mysql-test/r/sel000010.result
View file @
361067e9
mysql-test/r/sel000011.result
View file @
361067e9
mysql-test/r/sel000012.result
View file @
361067e9
mysql-test/r/sel000013.result
View file @
361067e9
mysql-test/r/sel000014.result
View file @
361067e9
mysql-test/r/sel000015.result
View file @
361067e9
mysql-test/r/sel000016.result
View file @
361067e9
mysql-test/r/sel000017.result
View file @
361067e9
mysql-test/r/sel000018.result
View file @
361067e9
mysql-test/r/sel000019.result
View file @
361067e9
mysql-test/r/sel000020.result
View file @
361067e9
mysql-test/r/sel000021.result
View file @
361067e9
mysql-test/r/sel000022.result
View file @
361067e9
mysql-test/r/sel000023.result
View file @
361067e9
mysql-test/r/sel000024.result
View file @
361067e9
mysql-test/r/sel000025.result
View file @
361067e9
mysql-test/r/sel000026.result
View file @
361067e9
mysql-test/r/sel000027.result
View file @
361067e9
mysql-test/r/sel000028.result
View file @
361067e9
mysql-test/r/sel000029.result
View file @
361067e9
mysql-test/r/sel000030.result
View file @
361067e9
mysql-test/r/sel000031.result
View file @
361067e9
mysql-test/r/sel000032.result
View file @
361067e9
mysql-test/r/sel000033.result
View file @
361067e9
mysql-test/r/sel000100.result
View file @
361067e9
mysql-test/r/shw000001.result
View file @
361067e9
mysql-test/r/slave-running.result
View file @
361067e9
mysql-test/r/slave-stopped.result
View file @
361067e9
mysql-test/t/bdb.test
View file @
361067e9
--
source
include
/
have_bdb
.
inc
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
create
table
t1
(
id
int
unsigned
not
null
auto_increment
,
code
tinyint
unsigned
not
null
,
name
char
(
20
)
not
null
,
primary
key
(
id
),
key
(
code
),
unique
(
name
))
type
=
bdb
;
create
table
t1
(
id
int
unsigned
not
null
auto_increment
,
code
tinyint
unsigned
not
null
,
name
char
(
20
)
not
null
,
primary
key
(
id
),
key
(
code
),
unique
(
name
))
type
=
bdb
;
...
@@ -10,3 +12,19 @@ update ignore t1 set id = id + 10, name = 'Ralph' where id < 4;
...
@@ -10,3 +12,19 @@ update ignore t1 set id = id + 10, name = 'Ralph' where id < 4;
select
id
,
code
,
name
from
t1
order
by
id
;
select
id
,
code
,
name
from
t1
order
by
id
;
drop
table
t1
;
drop
table
t1
;
#
# Test replace
#
CREATE
TABLE
t1
(
gesuchnr
int
(
11
)
DEFAULT
'0'
NOT
NULL
,
benutzer_id
int
(
11
)
DEFAULT
'0'
NOT
NULL
,
PRIMARY
KEY
(
gesuchnr
,
benutzer_id
)
)
type
=
BDB
;
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
2
,
1
);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
select
*
from
t1
;
drop
table
t1
;
mysql-test/t/include/master-slave.inc
deleted
100644 → 0
View file @
988a98c3
connect
(
master
,
localhost
,
root
,,
test
,
0
,
var
/
tmp
/
mysql
.
sock
);
connect
(
master1
,
localhost
,
root
,,
test
,
0
,
var
/
tmp
/
mysql
.
sock
);
connect
(
slave
,
localhost
,
root
,,
test
,
0
,
var
/
tmp
/
mysql
-
slave
.
sock
);
connect
(
slave1
,
localhost
,
root
,,
test
,
0
,
var
/
tmp
/
mysql
-
slave
.
sock
);
connection
slave
;
!
slave
stop
;
connection
master
;
reset
master
;
connection
slave
;
reset
slave
;
!
slave
start
;
mysql-test/t/replace.test
View file @
361067e9
--
source
include
/
have_isam
.
inc
#
#
# Test of REPLACE with ISAM and MyISAM and
BDB
# Test of REPLACE with ISAM and MyISAM and
HEAP
#
#
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
...
@@ -15,8 +17,6 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1);
...
@@ -15,8 +17,6 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
alter
table
t1
type
=
myisam
;
alter
table
t1
type
=
myisam
;
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
alter
table
t1
type
=
bdb
;
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
alter
table
t1
type
=
heap
;
alter
table
t1
type
=
heap
;
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
replace
into
t1
(
gesuchnr
,
benutzer_id
)
values
(
1
,
1
);
drop
table
t1
;
drop
table
t1
;
sql/gen_lex_hash.cc
View file @
361067e9
...
@@ -330,7 +330,7 @@ static struct option long_options[] =
...
@@ -330,7 +330,7 @@ static struct option long_options[] =
static
void
usage
(
int
version
)
static
void
usage
(
int
version
)
{
{
printf
(
"%s Ver 3.
1
Distrib %s, for %s (%s)
\n
"
,
printf
(
"%s Ver 3.
2
Distrib %s, for %s (%s)
\n
"
,
my_progname
,
MYSQL_SERVER_VERSION
,
SYSTEM_TYPE
,
MACHINE_TYPE
);
my_progname
,
MYSQL_SERVER_VERSION
,
SYSTEM_TYPE
,
MACHINE_TYPE
);
if
(
version
)
if
(
version
)
return
;
return
;
...
@@ -350,7 +350,7 @@ static void usage(int version)
...
@@ -350,7 +350,7 @@ static void usage(int version)
}
}
static
uint
best_type
;
static
uint
best_type
;
static
ulong
best_t1
,
best_t2
;
static
ulong
best_t1
,
best_t2
,
best_start_value
;
static
int
get_options
(
int
argc
,
char
**
argv
)
static
int
get_options
(
int
argc
,
char
**
argv
)
{
{
...
@@ -510,8 +510,10 @@ int main(int argc,char **argv)
...
@@ -510,8 +510,10 @@ int main(int argc,char **argv)
best_mod
=
function_mod
;
best_add
=
function_plus
;
best_mod
=
function_mod
;
best_add
=
function_plus
;
best_functype
=
function_type
;
best_functype
=
function_type
;
best_t1
=
t1
;
best_t2
=
t2
;
best_type
=
type
;
best_t1
=
t1
;
best_t2
=
t2
;
best_type
=
type
;
printf
(
"
\n
start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; /* mode=%d add=%d func_type: %d */
\n
"
,
best_start_value
=
start_value
;
start_value
,
best_t1
,
best_t2
,
best_type
,
best_mod
,
best_add
,
best_functype
);
printf
(
"
\n
start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; /* mode=%d add=%d type: %d */
\n
"
,
best_start_value
,
best_t1
,
best_t2
,
best_type
,
best_mod
,
best_add
,
best_functype
);
}
}
}
}
}
}
...
@@ -537,8 +539,8 @@ printf("/* This code is generated by gen_lex_hash.cc that seeks for a perfect\nh
...
@@ -537,8 +539,8 @@ printf("/* This code is generated by gen_lex_hash.cc that seeks for a perfect\nh
print_arrays
();
print_arrays
();
printf
(
"/* start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; */ /* mode=%d add=%d type: %d */
\n\n
"
,
printf
(
"/* start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; */ /* mode=%d add=%d t
ype: %d */
\n\n
"
,
start_value
,
best_t1
,
best_t2
,
best_type
,
best_start_value
,
best_t1
,
best_t2
,
best_type
,
best_mod
,
best_add
,
best_functype
);
best_mod
,
best_add
,
best_functype
);
printf
(
"inline SYMBOL *get_hash_symbol(const char *s,unsigned int length,bool function)
\n
\
printf
(
"inline SYMBOL *get_hash_symbol(const char *s,unsigned int length,bool function)
\n
\
...
...
sql/ha_berkeley.cc
View file @
361067e9
...
@@ -89,7 +89,7 @@ static DB_ENV *db_env;
...
@@ -89,7 +89,7 @@ static DB_ENV *db_env;
static
HASH
bdb_open_tables
;
static
HASH
bdb_open_tables
;
const
char
*
berkeley_lock_names
[]
=
const
char
*
berkeley_lock_names
[]
=
{
"DEFAULT"
,
"OLDEST"
,
"RANDOM"
,
"YOUNGEST"
};
{
"DEFAULT"
,
"OLDEST"
,
"RANDOM"
,
"YOUNGEST"
,
0
};
u_int32_t
berkeley_lock_types
[]
=
u_int32_t
berkeley_lock_types
[]
=
{
DB_LOCK_DEFAULT
,
DB_LOCK_OLDEST
,
DB_LOCK_RANDOM
};
{
DB_LOCK_DEFAULT
,
DB_LOCK_OLDEST
,
DB_LOCK_RANDOM
};
TYPELIB
berkeley_lock_typelib
=
{
array_elements
(
berkeley_lock_names
),
""
,
TYPELIB
berkeley_lock_typelib
=
{
array_elements
(
berkeley_lock_names
),
""
,
...
...
sql/ha_berkeley.h
View file @
361067e9
...
@@ -91,7 +91,7 @@ class ha_berkeley: public handler
...
@@ -91,7 +91,7 @@ class ha_berkeley: public handler
HA_BLOB_KEY
|
HA_NOT_EXACT_COUNT
|
HA_BLOB_KEY
|
HA_NOT_EXACT_COUNT
|
HA_PRIMARY_KEY_IN_READ_INDEX
|
HA_DROP_BEFORE_CREATE
|
HA_PRIMARY_KEY_IN_READ_INDEX
|
HA_DROP_BEFORE_CREATE
|
HA_AUTO_PART_KEY
),
HA_AUTO_PART_KEY
),
last_dup_key
((
uint
)
-
1
),
version
(
0
)
last_dup_key
((
uint
)
-
1
),
version
(
0
)
,
using_ignore
(
0
)
{
{
}
}
~
ha_berkeley
()
{}
~
ha_berkeley
()
{}
...
...
sql/handler.h
View file @
361067e9
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
#define NO_HASH
/* Not yet implemented */
#define NO_HASH
/* Not yet implemented */
#endif
#endif
#if defined(HAVE_BERKELEY_DB) || defined(HAVE_INNOBASE_DB) || defined(HAVE_GEM
E
NI_DB)
#if defined(HAVE_BERKELEY_DB) || defined(HAVE_INNOBASE_DB) || defined(HAVE_GEM
I
NI_DB)
#define USING_TRANSACTIONS
#define USING_TRANSACTIONS
#endif
#endif
...
@@ -121,7 +121,7 @@ enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC,
...
@@ -121,7 +121,7 @@ enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC,
typedef
struct
st_thd_trans
{
typedef
struct
st_thd_trans
{
void
*
bdb_tid
;
void
*
bdb_tid
;
void
*
innobase_tid
;
void
*
innobase_tid
;
void
*
gem
e
ni_tid
;
void
*
gem
i
ni_tid
;
}
THD_TRANS
;
}
THD_TRANS
;
typedef
struct
st_ha_create_information
typedef
struct
st_ha_create_information
...
...
sql/mysqld.cc
View file @
361067e9
...
@@ -151,16 +151,21 @@ SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_YES;
...
@@ -151,16 +151,21 @@ SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_YES;
#else
#else
SHOW_COMP_OPTION
have_berkeley_db
=
SHOW_OPTION_NO
;
SHOW_COMP_OPTION
have_berkeley_db
=
SHOW_OPTION_NO
;
#endif
#endif
#ifdef HAVE_GEM
E
NI_DB
#ifdef HAVE_GEM
I
NI_DB
SHOW_COMP_OPTION
have_gem
e
ni
=
SHOW_OPTION_YES
;
SHOW_COMP_OPTION
have_gem
i
ni
=
SHOW_OPTION_YES
;
#else
#else
SHOW_COMP_OPTION
have_gem
e
ni
=
SHOW_OPTION_NO
;
SHOW_COMP_OPTION
have_gem
i
ni
=
SHOW_OPTION_NO
;
#endif
#endif
#ifdef HAVE_INNOBASE_DB
#ifdef HAVE_INNOBASE_DB
SHOW_COMP_OPTION
have_innobase
=
SHOW_OPTION_YES
;
SHOW_COMP_OPTION
have_innobase
=
SHOW_OPTION_YES
;
#else
#else
SHOW_COMP_OPTION
have_innobase
=
SHOW_OPTION_NO
;
SHOW_COMP_OPTION
have_innobase
=
SHOW_OPTION_NO
;
#endif
#endif
#ifndef NO_ISAM
SHOW_COMP_OPTION
have_isam
=
SHOW_OPTION_YES
;
#else
SHOW_COMP_OPTION
have_isam
=
SHOW_OPTION_NO
;
#endif
#ifdef USE_RAID
#ifdef USE_RAID
SHOW_COMP_OPTION
have_raid
=
SHOW_OPTION_YES
;
SHOW_COMP_OPTION
have_raid
=
SHOW_OPTION_YES
;
#else
#else
...
@@ -1077,21 +1082,21 @@ inline static __volatile__ void trace_stack()
...
@@ -1077,21 +1082,21 @@ inline static __volatile__ void trace_stack()
uchar
**
stack_bottom
;
uchar
**
stack_bottom
;
uchar
**
ebp
;
uchar
**
ebp
;
LINT_INIT
(
ebp
);
LINT_INIT
(
ebp
);
fprintf
(
stderr
,
"Attemping backtrace, please send the info below to\
fprintf
(
stderr
,
"Attemping backtrace, please send the info below to
\
bugs@lists.mysql.com. If you see no messages after this, something
\
bugs@lists.mysql.com. If you see no messages after this, something
\
went terribly wrong - report this anyway
\n
"
);
went terribly wrong - report this anyway
\n
"
);
THD
*
thd
=
current_thd
;
THD
*
thd
=
current_thd
;
uint
frame_count
=
0
;
uint
frame_count
=
0
;
__asm
__volatile__
(
"movl %%ebp,%0"
__asm
__volatile__
(
"movl %%ebp,%0"
:
"=r"
(
ebp
)
:
"=r"
(
ebp
)
:
"r"
(
ebp
));
:
"r"
(
ebp
));
if
(
!
ebp
)
if
(
!
ebp
)
{
{
fprintf
(
stderr
,
"frame pointer (ebp) is NULL, did you compile with \
fprintf
(
stderr
,
"frame pointer (ebp) is NULL, did you compile with \
-fomit-frame-pointer? Aborting backtrace
\n
"
);
-fomit-frame-pointer? Aborting backtrace
\n
"
);
return
;
return
;
}
}
if
(
!
thd
)
if
(
!
thd
)
{
{
fprintf
(
stderr
,
"Cannot determine thread, ebp=%p, aborting backtrace
\n
"
,
fprintf
(
stderr
,
"Cannot determine thread, ebp=%p, aborting backtrace
\n
"
,
ebp
);
ebp
);
...
@@ -1107,12 +1112,12 @@ inline static __volatile__ void trace_stack()
...
@@ -1107,12 +1112,12 @@ inline static __volatile__ void trace_stack()
fprintf
(
stderr
,
"stack range sanity check, ok, backtrace follows
\n
"
);
fprintf
(
stderr
,
"stack range sanity check, ok, backtrace follows
\n
"
);
while
(
ebp
<
stack_bottom
)
while
(
ebp
<
stack_bottom
)
{
{
uchar
**
new_ebp
=
(
uchar
**
)
*
ebp
;
uchar
**
new_ebp
=
(
uchar
**
)
*
ebp
;
fprintf
(
stderr
,
"%p
\n
"
,
frame_count
==
SIGRETURN_FRAME_COUNT
?
fprintf
(
stderr
,
"%p
\n
"
,
frame_count
==
SIGRETURN_FRAME_COUNT
?
*
(
ebp
+
17
)
:
*
(
ebp
+
1
));
*
(
ebp
+
17
)
:
*
(
ebp
+
1
));
if
(
new_ebp
<=
ebp
)
if
(
new_ebp
<=
ebp
)
{
{
fprintf
(
stderr
,
"New value of ebp failed sanity check\
fprintf
(
stderr
,
"New value of ebp failed sanity check\
terminating backtrace
\n
"
);
terminating backtrace
\n
"
);
...
@@ -1133,31 +1138,27 @@ static sig_handler handle_segfault(int sig)
...
@@ -1133,31 +1138,27 @@ static sig_handler handle_segfault(int sig)
// but since we have got SIGSEGV already, things are a mess
// but since we have got SIGSEGV already, things are a mess
// so not having the mutex is not as bad as possibly using a buggy
// so not having the mutex is not as bad as possibly using a buggy
// mutex - so we keep things simple
// mutex - so we keep things simple
if
(
segfaulted
)
if
(
segfaulted
)
return
;
return
;
segfaulted
=
1
;
segfaulted
=
1
;
fprintf
(
stderr
,
"\
fprintf
(
stderr
,
"\
mysqld got signal %
s in thread %d;
\n
\
mysqld got signal %
d;
\n
\
The manual section 'Debugging a MySQL server' tells you how to use a
\n
\
The manual section 'Debugging a MySQL server' tells you how to use a
\n
\
debugger on the core file to produce a backtrace that may help you find out
\n
\
debugger on the core file to produce a backtrace that may help you find out
\n
\
why mysqld died
\n
"
,
sys_siglist
[
sig
],
getpid
());
why mysqld died
\n
"
,
sig
);
#if defined(HAVE_LINUXTHREADS) && defined(__i386__)
#if defined(HAVE_LINUXTHREADS)
#ifdef __i386__
trace_stack
();
trace_stack
();
#endif
#endif
/* __i386__ */
#ifdef HAVE_LINUXTHREADS
if
(
test_flags
&
TEST_CORE_ON_SIGNAL
)
if
(
test_flags
&
TEST_CORE_ON_SIGNAL
)
write_core
(
sig
);
write_core
(
sig
);
else
#endif
/* HAVE_LINUXTHREADS */
exit
(
1
);
exit
(
1
);
#else
exit
(
1
);
/* abort everything */
#endif
}
}
#ifdef HAVE_LINUXTHREADS
/* Produce a core for the thread */
/* Produce a core for the thread */
#ifdef HAVE_LINUXTHREADS
static
sig_handler
write_core
(
int
sig
)
static
sig_handler
write_core
(
int
sig
)
{
{
signal
(
sig
,
SIG_DFL
);
signal
(
sig
,
SIG_DFL
);
...
@@ -1756,7 +1757,7 @@ The server will not act as a slave");
...
@@ -1756,7 +1757,7 @@ The server will not act as a slave");
if
(
master_host
)
if
(
master_host
)
{
{
pthread_t
hThread
;
pthread_t
hThread
;
if
(
!
opt_skip_slave_start
&&
if
(
!
opt_skip_slave_start
&&
pthread_create
(
&
hThread
,
&
connection_attrib
,
handle_slave
,
0
))
pthread_create
(
&
hThread
,
&
connection_attrib
,
handle_slave
,
0
))
sql_print_error
(
"Warning: Can't create thread to handle slave"
);
sql_print_error
(
"Warning: Can't create thread to handle slave"
);
else
if
(
opt_skip_slave_start
)
else
if
(
opt_skip_slave_start
)
...
@@ -2623,8 +2624,9 @@ struct show_var_st init_vars[]= {
...
@@ -2623,8 +2624,9 @@ struct show_var_st init_vars[]= {
{
"flush"
,
(
char
*
)
&
myisam_flush
,
SHOW_MY_BOOL
},
{
"flush"
,
(
char
*
)
&
myisam_flush
,
SHOW_MY_BOOL
},
{
"flush_time"
,
(
char
*
)
&
flush_time
,
SHOW_LONG
},
{
"flush_time"
,
(
char
*
)
&
flush_time
,
SHOW_LONG
},
{
"have_bdb"
,
(
char
*
)
&
have_berkeley_db
,
SHOW_HAVE
},
{
"have_bdb"
,
(
char
*
)
&
have_berkeley_db
,
SHOW_HAVE
},
{
"have_gem
eni"
,
(
char
*
)
&
have_geme
ni
,
SHOW_HAVE
},
{
"have_gem
ini"
,
(
char
*
)
&
have_gemi
ni
,
SHOW_HAVE
},
{
"have_innobase"
,
(
char
*
)
&
have_innobase
,
SHOW_HAVE
},
{
"have_innobase"
,
(
char
*
)
&
have_innobase
,
SHOW_HAVE
},
{
"have_isam"
,
(
char
*
)
&
have_isam
,
SHOW_HAVE
},
{
"have_raid"
,
(
char
*
)
&
have_raid
,
SHOW_HAVE
},
{
"have_raid"
,
(
char
*
)
&
have_raid
,
SHOW_HAVE
},
{
"have_ssl"
,
(
char
*
)
&
have_ssl
,
SHOW_HAVE
},
{
"have_ssl"
,
(
char
*
)
&
have_ssl
,
SHOW_HAVE
},
{
"init_file"
,
(
char
*
)
&
opt_init_file
,
SHOW_CHAR_PTR
},
{
"init_file"
,
(
char
*
)
&
opt_init_file
,
SHOW_CHAR_PTR
},
...
@@ -3101,7 +3103,7 @@ static void get_options(int argc,char **argv)
...
@@ -3101,7 +3103,7 @@ static void get_options(int argc,char **argv)
{
{
char
*
key
=
optarg
,
*
p
,
*
val
;
char
*
key
=
optarg
,
*
p
,
*
val
;
p
=
strstr
(
optarg
,
"->"
);
p
=
strstr
(
optarg
,
"->"
);
if
(
!
p
)
if
(
!
p
)
{
{
fprintf
(
stderr
,
fprintf
(
stderr
,
"bad syntax in replicate-rewrite-db - missing ->
\n
"
);
"bad syntax in replicate-rewrite-db - missing ->
\n
"
);
...
@@ -3118,7 +3120,7 @@ static void get_options(int argc,char **argv)
...
@@ -3118,7 +3120,7 @@ static void get_options(int argc,char **argv)
*
val
=
0
;
*
val
=
0
;
val
+=
2
;
val
+=
2
;
while
(
*
val
&&
isspace
(
*
val
))
*
val
++
;
while
(
*
val
&&
isspace
(
*
val
))
*
val
++
;
if
(
!*
val
)
if
(
!*
val
)
{
{
fprintf
(
stderr
,
fprintf
(
stderr
,
"bad syntax in replicate-rewrite-db - empty TO db
\n
"
);
"bad syntax in replicate-rewrite-db - empty TO db
\n
"
);
...
@@ -3144,7 +3146,7 @@ static void get_options(int argc,char **argv)
...
@@ -3144,7 +3146,7 @@ static void get_options(int argc,char **argv)
}
}
case
(
int
)
OPT_REPLICATE_DO_TABLE
:
case
(
int
)
OPT_REPLICATE_DO_TABLE
:
{
{
if
(
!
do_table_inited
)
if
(
!
do_table_inited
)
init_table_rule_hash
(
&
replicate_do_table
,
&
do_table_inited
);
init_table_rule_hash
(
&
replicate_do_table
,
&
do_table_inited
);
if
(
add_table_rule
(
&
replicate_do_table
,
optarg
))
if
(
add_table_rule
(
&
replicate_do_table
,
optarg
))
{
{
...
@@ -3156,7 +3158,7 @@ static void get_options(int argc,char **argv)
...
@@ -3156,7 +3158,7 @@ static void get_options(int argc,char **argv)
}
}
case
(
int
)
OPT_REPLICATE_WILD_DO_TABLE
:
case
(
int
)
OPT_REPLICATE_WILD_DO_TABLE
:
{
{
if
(
!
wild_do_table_inited
)
if
(
!
wild_do_table_inited
)
init_table_rule_array
(
&
replicate_wild_do_table
,
init_table_rule_array
(
&
replicate_wild_do_table
,
&
wild_do_table_inited
);
&
wild_do_table_inited
);
if
(
add_wild_table_rule
(
&
replicate_wild_do_table
,
optarg
))
if
(
add_wild_table_rule
(
&
replicate_wild_do_table
,
optarg
))
...
@@ -3169,7 +3171,7 @@ static void get_options(int argc,char **argv)
...
@@ -3169,7 +3171,7 @@ static void get_options(int argc,char **argv)
}
}
case
(
int
)
OPT_REPLICATE_WILD_IGNORE_TABLE
:
case
(
int
)
OPT_REPLICATE_WILD_IGNORE_TABLE
:
{
{
if
(
!
wild_ignore_table_inited
)
if
(
!
wild_ignore_table_inited
)
init_table_rule_array
(
&
replicate_wild_ignore_table
,
init_table_rule_array
(
&
replicate_wild_ignore_table
,
&
wild_ignore_table_inited
);
&
wild_ignore_table_inited
);
if
(
add_wild_table_rule
(
&
replicate_wild_ignore_table
,
optarg
))
if
(
add_wild_table_rule
(
&
replicate_wild_ignore_table
,
optarg
))
...
@@ -3182,7 +3184,7 @@ static void get_options(int argc,char **argv)
...
@@ -3182,7 +3184,7 @@ static void get_options(int argc,char **argv)
}
}
case
(
int
)
OPT_REPLICATE_IGNORE_TABLE
:
case
(
int
)
OPT_REPLICATE_IGNORE_TABLE
:
{
{
if
(
!
ignore_table_inited
)
if
(
!
ignore_table_inited
)
init_table_rule_hash
(
&
replicate_ignore_table
,
&
ignore_table_inited
);
init_table_rule_hash
(
&
replicate_ignore_table
,
&
ignore_table_inited
);
if
(
add_table_rule
(
&
replicate_ignore_table
,
optarg
))
if
(
add_table_rule
(
&
replicate_ignore_table
,
optarg
))
{
{
...
...
sql/sql_class.h
View file @
361067e9
...
@@ -301,7 +301,7 @@ public:
...
@@ -301,7 +301,7 @@ public:
{
{
return
(
transaction
.
all
.
bdb_tid
!=
0
||
return
(
transaction
.
all
.
bdb_tid
!=
0
||
transaction
.
all
.
innobase_tid
!=
0
||
transaction
.
all
.
innobase_tid
!=
0
||
transaction
.
all
.
gem
e
ni_tid
!=
0
);
transaction
.
all
.
gem
i
ni_tid
!=
0
);
}
}
inline
gptr
alloc
(
unsigned
int
size
)
{
return
alloc_root
(
&
mem_root
,
size
);
}
inline
gptr
alloc
(
unsigned
int
size
)
{
return
alloc_root
(
&
mem_root
,
size
);
}
inline
gptr
calloc
(
unsigned
int
size
)
inline
gptr
calloc
(
unsigned
int
size
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment