Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/my/mysql-4.1
This commit is contained in:
commit
042af556d5
@ -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
|
|||||||
}
|
}
|
||||||
|
|
||||||
$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";
|
|||||||
$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");
|
|||||||
&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)
|
|||||||
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;
|
|||||||
|
|
||||||
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)
|
|||||||
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");
|
||||||
|
|
||||||
if (disable_result_log)
|
DBUG_PRINT("info", ("Executing '%s'", cmd));
|
||||||
{
|
|
||||||
if (!(res_file= popen(cmd, "r")) && q->abort_on_error)
|
if (!(res_file= popen(cmd, "r")) && q->abort_on_error)
|
||||||
die("popen() failed\n");
|
die("popen() failed\n");
|
||||||
while (fgets(buf, sizeof(buf), res_file));
|
|
||||||
pclose(res_file);
|
if (disable_result_log)
|
||||||
|
{
|
||||||
|
while (fgets(buf, sizeof(buf), res_file))
|
||||||
|
{
|
||||||
|
buf[strlen(buf)-1]=0;
|
||||||
|
DBUG_PRINT("exec_result",("%s", buf));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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))
|
{
|
||||||
tmp[i]= c;
|
*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;
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
*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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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 */
|
|||||||
#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 @@
|
|||||||
|
|
||||||
/* 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 */
|
||||||
|
@ -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(
|
|||||||
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(
|
|||||||
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)))
|
|
||||||
!= supremum)) {
|
|
||||||
|
|
||||||
/* If there are >= 3 user records up from the insert
|
/* If there are >= 2 user records up from the insert
|
||||||
point, split all but 2 off */
|
point, split all but 1 off. We want to keep one because
|
||||||
|
then sequential inserts can use the adaptive hash
|
||||||
|
index, as they can do the necessary checks of the right
|
||||||
|
search position just by looking at the records on this
|
||||||
|
page. */
|
||||||
|
|
||||||
*split_rec = page_rec_get_next(page_rec_get_next(
|
*split_rec = page_rec_get_next(
|
||||||
page_rec_get_next(insert_point)));
|
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(
|
|||||||
|
|
||||||
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(
|
|||||||
&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(
|
|||||||
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! */
|
|||||||
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[]=
|
|||||||
"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[]=
|
|||||||
"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[]=
|
|||||||
"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,
|
|||||||
#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 @@
|
|||||||
# 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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
||||||
|
@ -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)
|
|||||||
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
|
|||||||
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;
|
|||||||
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
|
|||||||
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` (
|
|||||||
`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` (
|
|||||||
`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` (
|
|||||||
`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` (
|
|||||||
`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` (
|
|||||||
`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'
|
||||||
|
@ -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)
|
|||||||
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);
|
|||||||
# 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);
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
#
|
|
||||||
# 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;
|
|||||||
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;
|
|||||||
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;
|
||||||
|
78
mysql-test/t/system_mysql_db_fix.test
Normal file
78
mysql-test/t/system_mysql_db_fix.test
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#
|
||||||
|
# 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
|
@ -10,27 +10,39 @@ set @name="This is a very long string, that mustn't find room in a system field
|
|||||||
|
|
||||||
create table test_db select * from mysql.db;
|
create table test_db select * from mysql.db;
|
||||||
delete from test_db;
|
delete from test_db;
|
||||||
|
--disable_warnings
|
||||||
insert into test_db (Host,Db,User) values (@name,@name,@name);
|
insert into test_db (Host,Db,User) values (@name,@name,@name);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
create table test_host select * from mysql.host;
|
create table test_host select * from mysql.host;
|
||||||
delete from test_host;
|
delete from test_host;
|
||||||
|
--disable_warnings
|
||||||
insert into test_host (Host,Db) values (@name,@name);
|
insert into test_host (Host,Db) values (@name,@name);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
create table test_user select * from mysql.user;
|
create table test_user select * from mysql.user;
|
||||||
delete from test_user;
|
delete from test_user;
|
||||||
|
--disable_warnings
|
||||||
insert into test_user (Host,User) 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_func select * from mysql.func;
|
||||||
delete from test_func;
|
delete from test_func;
|
||||||
|
--disable_warnings
|
||||||
insert into test_func (name) values (@name);
|
insert into test_func (name) values (@name);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
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;
|
||||||
|
--disable_warnings
|
||||||
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);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
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;
|
||||||
|
--disable_warnings
|
||||||
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);
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
# 'Host' field must be the same for all the tables:
|
# 'Host' field must be the same for all the tables:
|
||||||
|
|
@ -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 @@
|
|||||||
* *
|
* *
|
||||||
* 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
|
|||||||
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=""
|
|||||||
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() {
|
|||||||
--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() {
|
|||||||
|
|
||||||
# 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 "$@"
|
|||||||
if test -z "$basedir"
|
if test -z "$basedir"
|
||||||
then
|
then
|
||||||
basedir=@prefix@
|
basedir=@prefix@
|
||||||
|
if test -z "$bindir"
|
||||||
|
then
|
||||||
bindir=@bindir@
|
bindir=@bindir@
|
||||||
|
fi
|
||||||
execdir=@libexecdir@
|
execdir=@libexecdir@
|
||||||
pkgdatadir=@pkgdatadir@
|
pkgdatadir=@pkgdatadir@
|
||||||
else
|
else
|
||||||
|
if test -z "$bindir"
|
||||||
|
then
|
||||||
bindir="$basedir/bin"
|
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
|
|||||||
|
|
||||||
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 @@
|
|||||||
|
|
||||||
-- 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
|
|||||||
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,
|
|||||||
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 (
|
|||||||
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,
|
|||||||
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
|
|||||||
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
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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",
|
|||||||
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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user