Commit 9876b6a7 authored by unknown's avatar unknown

Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1

into sanja.is.com.ua:/home/bell/mysql/bk/work-select_list-4.1

parents 7699bb47 2d20eddc
...@@ -71,3 +71,4 @@ hours: ...@@ -71,3 +71,4 @@ hours:
[arjen:]checkout:get [arjen:]checkout:get
[nick:]checkout:get [nick:]checkout:get
checkout:edit checkout:edit
eoln:unix
...@@ -61,6 +61,12 @@ else ...@@ -61,6 +61,12 @@ else
} }
$PM= "/Developer/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"; $PM= "/Developer/Applications/PackageMaker.app/Contents/MacOS/PackageMaker";
# Try another location on 10.3.3
unless (-e "$PM")
{
$PM= "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker";
}
$TMP= $ENV{TMPDIR}; $TMP= $ENV{TMPDIR};
$TMP eq "" ? $TMP= $TMP . "/PKGBUILD.$$": $TMP= "/tmp/PKGBUILD.$$"; $TMP eq "" ? $TMP= $TMP . "/PKGBUILD.$$": $TMP= "/tmp/PKGBUILD.$$";
$PKGROOT= "$TMP/PMROOT"; $PKGROOT= "$TMP/PMROOT";
...@@ -79,6 +85,9 @@ $BUILDDIR= "$PWD/$HOST"; ...@@ -79,6 +85,9 @@ $BUILDDIR= "$PWD/$HOST";
$SRCBASEDIR= <$BUILDDIR/mysql*-$VERSION>; $SRCBASEDIR= <$BUILDDIR/mysql*-$VERSION>;
$SUPFILEDIR= <$SRCBASEDIR/support-files/MacOSX>; $SUPFILEDIR= <$SRCBASEDIR/support-files/MacOSX>;
$TAR= <$BUILDDIR/$NAME-apple-darwin*-powerpc.tar.gz>; $TAR= <$BUILDDIR/$NAME-apple-darwin*-powerpc.tar.gz>;
$TAR =~ /.*\/$NAME(.*)\.tar\.gz$/;
$ARCH= $1;
$NAME= $NAME . $ARCH;
$INFO= <$SUPFILEDIR/Info.plist>; $INFO= <$SUPFILEDIR/Info.plist>;
$DESC= <$SUPFILEDIR/Description.plist>; $DESC= <$SUPFILEDIR/Description.plist>;
$SI_INFO= <$SUPFILEDIR/StartupItem.Info.plist>; $SI_INFO= <$SUPFILEDIR/StartupItem.Info.plist>;
...@@ -167,7 +176,7 @@ unless (-f "$RESOURCE_DIR/License.txt"); ...@@ -167,7 +176,7 @@ unless (-f "$RESOURCE_DIR/License.txt");
&logger("Extracting $TAR to $PKGROOT"); &logger("Extracting $TAR to $PKGROOT");
&run_command("gnutar zxf $TAR -C $PKGROOT", "Unable to extract $TAR!"); &run_command("gnutar zxf $TAR -C $PKGROOT", "Unable to extract $TAR!");
&run_command("cd $PKGROOT ; ln -s mysql* ./mysql", "Unable to create symlink!"); &run_command("cd $PKGROOT ; ln -s mysql* ./mysql", "Unable to create symlink!");
&run_command("chown -R root.wheel $PKGROOT/*", "Cannot chown $PKGROOT!"); &run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
# Now build the PGK using PackageMaker # Now build the PGK using PackageMaker
# The "|| true" is a nasty hack to work around a problem with Package Maker # The "|| true" is a nasty hack to work around a problem with Package Maker
...@@ -196,7 +205,7 @@ unless ($opt_skip_si) ...@@ -196,7 +205,7 @@ unless ($opt_skip_si)
copy("$SI_PARAMS", "$PKGROOT/MySQL/") copy("$SI_PARAMS", "$PKGROOT/MySQL/")
or &abort("Error copying $SI_PARAMS!"); or &abort("Error copying $SI_PARAMS!");
chmod(0644, "$PKGROOT/MySQL/" . basename("$SI_PARAMS")); chmod(0644, "$PKGROOT/MySQL/" . basename("$SI_PARAMS"));
&run_command("chown -R root.wheel $PKGROOT/*", "Cannot chown $PKGROOT!"); &run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
copy("$SI_POST", "$RESOURCE_DIR/postinstall") copy("$SI_POST", "$RESOURCE_DIR/postinstall")
or &abort("Error copying $SI_POST!"); or &abort("Error copying $SI_POST!");
chmod(0644, "$RESOURCE_DIR/postinstall"); chmod(0644, "$RESOURCE_DIR/postinstall");
......
...@@ -109,6 +109,7 @@ MYSQL_MANAGER* manager=0; ...@@ -109,6 +109,7 @@ MYSQL_MANAGER* manager=0;
static char **default_argv; static char **default_argv;
static const char *load_default_groups[]= { "mysqltest","client",0 }; static const char *load_default_groups[]= { "mysqltest","client",0 };
static char line_buffer[MAX_DELIMITER], *line_buffer_pos= line_buffer;;
static FILE* file_stack[MAX_INCLUDE_DEPTH]; static FILE* file_stack[MAX_INCLUDE_DEPTH];
static FILE** cur_file; static FILE** cur_file;
...@@ -870,18 +871,25 @@ int do_exec(struct st_query* q) ...@@ -870,18 +871,25 @@ 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)); buf[strlen(buf)-1]=0;
pclose(res_file); DBUG_PRINT("exec_result",("%s", buf));
}
} }
else else
{ {
...@@ -893,11 +901,8 @@ int do_exec(struct st_query* q) ...@@ -893,11 +901,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();
...@@ -916,8 +921,9 @@ int do_exec(struct st_query* q) ...@@ -916,8 +921,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)
...@@ -1052,7 +1058,7 @@ int do_system(struct st_query* q) ...@@ -1052,7 +1058,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);
...@@ -1646,24 +1652,49 @@ int do_while(struct st_query* q) ...@@ -1646,24 +1652,49 @@ int do_while(struct st_query* q)
} }
my_bool end_of_query(int c, char* p) /*
Read characters from line buffer or file. This is needed to allow
my_ungetc() to buffer MAX_DELIMITER characters for a file
NOTE:
This works as long as one doesn't change files (with 'source file_name')
when there is things pushed into the buffer. This should however not
happen for any tests in the test suite.
*/
int my_getc(FILE *file)
{ {
uint i, j; if (line_buffer_pos == line_buffer)
int tmp[MAX_DELIMITER]= {0}; return fgetc(file);
return *--line_buffer_pos;
}
for (i= 0; c == *(delimiter + i) && i < delimiter_length; void my_ungetc(int c)
i++, c= fgetc(*cur_file)) {
*line_buffer_pos++= (char) c;
}
my_bool end_of_query(int c)
{
uint i,j;
char tmp[MAX_DELIMITER];
if (c != *delimiter)
return 0;
for (i= 1; i < delimiter_length &&
(c= my_getc(*cur_file)) == *(delimiter + i);
i++)
tmp[i]= c; tmp[i]= c;
tmp[i]= c;
for (j= i; j > 0 && i != delimiter_length; j--)
ungetc(tmp[j], *cur_file);
if (i == delimiter_length) if (i == delimiter_length)
{ return 1; /* Found delimiter */
ungetc(tmp[i], *cur_file);
*p= 0; /* didn't find delimiter, push back things that we read */
return 1; my_ungetc(c);
} while (i > 1)
my_ungetc(tmp[--i]);
return 0; return 0;
} }
...@@ -1681,7 +1712,7 @@ int read_line(char* buf, int size) ...@@ -1681,7 +1712,7 @@ int read_line(char* buf, int size)
for (; p < buf_end ;) for (; p < buf_end ;)
{ {
no_save= 0; no_save= 0;
c= fgetc(*cur_file); c= my_getc(*cur_file);
if (feof(*cur_file)) if (feof(*cur_file))
{ {
if ((*cur_file) != stdin) if ((*cur_file) != stdin)
...@@ -1696,8 +1727,11 @@ int read_line(char* buf, int size) ...@@ -1696,8 +1727,11 @@ int read_line(char* buf, int size)
switch(state) { switch(state) {
case R_NORMAL: case R_NORMAL:
/* Only accept '{' in the beginning of a line */ /* Only accept '{' in the beginning of a line */
if (end_of_query(c, p)) if (end_of_query(c))
{
*p= 0;
return 0; return 0;
}
else if (c == '\'') else if (c == '\'')
state = R_Q1; state = R_Q1;
else if (c == '"') else if (c == '"')
...@@ -1733,7 +1767,7 @@ int read_line(char* buf, int size) ...@@ -1733,7 +1767,7 @@ int read_line(char* buf, int size)
*buf= 0; *buf= 0;
return 0; return 0;
} }
else if (end_of_query(c, p) || c == '{') else if (end_of_query(c) || c == '{')
{ {
*p= 0; *p= 0;
return 0; return 0;
...@@ -1753,8 +1787,11 @@ int read_line(char* buf, int size) ...@@ -1753,8 +1787,11 @@ int read_line(char* buf, int size)
state= R_ESC_SLASH_Q1; state= R_ESC_SLASH_Q1;
break; break;
case R_ESC_Q_Q1: case R_ESC_Q_Q1:
if (end_of_query(c, p)) if (end_of_query(c))
{
*p= 0;
return 0; return 0;
}
if (c != '\'') if (c != '\'')
state= R_NORMAL; state= R_NORMAL;
else else
...@@ -1771,8 +1808,11 @@ int read_line(char* buf, int size) ...@@ -1771,8 +1808,11 @@ int read_line(char* buf, int size)
state= R_ESC_SLASH_Q2; state= R_ESC_SLASH_Q2;
break; break;
case R_ESC_Q_Q2: case R_ESC_Q_Q2:
if (end_of_query(c, p)) if (end_of_query(c))
{
*p= 0;
return 0; return 0;
}
if (c != '"') if (c != '"')
state= R_NORMAL; state= R_NORMAL;
else else
...@@ -1797,11 +1837,12 @@ int read_query(struct st_query** q_ptr) ...@@ -1797,11 +1837,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))
...@@ -1820,7 +1861,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1820,7 +1861,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 == '#')
{ {
...@@ -1874,7 +1915,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1874,7 +1915,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);
} }
...@@ -2356,9 +2397,6 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2356,9 +2397,6 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
} }
} }
if (glob_replace)
free_replace();
if (record) if (record)
{ {
if (!q->record_file[0] && !result_file) if (!q->record_file[0] && !result_file)
...@@ -2379,6 +2417,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2379,6 +2417,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
mysql_error(mysql); mysql_error(mysql);
end: end:
free_replace();
last_result=0; last_result=0;
if (ds == &ds_tmp) if (ds == &ds_tmp)
dynstr_free(&ds_tmp); dynstr_free(&ds_tmp);
...@@ -2392,10 +2431,12 @@ void get_query_type(struct st_query* q) ...@@ -2392,10 +2431,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;
...@@ -2406,8 +2447,10 @@ void get_query_type(struct st_query* q) ...@@ -2406,8 +2447,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,29 +63,30 @@ extern const char *client_errors[]; /* Error messages */ ...@@ -63,29 +63,30 @@ 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
/* new 4.1 error codes */ /* new 4.1 error codes */
#define CR_NULL_POINTER 2028 #define CR_NULL_POINTER 2029
#define CR_NO_PREPARE_STMT 2029 #define CR_NO_PREPARE_STMT 2030
#define CR_PARAMS_NOT_BOUND 2030 #define CR_PARAMS_NOT_BOUND 2031
#define CR_DATA_TRUNCATED 2031 #define CR_DATA_TRUNCATED 2032
#define CR_NO_PARAMETERS_EXISTS 2032 #define CR_NO_PARAMETERS_EXISTS 2033
#define CR_INVALID_PARAMETER_NO 2033 #define CR_INVALID_PARAMETER_NO 2034
#define CR_INVALID_BUFFER_USE 2034 #define CR_INVALID_BUFFER_USE 2035
#define CR_UNSUPPORTED_PARAM_TYPE 2035 #define CR_UNSUPPORTED_PARAM_TYPE 2036
#define CR_SHARED_MEMORY_CONNECTION 2036 #define CR_SHARED_MEMORY_CONNECTION 2037
#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2037 #define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038
#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2038 #define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039
#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2039 #define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040
#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2040 #define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041
#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2041 #define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042
#define CR_SHARED_MEMORY_MAP_ERROR 2042 #define CR_SHARED_MEMORY_MAP_ERROR 2043
#define CR_SHARED_MEMORY_EVENT_ERROR 2043 #define CR_SHARED_MEMORY_EVENT_ERROR 2044
#define CR_SHARED_MEMORY_CONNECT_ABANDODED_ERROR 2044 #define CR_SHARED_MEMORY_CONNECT_ABANDODED_ERROR 2045
#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2045 #define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046
#define CR_CONN_UNKNOW_PROTOCOL 2046 #define CR_CONN_UNKNOW_PROTOCOL 2047
#define CR_INVALID_CONN_HANDLE 2047 #define CR_INVALID_CONN_HANDLE 2048
#define CR_SECURE_AUTH 2048 #define CR_SECURE_AUTH 2049
#define CR_FETCH_CANCELLED 2049 #define CR_FETCH_CANCELLED 2050
#define CR_NO_DATA 2050 #define CR_NO_DATA 2051
...@@ -23,4 +23,9 @@ ...@@ -23,4 +23,9 @@
/* mysqld compile time options */ /* mysqld compile time options */
#endif /* _CUSTOMCONFIG_ */ #endif /* _CUSTOMCONFIG_ */
#ifndef LICENSE
#define LICENSE "GPL"
#endif /* LICENSE */
#endif /* _mysql_version_h */ #endif /* _mysql_version_h */
...@@ -5,7 +5,7 @@ The B-tree ...@@ -5,7 +5,7 @@ The B-tree
Created 6/2/1994 Heikki Tuuri Created 6/2/1994 Heikki Tuuri
*******************************************************/ *******************************************************/
#include "btr0btr.h" #include "btr0btr.h"
#ifdef UNIV_NONINL #ifdef UNIV_NONINL
...@@ -76,9 +76,6 @@ make them consecutive on disk if possible. From the other file segment ...@@ -76,9 +76,6 @@ make them consecutive on disk if possible. From the other file segment
we allocate pages for the non-leaf levels of the tree. we allocate pages for the non-leaf levels of the tree.
*/ */
/* If this many inserts occur sequentially, it affects page split */
#define BTR_PAGE_SEQ_INSERT_LIMIT 5
/****************************************************************** /******************************************************************
Creates a new index page to the tree (not the root, and also not Creates a new index page to the tree (not the root, and also not
used in page reorganization). */ used in page reorganization). */
...@@ -1089,18 +1086,18 @@ btr_page_get_split_rec_to_left( ...@@ -1089,18 +1086,18 @@ btr_page_get_split_rec_to_left(
page = btr_cur_get_page(cursor); page = btr_cur_get_page(cursor);
insert_point = btr_cur_get_rec(cursor); insert_point = btr_cur_get_rec(cursor);
if ((page_header_get_ptr(page, PAGE_LAST_INSERT) if (page_header_get_ptr(page, PAGE_LAST_INSERT)
== page_rec_get_next(insert_point)) == page_rec_get_next(insert_point)) {
&& (page_header_get_field(page, PAGE_DIRECTION) == PAGE_LEFT)
&& ((page_header_get_field(page, PAGE_N_DIRECTION)
>= BTR_PAGE_SEQ_INSERT_LIMIT)
|| (page_header_get_field(page, PAGE_N_DIRECTION) + 1
>= page_get_n_recs(page)))) {
infimum = page_get_infimum_rec(page); infimum = page_get_infimum_rec(page);
if ((infimum != insert_point) /* If the convergence is in the middle of a page, include also
&& (page_rec_get_next(infimum) != insert_point)) { the record immediately before the new insert to the upper
page. Otherwise, we could repeatedly move from page to page
lots of records smaller than the convergence point. */
if (infimum != insert_point
&& page_rec_get_next(infimum) != insert_point) {
*split_rec = insert_point; *split_rec = insert_point;
} else { } else {
...@@ -1134,29 +1131,29 @@ btr_page_get_split_rec_to_right( ...@@ -1134,29 +1131,29 @@ btr_page_get_split_rec_to_right(
page = btr_cur_get_page(cursor); page = btr_cur_get_page(cursor);
insert_point = btr_cur_get_rec(cursor); insert_point = btr_cur_get_rec(cursor);
if ((page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point) /* We use eager heuristics: if the new insert would be right after
&& (page_header_get_field(page, PAGE_DIRECTION) == PAGE_RIGHT) the previous insert on the same page, we assume that there is a
&& ((page_header_get_field(page, PAGE_N_DIRECTION) pattern of sequential inserts here. */
>= BTR_PAGE_SEQ_INSERT_LIMIT)
|| (page_header_get_field(page, PAGE_N_DIRECTION) + 1 if (page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point) {
>= page_get_n_recs(page)))) {
supremum = page_get_supremum_rec(page); supremum = page_get_supremum_rec(page);
if ((page_rec_get_next(insert_point) != supremum) if (page_rec_get_next(insert_point) != supremum
&& (page_rec_get_next(page_rec_get_next(insert_point)) && page_rec_get_next(page_rec_get_next(insert_point))
!= supremum) != supremum) {
&& (page_rec_get_next(page_rec_get_next(
page_rec_get_next(insert_point))) /* If there are >= 2 user records up from the insert
!= supremum)) { point, split all but 1 off. We want to keep one because
then sequential inserts can use the adaptive hash
/* If there are >= 3 user records up from the insert index, as they can do the necessary checks of the right
point, split all but 2 off */ search position just by looking at the records on this
page. */
*split_rec = page_rec_get_next(page_rec_get_next(
page_rec_get_next(insert_point))); *split_rec = page_rec_get_next(
page_rec_get_next(insert_point));
} else { } else {
/* Else split at inserted record */ /* Else split at the new record to insert */
*split_rec = NULL; *split_rec = NULL;
} }
......
...@@ -2682,10 +2682,11 @@ btr_estimate_number_of_different_key_vals( ...@@ -2682,10 +2682,11 @@ btr_estimate_number_of_different_key_vals(
btr_cur_open_at_rnd_pos(index, BTR_SEARCH_LEAF, &cursor, &mtr); btr_cur_open_at_rnd_pos(index, BTR_SEARCH_LEAF, &cursor, &mtr);
/* Count the number of different key values minus one /* Count the number of different key values for each prefix of
for each prefix of the key on this index page: we subtract the key on this index page. If the prefix does not determine
one because otherwise our algorithm would give a wrong the index record uniquely in te B-tree, then we subtract one
estimate for an index where there is just one key value */ because otherwise our algorithm would give a wrong estimate
for an index where there is just one key value. */
page = btr_cur_get_page(&cursor); page = btr_cur_get_page(&cursor);
...@@ -2707,6 +2708,9 @@ btr_estimate_number_of_different_key_vals( ...@@ -2707,6 +2708,9 @@ btr_estimate_number_of_different_key_vals(
&matched_bytes); &matched_bytes);
for (j = matched_fields + 1; j <= n_cols; j++) { for (j = matched_fields + 1; j <= n_cols; j++) {
/* We add one if this index record has
a different prefix from the previous */
n_diff[j]++; n_diff[j]++;
} }
...@@ -2716,6 +2720,18 @@ btr_estimate_number_of_different_key_vals( ...@@ -2716,6 +2720,18 @@ btr_estimate_number_of_different_key_vals(
rec = page_rec_get_next(rec); rec = page_rec_get_next(rec);
} }
if (n_cols == dict_index_get_n_unique_in_tree(index)) {
/* We add one because we know that the first record
on the page certainly had a different prefix than the
last record on the previous index page in the
alphabetical order. Before this fix, if there was
just one big record on each clustered index page, the
algorithm grossly underestimated the number of rows
in the table. */
n_diff[n_cols]++;
}
total_external_size += total_external_size +=
btr_rec_get_externally_stored_len(rec); btr_rec_get_externally_stored_len(rec);
mtr_commit(&mtr); mtr_commit(&mtr);
......
...@@ -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 */
......
...@@ -52,6 +52,7 @@ const char *client_errors[]= ...@@ -52,6 +52,7 @@ const char *client_errors[]=
"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",
"Invalid use of null pointer", "Invalid use of null pointer",
"Statement not prepared", "Statement not prepared",
"Parameters data was not supplied", "Parameters data was not supplied",
...@@ -110,6 +111,7 @@ const char *client_errors[]= ...@@ -110,6 +111,7 @@ const char *client_errors[]=
"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",
"Invalid use of null pointer", "Invalid use of null pointer",
"Statement not prepared", "Statement not prepared",
"Parameters data was not supplied", "Parameters data was not supplied",
...@@ -166,6 +168,7 @@ const char *client_errors[]= ...@@ -166,6 +168,7 @@ const char *client_errors[]=
"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",
"Invalid use of null pointer", "Invalid use of null pointer",
"Statement not prepared", "Statement not prepared",
"Not all parameters data supplied", "Not all parameters data supplied",
......
...@@ -603,6 +603,57 @@ mysql_connect(MYSQL *mysql,const char *host, ...@@ -603,6 +603,57 @@ 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 */
/************************************************************************** /**************************************************************************
Change user and database Change user and database
**************************************************************************/ **************************************************************************/
......
...@@ -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
...@@ -18,7 +18,7 @@ TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work ...@@ -18,7 +18,7 @@ TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work
LOCAL_SOCKET=@MYSQL_UNIX_ADDR@ LOCAL_SOCKET=@MYSQL_UNIX_ADDR@
# For query_cache test # For query_cache test
case "$SYSTEM" in case `uname` in
SCO_SV | UnixWare | OpenUNIX ) SCO_SV | UnixWare | OpenUNIX )
# do nothing (Causes strange behavior) # do nothing (Causes strange behavior)
;; ;;
...@@ -469,12 +469,13 @@ if [ x$SOURCE_DIST = x1 ] ; then ...@@ -469,12 +469,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"
...@@ -486,17 +487,18 @@ else ...@@ -486,17 +487,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/"
...@@ -507,11 +509,12 @@ else ...@@ -507,11 +509,12 @@ else
fi fi
fi fi
MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK $EXTRA_MYSQLDUMP_OPT" MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD $EXTRA_MYSQLDUMP_OPT"
MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT"
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 --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose=1"
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 MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES CLIENT_BINDIR
if [ -z "$MASTER_MYSQLD" ] if [ -z "$MASTER_MYSQLD" ]
then then
...@@ -539,9 +542,9 @@ fi ...@@ -539,9 +542,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
......
...@@ -271,8 +271,8 @@ delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Cou ...@@ -271,8 +271,8 @@ delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Cou
select * from t1; select * from t1;
N M N M
3 0 3 0
delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.*,p2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS p2 ON P1.N = p2.N;
ERROR HY000: The target table P2 of the DELETE is not updatable ERROR HY000: The target table p2 of the DELETE is not updatable
delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
ERROR 42S22: Unknown column 'aaa' in 'field list' ERROR 42S22: Unknown column 'aaa' in 'field list'
drop table t1; drop table t1;
......
...@@ -119,15 +119,6 @@ ASIN(0.8+0.2) ...@@ -119,15 +119,6 @@ ASIN(0.8+0.2)
SELECT ASIN(1.2-0.2); SELECT ASIN(1.2-0.2);
ASIN(1.2-0.2) ASIN(1.2-0.2)
1.570796 1.570796
select floor(log(4)/log(2));
floor(log(4)/log(2))
2
select floor(log(8)/log(2));
floor(log(8)/log(2))
3
select floor(log(16)/log(2));
floor(log(16)/log(2))
4
explain extended select degrees(pi()),radians(360); explain extended select degrees(pi()),radians(360);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
......
...@@ -112,6 +112,18 @@ n s ...@@ -112,6 +112,18 @@ n s
2 two test 2 two test
3 three test 3 three test
4 four test 4 four test
stop slave;
reset slave;
load data from master;
start slave;
insert into mysqltest.t1 values (5, 'five bar');
select * from mysqltest.t1;
n s
1 one test
2 two test
3 three test
4 four test
5 five bar
load table mysqltest.t1 from master; load table mysqltest.t1 from master;
ERROR 42S01: Table 't1' already exists ERROR 42S01: Table 't1' already exists
drop table mysqltest.t1; drop table mysqltest.t1;
......
...@@ -26,7 +26,7 @@ select (@id := id) - id from t3; ...@@ -26,7 +26,7 @@ select (@id := id) - id from t3;
0 0
kill @id; kill @id;
drop table t2,t3; drop table t2,t3;
ERROR 08S01: Server shutdown in progress Got one of the listed errors
show binlog events from 79; show binlog events from 79;
Log_name Pos Event_type Server_id Orig_log_pos Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.000001 79 Query 1 79 use `test`; create table t1 (a int primary key) master-bin.000001 79 Query 1 79 use `test`; create table t1 (a int primary key)
......
...@@ -3,6 +3,10 @@ Tables_in_db ...@@ -3,6 +3,10 @@ Tables_in_db
columns_priv columns_priv
db db
func func
help_category
help_keyword
help_relation
help_topic
host host
tables_priv tables_priv
user user
...@@ -26,7 +30,7 @@ db CREATE TABLE `db` ( ...@@ -26,7 +30,7 @@ db CREATE TABLE `db` (
`Lock_tables_priv` enum('N','Y') NOT NULL default 'N', `Lock_tables_priv` enum('N','Y') NOT NULL default 'N',
PRIMARY KEY (`Host`,`Db`,`User`), PRIMARY KEY (`Host`,`Db`,`User`),
KEY `User` (`User`) KEY `User` (`User`)
) TYPE=MyISAM COMMENT='Database privileges' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Database privileges'
show create table host; show create table host;
Table Create Table Table Create Table
host CREATE TABLE `host` ( host CREATE TABLE `host` (
...@@ -45,13 +49,13 @@ host CREATE TABLE `host` ( ...@@ -45,13 +49,13 @@ host CREATE TABLE `host` (
`Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N', `Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N',
`Lock_tables_priv` enum('N','Y') NOT NULL default 'N', `Lock_tables_priv` enum('N','Y') NOT NULL default 'N',
PRIMARY KEY (`Host`,`Db`) PRIMARY KEY (`Host`,`Db`)
) TYPE=MyISAM COMMENT='Host privileges; Merged with database privileges' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Host privileges; Merged with database privileges'
show create table user; show create table user;
Table Create Table Table Create Table
user CREATE TABLE `user` ( user CREATE TABLE `user` (
`Host` varchar(60) binary NOT NULL default '', `Host` varchar(60) binary NOT NULL default '',
`User` varchar(16) binary NOT NULL default '', `User` varchar(16) binary NOT NULL default '',
`Password` varchar(16) binary NOT NULL default '', `Password` varchar(41) binary NOT NULL default '',
`Select_priv` enum('N','Y') NOT NULL default 'N', `Select_priv` enum('N','Y') NOT NULL default 'N',
`Insert_priv` enum('N','Y') NOT NULL default 'N', `Insert_priv` enum('N','Y') NOT NULL default 'N',
`Update_priv` enum('N','Y') NOT NULL default 'N', `Update_priv` enum('N','Y') NOT NULL default 'N',
...@@ -81,16 +85,16 @@ user CREATE TABLE `user` ( ...@@ -81,16 +85,16 @@ user CREATE TABLE `user` (
`max_updates` int(11) unsigned NOT NULL default '0', `max_updates` int(11) unsigned NOT NULL default '0',
`max_connections` int(11) unsigned NOT NULL default '0', `max_connections` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`Host`,`User`) PRIMARY KEY (`Host`,`User`)
) TYPE=MyISAM COMMENT='Users and global privileges' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Users and global privileges'
show create table func; show create table func;
Table Create Table Table Create Table
func CREATE TABLE `func` ( func CREATE TABLE `func` (
`name` char(64) NOT NULL default '', `name` char(64) binary NOT NULL default '',
`ret` tinyint(1) NOT NULL default '0', `ret` tinyint(1) NOT NULL default '0',
`dl` char(128) NOT NULL default '', `dl` char(128) NOT NULL default '',
`type` enum('function','aggregate') NOT NULL default 'function', `type` enum('function','aggregate') NOT NULL default 'function',
PRIMARY KEY (`name`) PRIMARY KEY (`name`)
) TYPE=MyISAM COMMENT='User defined functions' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='User defined functions'
show create table tables_priv; show create table tables_priv;
Table Create Table Table Create Table
tables_priv CREATE TABLE `tables_priv` ( tables_priv CREATE TABLE `tables_priv` (
...@@ -99,12 +103,12 @@ tables_priv CREATE TABLE `tables_priv` ( ...@@ -99,12 +103,12 @@ tables_priv CREATE TABLE `tables_priv` (
`User` char(16) binary NOT NULL default '', `User` char(16) binary NOT NULL default '',
`Table_name` char(64) binary NOT NULL default '', `Table_name` char(64) binary NOT NULL default '',
`Grantor` char(77) NOT NULL default '', `Grantor` char(77) NOT NULL default '',
`Timestamp` timestamp(14) NOT NULL, `Timestamp` timestamp NOT NULL,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') NOT NULL default '', `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') NOT NULL default '',
`Column_priv` set('Select','Insert','Update','References') NOT NULL default '', `Column_priv` set('Select','Insert','Update','References') NOT NULL default '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`), PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
KEY `Grantor` (`Grantor`) KEY `Grantor` (`Grantor`)
) TYPE=MyISAM COMMENT='Table privileges' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table privileges'
show create table columns_priv; show create table columns_priv;
Table Create Table Table Create Table
columns_priv CREATE TABLE `columns_priv` ( columns_priv CREATE TABLE `columns_priv` (
...@@ -113,7 +117,7 @@ columns_priv CREATE TABLE `columns_priv` ( ...@@ -113,7 +117,7 @@ columns_priv CREATE TABLE `columns_priv` (
`User` char(16) binary NOT NULL default '', `User` char(16) binary NOT NULL default '',
`Table_name` char(64) binary NOT NULL default '', `Table_name` char(64) binary NOT NULL default '',
`Column_name` char(64) binary NOT NULL default '', `Column_name` char(64) binary NOT NULL default '',
`Timestamp` timestamp(14) NOT NULL, `Timestamp` timestamp NOT NULL,
`Column_priv` set('Select','Insert','Update','References') NOT NULL default '', `Column_priv` set('Select','Insert','Update','References') NOT NULL default '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) TYPE=MyISAM COMMENT='Column privileges' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Column privileges'
...@@ -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,
......
...@@ -907,3 +907,18 @@ n ...@@ -907,3 +907,18 @@ n
9 9
10 10
drop table t1; drop table t1;
create table t1 (i int);
insert into t1 values (1);
select * from t1 UNION select * from t1;
i
1
select * from t1 UNION ALL select * from t1;
i
1
1
select * from t1 UNION select * from t1 UNION ALL select * from t1;
i
1
1
1
drop table t1;
...@@ -157,7 +157,8 @@ UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) ...@@ -157,7 +157,8 @@ UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1)
UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2; UPDATE `t1` AS P1 INNER JOIN (SELECT aaaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
select * from t1; select * from t1;
-- error 1288 --replace_result P2 p2
--error 1288
delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.*,P2.* from `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
-- error 1054 -- error 1054
delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N; delete P1.* from `t1` AS P1 INNER JOIN (SELECT aaa FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N;
......
...@@ -45,7 +45,9 @@ SELECT ASIN(1.2-0.2); ...@@ -45,7 +45,9 @@ SELECT ASIN(1.2-0.2);
# Bug #3051 FLOOR returns invalid # Bug #3051 FLOOR returns invalid
# #
select floor(log(4)/log(2)); # This can't be tested as it's not portable
select floor(log(8)/log(2)); #select floor(log(4)/log(2));
select floor(log(16)/log(2)); #select floor(log(8)/log(2));
#select floor(log(16)/log(2));
explain extended select degrees(pi()),radians(360); explain extended select degrees(pi()),radians(360);
#
# 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
...@@ -118,6 +118,21 @@ connection slave; ...@@ -118,6 +118,21 @@ connection slave;
sync_with_master; sync_with_master;
select * from mysqltest.t1; select * from mysqltest.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 mysqltest.t1 values (5, 'five bar');
save_master_pos;
connection slave;
sync_with_master;
select * from mysqltest.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
......
...@@ -45,7 +45,7 @@ select (@id := id) - id from t3; ...@@ -45,7 +45,7 @@ select (@id := id) - id from t3;
kill @id; kill @id;
drop table t2,t3; drop table t2,t3;
connection master; connection master;
--error 1053; --error 1053,0;
reap; reap;
connection master1; connection master1;
show binlog events from 79; show binlog events from 79;
......
# #
# 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); --disable_warnings
insert into test_db (Host,Db,User) values (@name,@name,@name);
create table test_host select * from mysql.host; --enable_warnings
delete from test_host;
insert into test_host (Host,Db) values (@name,@name); create table test_host select * from mysql.host;
delete from test_host;
create table test_user select * from mysql.user; --disable_warnings
delete from test_user; insert into test_host (Host,Db) values (@name,@name);
insert into test_user (Host,User) values (@name,@name); --enable_warnings
create table test_func select * from mysql.func; create table test_user select * from mysql.user;
delete from test_func; delete from test_user;
insert into test_func (name) values (@name); --disable_warnings
insert into test_user (Host,User) values (@name,@name);
create table test_tables_priv select * from mysql.tables_priv; --enable_warnings
delete from test_tables_priv;
insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name); create table test_func select * from mysql.func;
delete from test_func;
create table test_columns_priv select * from mysql.columns_priv; --disable_warnings
delete from test_columns_priv; insert into test_func (name) values (@name);
insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name); --enable_warnings
# 'Host' field must be the same for all the tables: create table test_tables_priv select * from mysql.tables_priv;
delete from test_tables_priv;
select --disable_warnings
if(isnull(test_db.Host),'WRONG!!!','ok') as test_db_Host, insert into test_tables_priv (Host,Db,User,Table_name) values (@name,@name,@name,@name);
if(isnull(test_host.Host),'WRONG!!!','ok') as test_host_Host, --enable_warnings
if(isnull(test_user.Host),'WRONG!!!','ok') as test_user_Host,
if(isnull(test_tables_priv.Host),'WRONG!!!','ok') as test_tables_priv_Host, create table test_columns_priv select * from mysql.columns_priv;
if(isnull(test_columns_priv.Host),'WRONG!!!','ok') as test_columns_priv_Host delete from test_columns_priv;
--disable_warnings
from test_db insert into test_columns_priv (Host,Db,User,Table_name,Column_name) values (@name,@name,@name,@name,@name);
left join test_host on test_db.Host=test_host.Host --enable_warnings
left join test_user on test_db.Host=test_user.Host
left join test_tables_priv on test_db.Host=test_tables_priv.Host # 'Host' 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
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;
...@@ -483,3 +483,16 @@ select col1 n from t1 union select col2 n from t1 order by n; ...@@ -483,3 +483,16 @@ select col1 n from t1 union select col2 n from t1 order by n;
alter table t1 add index myindex (col2); alter table t1 add index myindex (col2);
select col1 n from t1 union select col2 n from t1 order by n; select col1 n from t1 union select col2 n from t1 order by n;
drop table t1; drop table t1;
#
# Bug #1428, incorrect handling of UNION ALL
# NOTE: The current result is wrong, needs to be fixed!
#
create table t1 (i int);
insert into t1 values (1);
select * from t1 UNION select * from t1;
select * from t1 UNION ALL select * from t1;
# The following should return 2 lines
select * from t1 UNION select * from t1 UNION ALL select * from t1;
drop table t1;
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
* * * *
* As an extension if remove_garbage is set then all non- * * As an extension if remove_garbage is set then all non- *
* alpha characters are skipped * * alpha characters are skipped *
* *
* Note, that this implementation corresponds to the *
* original version of the algorithm, not to the more *
* popular "enhanced" version, described by Knuth. *
****************************************************************/ ****************************************************************/
#include "mysys_priv.h" #include "mysys_priv.h"
......
...@@ -188,7 +188,7 @@ then ...@@ -188,7 +188,7 @@ then
c_t="$c_t Host char(60) binary DEFAULT '' NOT NULL," c_t="$c_t Host char(60) binary DEFAULT '' NOT NULL,"
c_t="$c_t Db char(64) binary DEFAULT '' NOT NULL," c_t="$c_t Db char(64) binary DEFAULT '' NOT NULL,"
c_t="$c_t User char(16) binary DEFAULT '' NOT NULL," c_t="$c_t User char(16) binary DEFAULT '' NOT NULL,"
c_t="$c_t Table_name char(60) binary DEFAULT '' NOT NULL," c_t="$c_t Table_name char(64) binary DEFAULT '' NOT NULL,"
c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL," c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
c_t="$c_t Timestamp timestamp(14)," c_t="$c_t Timestamp timestamp(14),"
c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL," c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
......
...@@ -13,6 +13,7 @@ args="" ...@@ -13,6 +13,7 @@ args=""
port="" port=""
socket="" socket=""
database="mysql" database="mysql"
bindir=""
file=mysql_fix_privilege_tables.sql file=mysql_fix_privilege_tables.sql
...@@ -40,6 +41,7 @@ parse_arguments() { ...@@ -40,6 +41,7 @@ parse_arguments() {
--port=*) port=`echo "$arg" | sed -e "s;--port=;;"` ;; --port=*) port=`echo "$arg" | sed -e "s;--port=;;"` ;;
--socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;; --socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;;
--database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;; --database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;;
--bindir=*) bindir=`echo "$arg" | sed -e "s;--bindir=;;"` ;;
*) *)
if test -n "$pick_args" if test -n "$pick_args"
then then
...@@ -54,21 +56,15 @@ parse_arguments() { ...@@ -54,21 +56,15 @@ parse_arguments() {
# Get first arguments from the my.cfg file, groups [mysqld] and # Get first arguments from the my.cfg file, groups [mysqld] and
# [mysql_install_db], and then merge with the command line arguments # [mysql_install_db], and then merge with the command line arguments
if test -x ./bin/my_print_defaults
then for dir in ./bin @bindir@ @bindir@ extra $bindir/../bin $bindir/../extra
print_defaults="./bin/my_print_defaults" do
elif test -x @bindr@/my_print_defaults if test -x $dir/my_print_defaults
then then
print_defaults="@bindir@/my_print_defaults" print_defaults="$dir/my_print_defaults"
elif test -x @bindir@/mysql_print_defaults break
then fi
print_defaults="@bindir@/mysql_print_defaults" done
elif test -x extra/my_print_defaults
then
print_defaults="extra/my_print_defaults"
else
print_defaults="my_print_defaults"
fi
parse_arguments `$print_defaults $defaults mysql_install_db mysql_fix_privilege_tables` parse_arguments `$print_defaults $defaults mysql_install_db mysql_fix_privilege_tables`
parse_arguments PICK-ARGS-FROM-ARGV "$@" parse_arguments PICK-ARGS-FROM-ARGV "$@"
...@@ -76,11 +72,17 @@ parse_arguments PICK-ARGS-FROM-ARGV "$@" ...@@ -76,11 +72,17 @@ parse_arguments PICK-ARGS-FROM-ARGV "$@"
if test -z "$basedir" if test -z "$basedir"
then then
basedir=@prefix@ basedir=@prefix@
bindir=@bindir@ if test -z "$bindir"
then
bindir=@bindir@
fi
execdir=@libexecdir@ execdir=@libexecdir@
pkgdatadir=@pkgdatadir@ pkgdatadir=@pkgdatadir@
else else
bindir="$basedir/bin" if test -z "$bindir"
then
bindir="$basedir/bin"
fi
if test -x "$basedir/libexec/mysqld" if test -x "$basedir/libexec/mysqld"
then then
execdir="$basedir/libexec" execdir="$basedir/libexec"
...@@ -101,7 +103,6 @@ fi ...@@ -101,7 +103,6 @@ fi
cmd="$bindir/mysql -f --user=$user --host=$host" cmd="$bindir/mysql -f --user=$user --host=$host"
if test -z "$password" ; then if test -z "$password" ; then
else
cmd="$cmd --password=$password" cmd="$cmd --password=$password"
fi fi
if test ! -z "$port"; then if test ! -z "$port"; then
......
...@@ -7,19 +7,18 @@ ...@@ -7,19 +7,18 @@
-- On unix, you should use the mysql_fix_privilege_tables script to execute -- On unix, you should use the mysql_fix_privilege_tables script to execute
-- this sql script. -- this sql script.
-- On windows you should do 'mysql --force < mysql_fix_privilege_tables.sql' -- On windows you should do 'mysql --force mysql < mysql_fix_privilege_tables.sql'
USE mysql;
ALTER TABLE user type=MyISAM; ALTER TABLE user type=MyISAM;
ALTER TABLE db type=MyISAM; ALTER TABLE db type=MyISAM;
ALTER TABLE host type=MyISAM; ALTER TABLE host type=MyISAM;
ALTER TABLE func type=MyISAM; ALTER TABLE func type=MyISAM;
ALTER TABLE columns_priv type=MyISAM; ALTER TABLE columns_priv type=MyISAM;
ALTER TABLE tables_priv type=MyISAM; ALTER TABLE tables_priv type=MyISAM;
ALTER TABLE user change Password Password char(41) not null; ALTER TABLE user change Password Password char(41) binary not null;
ALTER TABLE user add File_priv enum('N','Y') NOT NULL; ALTER TABLE user add File_priv enum('N','Y') NOT NULL;
CREATE TABLE IF NOT EXISTS func ( CREATE TABLE IF NOT EXISTS func (
name char(64) DEFAULT '' NOT NULL, name char(64) binary DEFAULT '' NOT NULL,
ret tinyint(1) DEFAULT '0' NOT NULL, ret tinyint(1) DEFAULT '0' NOT NULL,
dl char(128) DEFAULT '' NOT NULL, dl char(128) DEFAULT '' NOT NULL,
type enum ('function','aggregate') NOT NULL, type enum ('function','aggregate') NOT NULL,
...@@ -39,6 +38,10 @@ UPDATE user SET Grant_priv=File_priv,References_priv=Create_priv,Index_priv=Crea ...@@ -39,6 +38,10 @@ UPDATE user SET Grant_priv=File_priv,References_priv=Create_priv,Index_priv=Crea
UPDATE db SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; UPDATE db SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0;
UPDATE host SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; UPDATE host SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0;
--
-- The second alter changes ssl_type to new 4.0.2 format
-- Adding columns needed by GRANT .. REQUIRE (openssl)"
ALTER TABLE user ALTER TABLE user
ADD ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL, ADD ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL,
ADD ssl_cipher BLOB NOT NULL, ADD ssl_cipher BLOB NOT NULL,
...@@ -46,11 +49,15 @@ ADD x509_issuer BLOB NOT NULL, ...@@ -46,11 +49,15 @@ ADD x509_issuer BLOB NOT NULL,
ADD x509_subject BLOB NOT NULL; ADD x509_subject BLOB NOT NULL;
ALTER TABLE user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL; ALTER TABLE user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL;
--
-- Create tables_priv and columns_priv if they don't exists
--
CREATE TABLE IF NOT EXISTS tables_priv ( CREATE TABLE IF NOT EXISTS tables_priv (
Host char(60) DEFAULT '' NOT NULL, Host char(60) binary DEFAULT '' NOT NULL,
Db char(60) DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL,
User char(16) DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL,
Table_name char(60) DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL,
Grantor char(77) DEFAULT '' NOT NULL, Grantor char(77) DEFAULT '' NOT NULL,
Timestamp timestamp(14), Timestamp timestamp(14),
Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL, Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,
...@@ -69,16 +76,29 @@ CREATE TABLE IF NOT EXISTS columns_priv ( ...@@ -69,16 +76,29 @@ CREATE TABLE IF NOT EXISTS columns_priv (
PRIMARY KEY (Host,Db,User,Table_name,Column_name) PRIMARY KEY (Host,Db,User,Table_name,Column_name)
); );
--
-- Name change of Type -> Column_priv from MySQL 3.22.12
--
ALTER TABLE columns_priv change Type Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL; ALTER TABLE columns_priv change Type Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL;
--
-- Add the new 'type' column to the func table.
--
ALTER TABLE func add type enum ('function','aggregate') NOT NULL; ALTER TABLE func add type enum ('function','aggregate') NOT NULL;
--
-- Change the user,db and host tables to MySQL 4.0 format
--
# Detect whether we had Show_db_priv # Detect whether we had Show_db_priv
SET @hadShowDbPriv:=0; SET @hadShowDbPriv:=0;
SELECT @hadShowDbPriv:=1 FROM user WHERE Show_db_priv LIKE '%'; SELECT @hadShowDbPriv:=1 FROM user WHERE Show_db_priv LIKE '%';
ALTER TABLE user ALTER TABLE user
ADD Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER alter_priv, ADD Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Alter_priv,
ADD Super_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Show_db_priv, ADD Super_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Show_db_priv,
ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Super_priv, ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Super_priv,
ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Create_tmp_table_priv, ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Create_tmp_table_priv,
...@@ -86,13 +106,24 @@ ADD Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Lock_tables_priv, ...@@ -86,13 +106,24 @@ ADD Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Lock_tables_priv,
ADD Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Execute_priv, ADD Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Execute_priv,
ADD Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Repl_slave_priv; ADD Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Repl_slave_priv;
UPDATE user SET show_db_priv= select_priv, super_priv=process_priv, execute_priv=process_priv, create_tmp_table_priv='Y', Lock_tables_priv='Y', Repl_slave_priv=file_priv, Repl_client_priv=file_priv where user<>"" AND @hadShowDbPriv = 0; -- Convert privileges so that users have similar privileges as before
UPDATE user SET Show_db_priv= Select_priv, Super_priv=Process_priv, Execute_priv=Process_priv, Create_tmp_table_priv='Y', Lock_tables_priv='Y', Repl_slave_priv=file_priv, Repl_client_priv=File_priv where user<>"" AND @hadShowDbPriv = 0;
-- Add fields that can be used to limit number of questions and connections
-- for some users.
ALTER TABLE user ALTER TABLE user
ADD max_questions int(11) NOT NULL AFTER x509_subject, ADD max_questions int(11) NOT NULL AFTER x509_subject,
ADD max_updates int(11) unsigned NOT NULL AFTER max_questions, ADD max_updates int(11) unsigned NOT NULL AFTER max_questions,
ADD max_connections int(11) unsigned NOT NULL AFTER max_updates; ADD max_connections int(11) unsigned NOT NULL AFTER max_updates;
--
-- Add Create_tmp_table_priv and Lock_tables_priv to db and host
--
ALTER TABLE db ALTER TABLE db
ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL, ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,
ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL; ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
...@@ -100,6 +131,20 @@ ALTER TABLE host ...@@ -100,6 +131,20 @@ ALTER TABLE host
ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL, ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,
ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL; ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
alter table db change Db Db char(64) binary DEFAULT '' NOT NULL;
alter table host change Db Db char(64) binary DEFAULT '' NOT NULL;
alter table user change max_questions max_questions int(11) unsigned DEFAULT 0 NOT NULL;
alter table tables_priv change Db Db char(64) binary DEFAULT '' NOT NULL, change Host Host char(60) binary DEFAULT '' NOT NULL, change User User char(16) binary DEFAULT '' NOT NULL, change Table_name Table_name char(64) binary DEFAULT '' NOT NULL;
alter table tables_priv add KEY Grantor (Grantor);
alter table columns_priv change Db Db char(64) binary DEFAULT '' NOT NULL, change Host Host char(60) binary DEFAULT '' NOT NULL, change User User char(16) binary DEFAULT '' NOT NULL, change Table_name Table_name char(64) binary DEFAULT '' NOT NULL, change Column_name Column_name char(64) binary DEFAULT '' NOT NULL;
alter table db comment='Database privileges';
alter table host comment='Host privileges; Merged with database privileges';
alter table user comment='Users and global privileges';
alter table func comment='User defined functions';
alter table tables_priv comment='Table privileges';
alter table columns_priv comment='Column privileges';
# #
# Create some possible missing tables # Create some possible missing tables
# #
......
...@@ -151,7 +151,7 @@ then ...@@ -151,7 +151,7 @@ then
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
resolved=`$bindir/resolveip localhost 2>&1` resolved=`$bindir/resolveip localhost 2>&1`
if [ $? -eq 0 ] if [ $? -ne 0 ]
then then
echo "Neither host '$hostname' and 'localhost' could not be looked up with" echo "Neither host '$hostname' and 'localhost' could not be looked up with"
echo "$bindir/resolveip" echo "$bindir/resolveip"
......
...@@ -895,7 +895,7 @@ int load_master_data(THD* thd) ...@@ -895,7 +895,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 = mysql_fetch_row(master_status_res); MYSQL_ROW row = mysql_fetch_row(master_status_res);
...@@ -908,10 +908,19 @@ int load_master_data(THD* thd) ...@@ -908,10 +908,19 @@ 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, 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;
/* /*
......
...@@ -424,14 +424,12 @@ static sys_var_thd_ulong sys_default_week_format("default_week_format", ...@@ -424,14 +424,12 @@ static sys_var_thd_ulong sys_default_week_format("default_week_format",
sys_var_thd_ulong sys_group_concat_max_len("group_concat_max_len", sys_var_thd_ulong sys_group_concat_max_len("group_concat_max_len",
&SV::group_concat_max_len); &SV::group_concat_max_len);
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