Commit c56697f0 authored by unknown's avatar unknown

Merge bk-internal:/home/bk/mysql-4.0/

into serg.mylan:/usr/home/serg/Abk/mysql-4.0

parents 88267ae5 6b465557
...@@ -861,18 +861,22 @@ int do_exec(struct st_query* q) ...@@ -861,18 +861,22 @@ int do_exec(struct st_query* q)
char buf[1024]; char buf[1024];
FILE *res_file; FILE *res_file;
char *cmd= q->first_argument; char *cmd= q->first_argument;
DBUG_ENTER("do_exec");
while (*cmd && my_isspace(charset_info, *cmd)) while (*cmd && my_isspace(charset_info, *cmd))
cmd++; cmd++;
if (!*cmd) if (!*cmd)
die("Missing argument in exec\n"); die("Missing argument in exec\n");
DBUG_PRINT("info", ("Executing '%s'", cmd));
if (!(res_file= popen(cmd, "r")) && q->abort_on_error)
die("popen() failed\n");
if (disable_result_log) if (disable_result_log)
{ {
if (!(res_file= popen(cmd, "r")) && q->abort_on_error) while (fgets(buf, sizeof(buf), res_file))
die("popen() failed\n"); {}
while (fgets(buf, sizeof(buf), res_file));
pclose(res_file);
} }
else else
{ {
...@@ -884,11 +888,8 @@ int do_exec(struct st_query* q) ...@@ -884,11 +888,8 @@ int do_exec(struct st_query* q)
else else
ds= &ds_res; ds= &ds_res;
if (!(res_file= popen(cmd, "r")) && q->abort_on_error)
die("popen() failed\n");
while (fgets(buf, sizeof(buf), res_file)) while (fgets(buf, sizeof(buf), res_file))
replace_dynstr_append_mem(ds, buf, strlen(buf)); replace_dynstr_append_mem(ds, buf, strlen(buf));
pclose(res_file);
if (glob_replace) if (glob_replace)
free_replace(); free_replace();
...@@ -907,8 +908,9 @@ int do_exec(struct st_query* q) ...@@ -907,8 +908,9 @@ int do_exec(struct st_query* q)
if (ds == &ds_tmp) if (ds == &ds_tmp)
dynstr_free(&ds_tmp); dynstr_free(&ds_tmp);
} }
pclose(res_file);
return error; DBUG_RETURN(error);
} }
int var_query_set(VAR* v, const char* p, const char** p_end) int var_query_set(VAR* v, const char* p, const char** p_end)
...@@ -1043,7 +1045,7 @@ int do_system(struct st_query* q) ...@@ -1043,7 +1045,7 @@ int do_system(struct st_query* q)
eval_expr(&v, p, 0); /* NULL terminated */ eval_expr(&v, p, 0); /* NULL terminated */
if (v.str_val_len) if (v.str_val_len)
{ {
char expr_buf[512]; char expr_buf[1024];
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);
...@@ -1774,11 +1776,12 @@ int read_query(struct st_query** q_ptr) ...@@ -1774,11 +1776,12 @@ int read_query(struct st_query** q_ptr)
char *p = read_query_buf, * p1 ; char *p = read_query_buf, * p1 ;
int expected_errno; int expected_errno;
struct st_query* q; struct st_query* q;
DBUG_ENTER("read_query_buf");
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; DBUG_RETURN(0);
} }
if (!(*q_ptr=q=(struct st_query*) my_malloc(sizeof(*q), MYF(MY_WME))) || if (!(*q_ptr=q=(struct st_query*) my_malloc(sizeof(*q), MYF(MY_WME))) ||
insert_dynamic(&q_lines, (gptr) &q)) insert_dynamic(&q_lines, (gptr) &q))
...@@ -1797,7 +1800,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1797,7 +1800,7 @@ int read_query(struct st_query** q_ptr)
q->type = Q_UNKNOWN; q->type = Q_UNKNOWN;
q->query_buf=q->query=0; q->query_buf=q->query=0;
if (read_line(read_query_buf, sizeof(read_query_buf))) if (read_line(read_query_buf, sizeof(read_query_buf)))
return 1; DBUG_RETURN(1);
if (*p == '#') if (*p == '#')
{ {
...@@ -1851,7 +1854,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1851,7 +1854,7 @@ int read_query(struct st_query** q_ptr)
q->first_argument=p; q->first_argument=p;
q->end = strend(q->query); q->end = strend(q->query);
parser.read_lines++; parser.read_lines++;
return 0; DBUG_RETURN(0);
} }
...@@ -2306,10 +2309,12 @@ void get_query_type(struct st_query* q) ...@@ -2306,10 +2309,12 @@ void get_query_type(struct st_query* q)
{ {
char save; char save;
uint type; uint type;
DBUG_ENTER("get_query_type");
if (*q->query == '}') if (*q->query == '}')
{ {
q->type = Q_END_BLOCK; q->type = Q_END_BLOCK;
return; DBUG_VOID_RETURN;
} }
if (q->type != Q_COMMENT_WITH_COMMAND) if (q->type != Q_COMMENT_WITH_COMMAND)
q->type = Q_QUERY; q->type = Q_QUERY;
...@@ -2320,8 +2325,10 @@ void get_query_type(struct st_query* q) ...@@ -2320,8 +2325,10 @@ void get_query_type(struct st_query* q)
q->query[q->first_word_len]=save; q->query[q->first_word_len]=save;
if (type > 0) if (type > 0)
q->type=(enum enum_commands) type; /* Found command */ q->type=(enum enum_commands) type; /* Found command */
DBUG_VOID_RETURN;
} }
static byte *get_var_key(const byte* var, uint* len, static byte *get_var_key(const byte* var, uint* len,
my_bool __attribute__((unused)) t) my_bool __attribute__((unused)) t)
{ {
......
...@@ -63,4 +63,5 @@ extern const char *client_errors[]; /* Error messages */ ...@@ -63,4 +63,5 @@ extern const char *client_errors[]; /* Error messages */
#define CR_PROBE_MASTER_CONNECT 2025 #define CR_PROBE_MASTER_CONNECT 2025
#define CR_SSL_CONNECTION_ERROR 2026 #define CR_SSL_CONNECTION_ERROR 2026
#define CR_MALFORMED_PACKET 2027 #define CR_MALFORMED_PACKET 2027
#define CR_WRONG_LICENSE 2028
...@@ -20,7 +20,9 @@ ...@@ -20,7 +20,9 @@
extern "C" { extern "C" {
#endif #endif
#define MAX_TREE_HIGHT 40 /* = max 1048576 leafs in tree */ /* Worst case tree is half full. This gives use 2^(MAX_TREE_HIGHT/2) leafs */
#define MAX_TREE_HIGHT 64
#define ELEMENT_KEY(tree,element)\ #define ELEMENT_KEY(tree,element)\
(tree->offset_to_key ? (void*)((byte*) element+tree->offset_to_key) :\ (tree->offset_to_key ? (void*)((byte*) element+tree->offset_to_key) :\
*((void**) (element+1))) *((void**) (element+1)))
......
...@@ -26,4 +26,9 @@ ...@@ -26,4 +26,9 @@
#define MYSQL_CHARSET "@default_charset@" #define MYSQL_CHARSET "@default_charset@"
#endif /* MYSQL_CHARSET */ #endif /* MYSQL_CHARSET */
#endif /* _CUSTOMCONFIG_ */ #endif /* _CUSTOMCONFIG_ */
#ifndef LICENSE
#define LICENSE "GPL"
#endif /* LICENSE */
#endif /* _mysql_version_h */ #endif /* _mysql_version_h */
...@@ -668,15 +668,15 @@ does nothing! */ ...@@ -668,15 +668,15 @@ does nothing! */
void void
que_thr_handle_error( que_thr_handle_error(
/*=================*/ /*=================*/
que_thr_t* thr __attribute((unused)), que_thr_t* thr __attribute__((unused)),
/* in: query thread */ /* in: query thread */
ulint err_no __attribute((unused)), ulint err_no __attribute__((unused)),
/* in: error number */ /* in: error number */
byte* err_str __attribute((unused)), byte* err_str __attribute__((unused)),
/* in, own: error string or NULL; NOTE: the /* in, own: error string or NULL; NOTE: the
function will take care of freeing of the function will take care of freeing of the
string! */ string! */
ulint err_len __attribute((unused))) ulint err_len __attribute__((unused)))
/* in: error string length */ /* in: error string length */
{ {
/* Does nothing */ /* Does nothing */
......
...@@ -51,7 +51,8 @@ const char *client_errors[]= ...@@ -51,7 +51,8 @@ const char *client_errors[]=
"Error connecting to slave:", "Error connecting to slave:",
"Error connecting to master:", "Error connecting to master:",
"SSL connection error", "SSL connection error",
"Malformed packet" "Malformed packet",
"This client library is licensed only for use with MySQL servers having '%s' license"
}; };
/* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */ /* Start of code added by Roberto M. Serqueira - martinsc@uol.com.br - 05.24.2001 */
...@@ -86,7 +87,8 @@ const char *client_errors[]= ...@@ -86,7 +87,8 @@ const char *client_errors[]=
"Error connecting to slave:", "Error connecting to slave:",
"Error connecting to master:", "Error connecting to master:",
"SSL connection error", "SSL connection error",
"Malformed packet" "Malformed packet",
"This client library is licensed only for use with MySQL servers having '%s' license"
}; };
#else /* ENGLISH */ #else /* ENGLISH */
...@@ -119,7 +121,8 @@ const char *client_errors[]= ...@@ -119,7 +121,8 @@ const char *client_errors[]=
"Error connecting to slave:", "Error connecting to slave:",
"Error connecting to master:", "Error connecting to master:",
"SSL connection error", "SSL connection error",
"Malformed packet" "Malformed packet",
"This client library is licensed only for use with MySQL servers having '%s' license"
}; };
#endif #endif
......
...@@ -1612,6 +1612,56 @@ mysql_connect(MYSQL *mysql,const char *host, ...@@ -1612,6 +1612,56 @@ mysql_connect(MYSQL *mysql,const char *host,
#endif #endif
#ifdef CHECK_LICENSE
/*
Check server side variable 'license'.
If the variable does not exist or does not contain 'Commercial',
we're talking to non-commercial server from commercial client.
SYNOPSIS
check_license()
RETURN VALUE
0 success
!0 network error or the server is not commercial.
Error code is saved in mysql->net.last_errno.
*/
static int check_license(MYSQL *mysql)
{
MYSQL_ROW row;
MYSQL_RES *res;
NET *net= &mysql->net;
static const char query[]= "SELECT @@license";
static const char required_license[]= LICENSE;
if (mysql_real_query(mysql, query, sizeof(query)-1))
{
if (net->last_errno == ER_UNKNOWN_SYSTEM_VARIABLE)
{
net->last_errno= CR_WRONG_LICENSE;
sprintf(net->last_error, ER(net->last_errno), required_license);
}
return 1;
}
if (!(res= mysql_use_result(mysql)))
return 1;
row= mysql_fetch_row(res);
/*
If no rows in result set, or column value is NULL (none of these
two is ever true for server variables now), or column value
mismatch, set wrong license error.
*/
if (!net->last_errno &&
(!row || !row[0] ||
strncmp(row[0], required_license, sizeof(required_license))))
{
net->last_errno= CR_WRONG_LICENSE;
sprintf(net->last_error, ER(net->last_errno), required_license);
}
mysql_free_result(res);
return net->last_errno;
}
#endif /* CHECK_LICENSE */
/* /*
The following union is used to force a struct to be double allgined. The following union is used to force a struct to be double allgined.
This is to avoid warings with gethostname_r() on Linux itanium systems This is to avoid warings with gethostname_r() on Linux itanium systems
...@@ -2048,6 +2098,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -2048,6 +2098,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
net->compress=1; net->compress=1;
if (mysql->options.max_allowed_packet) if (mysql->options.max_allowed_packet)
net->max_packet_size= mysql->options.max_allowed_packet; net->max_packet_size= mysql->options.max_allowed_packet;
#ifdef CHECK_LICENSE
if (check_license(mysql))
goto error;
#endif
if (db && mysql_select_db(mysql,db)) if (db && mysql_select_db(mysql,db))
goto error; goto error;
if (mysql->options.init_command) if (mysql->options.init_command)
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
# Access Definitions # Access Definitions
#-- #--
DB=test DB=test
DBPASSWD= DBPASSWD=""
VERBOSE="" VERBOSE=""
USE_MANAGER=0 USE_MANAGER=0
MY_TZ=GMT-3 MY_TZ=GMT-3
...@@ -461,12 +461,13 @@ if [ x$SOURCE_DIST = x1 ] ; then ...@@ -461,12 +461,13 @@ if [ x$SOURCE_DIST = x1 ] ; then
MYSQL_TEST="strace -o $MYSQL_TEST_DIR/var/log/mysqltest.strace $MYSQL_TEST" MYSQL_TEST="strace -o $MYSQL_TEST_DIR/var/log/mysqltest.strace $MYSQL_TEST"
fi fi
MYSQLADMIN="$BASEDIR/client/mysqladmin" CLIENT_BINDIR="$BASEDIR/client"
MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
WAIT_PID="$BASEDIR/extra/mysql_waitpid" WAIT_PID="$BASEDIR/extra/mysql_waitpid"
MYSQL_MANAGER_CLIENT="$BASEDIR/client/mysqlmanagerc" MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc"
MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager" MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager"
MYSQL_MANAGER_PWGEN="$BASEDIR/client/mysqlmanager-pwgen" MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
MYSQL="$BASEDIR/client/mysql" MYSQL="$CLIENT_BINDIR/mysql"
LANGUAGE="$BASEDIR/sql/share/english/" LANGUAGE="$BASEDIR/sql/share/english/"
CHARSETSDIR="$BASEDIR/sql/share/charsets" CHARSETSDIR="$BASEDIR/sql/share/charsets"
INSTALL_DB="./install_test_db" INSTALL_DB="./install_test_db"
...@@ -478,17 +479,18 @@ else ...@@ -478,17 +479,18 @@ else
else else
MYSQLD="$VALGRIND $BASEDIR/bin/mysqld" MYSQLD="$VALGRIND $BASEDIR/bin/mysqld"
fi fi
MYSQL_TEST="$BASEDIR/bin/mysqltest" CLIENT_BINDIR="$BASEDIR/bin"
MYSQL_DUMP="$BASEDIR/bin/mysqldump" MYSQL_TEST="$CLIENT_BINDIR/mysqltest"
MYSQL_BINLOG="$BASEDIR/bin/mysqlbinlog" MYSQL_DUMP="$CLIENT_BINDIR/mysqldump"
MYSQLADMIN="$BASEDIR/bin/mysqladmin" MYSQL_BINLOG="$CLIENT_BINDIR/mysqlbinlog"
WAIT_PID="$BASEDIR/bin/mysql_waitpid" MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
MYSQL_MANAGER="$BASEDIR/bin/mysqlmanager" WAIT_PID="$CLIENT_BINDIR/mysql_waitpid"
MYSQL_MANAGER_CLIENT="$BASEDIR/bin/mysqlmanagerc" MYSQL_MANAGER="$CLIENT_BINDIR/mysqlmanager"
MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen" MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc"
MYSQL="$BASEDIR/bin/mysql" MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
MYSQL="$CLIENT_BINDIR/mysql"
INSTALL_DB="./install_test_db --bin" INSTALL_DB="./install_test_db --bin"
MYSQL_FIX_SYSTEM_TABLES="$BASEDIR/bin/mysql_fix_privilege_tables" MYSQL_FIX_SYSTEM_TABLES="$CLIENT_BINDIR/mysql_fix_privilege_tables"
if test -d "$BASEDIR/share/mysql/english" if test -d "$BASEDIR/share/mysql/english"
then then
LANGUAGE="$BASEDIR/share/mysql/english/" LANGUAGE="$BASEDIR/share/mysql/english/"
...@@ -499,14 +501,11 @@ else ...@@ -499,14 +501,11 @@ else
fi fi
fi fi
MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK" MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD"
MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR"
MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=" MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --bindir=$CLIENT_BINDIR"
MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=" MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD"
export MYSQL export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES CLIENT_BINDIR
export MYSQL_DUMP
export MYSQL_BINLOG
export MYSQL_FIX_SYSTEM_TABLES
if [ -z "$MASTER_MYSQLD" ] if [ -z "$MASTER_MYSQLD" ]
then then
...@@ -534,9 +533,9 @@ fi ...@@ -534,9 +533,9 @@ fi
if [ -w / ] if [ -w / ]
then then
# We are running as root; We need to add the --root argument # We are running as root; We need to add the --root argument
EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --user=root" EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --user=root"
EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --user=root" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --user=root"
fi fi
......
...@@ -111,6 +111,18 @@ n s ...@@ -111,6 +111,18 @@ n s
2 two bar 2 two bar
3 three bar 3 three bar
4 four bar 4 four bar
stop slave;
reset slave;
load data from master;
start slave;
insert into bar.t1 values (5, 'five bar');
select * from bar.t1;
n s
1 one bar
2 two bar
3 three bar
4 four bar
5 five bar
load table bar.t1 from master; load table bar.t1 from master;
Table 't1' already exists Table 't1' already exists
drop table bar.t1; drop table bar.t1;
......
...@@ -17,7 +17,7 @@ insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name ...@@ -17,7 +17,7 @@ insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name
create table test_columns_priv select * from mysql.columns_priv; create table test_columns_priv select * from mysql.columns_priv;
delete from test_columns_priv; delete from test_columns_priv;
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name); insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
select select
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host, if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host, if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host, if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
...@@ -30,7 +30,7 @@ left join test_tables_priv on test_db.Host=test_tables_priv.Host ...@@ -30,7 +30,7 @@ left join test_tables_priv on test_db.Host=test_tables_priv.Host
left join test_columns_priv on test_db.Host=test_columns_priv.Host; left join test_columns_priv on test_db.Host=test_columns_priv.Host;
test_db_Host test_host_Host test_user_Host test_tables_priv_Host test_columns_priv_Host test_db_Host test_host_Host test_user_Host test_tables_priv_Host test_columns_priv_Host
ok ok ok ok ok ok ok ok ok ok
select select
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db, if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db, if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db, if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
......
#
# This is the test for mysql_fix_privilege_tables
#
-- disable_query_log
-- source include/create_old_system_tables.inc
-- exec $MYSQL_FIX_SYSTEM_TABLES --database=test > nil 2>nil
-- enable_query_log
-- source include/system_db_struct.inc
-- disable_query_log
-- source include/drop_system_tables.inc
-- enable_query_log
...@@ -108,6 +108,21 @@ connection slave; ...@@ -108,6 +108,21 @@ connection slave;
sync_with_master; sync_with_master;
select * from bar.t1; select * from bar.t1;
# Check that LOAD DATA FROM MASTER is able to create master.info
# if needed (if RESET SLAVE was used before), before writing to it (BUG#2922).
stop slave;
reset slave;
load data from master;
start slave;
# see if replication coordinates were restored fine
connection master;
insert into bar.t1 values (5, 'five bar');
save_master_pos;
connection slave;
sync_with_master;
select * from bar.t1;
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a # Check that LOAD DATA FROM MASTER reports the error if it can't drop a
# table to be overwritten. # table to be overwritten.
# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX # DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
......
# #
# This test must examine integrity of system database "mysql" # This test must examine integrity of system database "mysql"
# #
-- disable_query_log -- disable_query_log
use mysql; use mysql;
-- enable_query_log -- enable_query_log
-- source include/system_db_struct.inc -- source include/system_db_struct.inc
#
# This is the test for mysql_fix_privilege_tables
#
-- disable_result_log
-- disable_query_log
use test;
# create system tables as in mysql-3.20
CREATE TABLE db (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(32) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
PRIMARY KEY Host (Host,Db,User),
KEY User (User)
)
type=ISAM;
INSERT INTO db VALUES ('%','test', '','Y','Y','Y','Y','Y','Y');
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y');
CREATE TABLE host (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(32) binary DEFAULT '' NOT NULL,
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
PRIMARY KEY Host (Host,Db)
)
type=ISAM;
CREATE TABLE user (
Host char(60) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Password char(16),
Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,
Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,
PRIMARY KEY Host (Host,User)
)
type=ISAM;
INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO user VALUES ('localhost','', '','N','N','N','N','N','N','N','N','N');
-- exec $MYSQL_FIX_SYSTEM_TABLES --database=test
-- enable_query_log
-- enable_result_log
-- source include/system_db_struct.inc
-- disable_query_log
DROP TABLE db;
DROP TABLE host;
DROP TABLE user;
DROP TABLE func;
DROP TABLE tables_priv;
DROP TABLE columns_priv;
-- enable_query_log
# #
# This test must examine integrity of current system database # This test must examine integrity of current system database
# #
set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries"; set @name="This is a very long string, that mustn't find room in a system field like Table_name. Thus it should be cut by the actual size of the field. So we can use this string to find out the actual length of the field and to use it in any compare queries";
# #
# If this part is wrong, most likely you've done wrong modification of system database "mysql" # If this part is wrong, most likely you've done wrong modification of system database "mysql"
# #
create table test_db select * from mysql.db; create table test_db select * from mysql.db;
delete from test_db; delete from test_db;
insert into test_db (Host,Db,User) values (@name,@name,@name); insert into test_db (Host,Db,User) values (@name,@name,@name);
create table test_host select * from mysql.host; create table test_host select * from mysql.host;
delete from test_host; delete from test_host;
insert into test_host (Host,Db) values (@name,@name); insert into test_host (Host,Db) values (@name,@name);
create table test_user select * from mysql.user; create table test_user select * from mysql.user;
delete from test_user; delete from test_user;
insert into test_user (Host,User) values (@name,@name); insert into test_user (Host,User) values (@name,@name);
create table test_func select * from mysql.func; create table test_func select * from mysql.func;
delete from test_func; delete from test_func;
insert into test_func (name) values (@name); insert into test_func (name) values (@name);
create table test_tables_priv select * from mysql.tables_priv; create table test_tables_priv select * from mysql.tables_priv;
delete from test_tables_priv; delete from test_tables_priv;
insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name); insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name);
create table test_columns_priv select * from mysql.columns_priv; create table test_columns_priv select * from mysql.columns_priv;
delete from test_columns_priv; delete from test_columns_priv;
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name); insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
# 'Host' field must be the same for all the tables: # 'Host' field must be the same for all the tables:
select
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
from test_db
left join test_host on test_db.Host=test_host.Host
left join test_user on test_db.Host=test_user.Host
left join test_tables_priv on test_db.Host=test_tables_priv.Host
left join test_columns_priv on test_db.Host=test_columns_priv.Host;
# 'Db' field must be the same for all the tables:
select
if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
from test_db
left join test_host on test_db.Db=test_host.Db
left join test_tables_priv on test_db.Db=test_tables_priv.Db
left join test_columns_priv on test_db.Db=test_columns_priv.Db;
# 'User' field must be the same for all the tables:
select select
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User, if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host,
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User, if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host,
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host,
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host
from test_db
left join test_user on test_db.User=test_user.User from test_db
left join test_tables_priv on test_db.User=test_tables_priv.User left join test_host on test_db.Host=test_host.Host
left join test_columns_priv on test_db.User=test_columns_priv.User; left join test_user on test_db.Host=test_user.Host
left join test_tables_priv on test_db.Host=test_tables_priv.Host
# 'Table_name' field must be the same for all the tables: left join test_columns_priv on test_db.Host=test_columns_priv.Host;
# 'Db' field must be the same for all the tables:
select select
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User, if(isnull(test_db.Db),'WRONG!!!','ok') as test_db_Db,
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User if(isnull(test_host.Db),'WRONG!!!','ok') as test_host_Db,
from test_tables_priv if(isnull(test_tables_priv.Db),'WRONG!!!','ok') as test_tables_priv_Db,
left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name; if(isnull(test_columns_priv.Db),'WRONG!!!','ok') as est_columns_priv_Db
drop table test_columns_priv; from test_db
drop table test_tables_priv; left join test_host on test_db.Db=test_host.Db
drop table test_func; left join test_tables_priv on test_db.Db=test_tables_priv.Db
drop table test_host; left join test_columns_priv on test_db.Db=test_columns_priv.Db;
drop table test_user;
drop table test_db; # 'User' field must be the same for all the tables:
select
if(isnull(test_db.User),'WRONG!!!','ok') as test_db_User,
if(isnull(test_user.User),'WRONG!!!','ok') as test_user_User,
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
from test_db
left join test_user on test_db.User=test_user.User
left join test_tables_priv on test_db.User=test_tables_priv.User
left join test_columns_priv on test_db.User=test_columns_priv.User;
# 'Table_name' field must be the same for all the tables:
select
if(isnull(test_tables_priv.User),'WRONG!!!','ok') as test_tables_priv_User,
if(isnull(test_columns_priv.User),'WRONG!!!','ok') as test_columns_priv_User
from test_tables_priv
left join test_columns_priv on test_tables_priv.Table_name=test_columns_priv.Table_name;
drop table test_columns_priv;
drop table test_tables_priv;
drop table test_func;
drop table test_host;
drop table test_user;
drop table test_db;
...@@ -32,13 +32,23 @@ ...@@ -32,13 +32,23 @@
# --password=<password> # --password=<password>
# --database=<database> # --database=<database>
root_password="$1" root_password=""
host="localhost" host="localhost"
user="root" user="root"
port="" port=""
socket="" socket=""
comment="" comment=""
database="mysql" database="mysql"
bindir="@bindir@"
# Old format where there is only one argument and it's the password
if test "$#" == 1
then
case "$1" in
--*) ;;
*) root_password="$1" ; shift ;;
esac
fi
# read all the options # read all the options
parse_arguments() parse_arguments()
...@@ -52,6 +62,7 @@ parse_arguments() ...@@ -52,6 +62,7 @@ parse_arguments()
--socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;; --socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;;
--password=*) root_password=`echo "$arg" | sed -e "s;--password=;;"` ;; --password=*) root_password=`echo "$arg" | sed -e "s;--password=;;"` ;;
--database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;; --database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;;
--bindir=*) bindir=`echo "$arg" | sed -e "s;--bindir=;;"` ;;
*) *)
echo "Unknown argument '$arg'" echo "Unknown argument '$arg'"
exit 1 exit 1
...@@ -63,7 +74,7 @@ parse_arguments() ...@@ -63,7 +74,7 @@ parse_arguments()
parse_arguments "$@" parse_arguments "$@"
if test -z "$cmd"; then if test -z "$cmd"; then
cmd="@bindir@/mysql -f --user=$user --host=$host" cmd="$bindir/mysql -f --user=$user --host=$host"
if test ! -z "$root_password"; then if test ! -z "$root_password"; then
cmd="$cmd --password=$root_password" cmd="$cmd --password=$root_password"
fi fi
......
...@@ -874,7 +874,7 @@ int load_master_data(THD* thd) ...@@ -874,7 +874,7 @@ int load_master_data(THD* thd)
cleanup_mysql_results(db_res, cur_table_res - 1, table_res); cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
// adjust position in the master // adjust replication coordinates from the master
if (master_status_res) if (master_status_res)
{ {
MYSQL_ROW row = mc_mysql_fetch_row(master_status_res); MYSQL_ROW row = mc_mysql_fetch_row(master_status_res);
...@@ -887,10 +887,18 @@ int load_master_data(THD* thd) ...@@ -887,10 +887,18 @@ int load_master_data(THD* thd)
*/ */
if (row && row[0] && row[1]) if (row && row[0] && row[1])
{ {
/*
If the slave's master info is not inited, we init it, then we write
the new coordinates to it. Must call init_master_info() *before*
setting active_mi, because init_master_info() sets active_mi with
defaults.
*/
if (init_master_info(active_mi, master_info_file, relay_log_info_file, 0))
send_error(&thd->net, ER_MASTER_INFO);
strmake(active_mi->master_log_name, row[0], strmake(active_mi->master_log_name, row[0],
sizeof(active_mi->master_log_name)); sizeof(active_mi->master_log_name));
active_mi->master_log_pos = strtoull(row[1], (char**) 0, 10); active_mi->master_log_pos = strtoull(row[1], (char**) 0, 10);
// don't hit the magic number // at least in recent versions, the condition below should be false
if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE) if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE)
active_mi->master_log_pos = BIN_LOG_HEADER_SIZE; active_mi->master_log_pos = BIN_LOG_HEADER_SIZE;
active_mi->rli.pending = 0; active_mi->rli.pending = 0;
......
...@@ -334,14 +334,12 @@ static sys_var_rand_seed2 sys_rand_seed2("rand_seed2"); ...@@ -334,14 +334,12 @@ static sys_var_rand_seed2 sys_rand_seed2("rand_seed2");
static sys_var_thd_ulong sys_default_week_format("default_week_format", static sys_var_thd_ulong sys_default_week_format("default_week_format",
&SV::default_week_format); &SV::default_week_format);
static const char license[]= "GPL";
/* Read only variables */ /* Read only variables */
sys_var_const_str sys_os("version_compile_os", SYSTEM_TYPE); sys_var_const_str sys_os("version_compile_os", SYSTEM_TYPE);
sys_var_const_str sys_license("license", license);
/* Global read-only variable describing server license */ /* Global read-only variable describing server license */
sys_var_const_str sys_license("license", LICENSE);
......
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