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
|
||||
[nick:]checkout:get
|
||||
checkout:edit
|
||||
eoln:unix
|
||||
|
@ -61,6 +61,12 @@ else
|
||||
}
|
||||
|
||||
$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 eq "" ? $TMP= $TMP . "/PKGBUILD.$$": $TMP= "/tmp/PKGBUILD.$$";
|
||||
$PKGROOT= "$TMP/PMROOT";
|
||||
@ -79,6 +85,9 @@ $BUILDDIR= "$PWD/$HOST";
|
||||
$SRCBASEDIR= <$BUILDDIR/mysql*-$VERSION>;
|
||||
$SUPFILEDIR= <$SRCBASEDIR/support-files/MacOSX>;
|
||||
$TAR= <$BUILDDIR/$NAME-apple-darwin*-powerpc.tar.gz>;
|
||||
$TAR =~ /.*\/$NAME(.*)\.tar\.gz$/;
|
||||
$ARCH= $1;
|
||||
$NAME= $NAME . $ARCH;
|
||||
$INFO= <$SUPFILEDIR/Info.plist>;
|
||||
$DESC= <$SUPFILEDIR/Description.plist>;
|
||||
$SI_INFO= <$SUPFILEDIR/StartupItem.Info.plist>;
|
||||
@ -167,7 +176,7 @@ unless (-f "$RESOURCE_DIR/License.txt");
|
||||
&logger("Extracting $TAR to $PKGROOT");
|
||||
&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("chown -R root.wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
|
||||
&run_command("chown -R root:wheel $PKGROOT/*", "Cannot chown $PKGROOT!");
|
||||
|
||||
# Now build the PGK using PackageMaker
|
||||
# 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/")
|
||||
or &abort("Error copying $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")
|
||||
or &abort("Error copying $SI_POST!");
|
||||
chmod(0644, "$RESOURCE_DIR/postinstall");
|
||||
|
@ -109,6 +109,7 @@ MYSQL_MANAGER* manager=0;
|
||||
|
||||
static char **default_argv;
|
||||
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** cur_file;
|
||||
@ -870,18 +871,25 @@ int do_exec(struct st_query* q)
|
||||
char buf[1024];
|
||||
FILE *res_file;
|
||||
char *cmd= q->first_argument;
|
||||
DBUG_ENTER("do_exec");
|
||||
|
||||
while (*cmd && my_isspace(charset_info, *cmd))
|
||||
cmd++;
|
||||
if (!*cmd)
|
||||
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)
|
||||
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
|
||||
{
|
||||
@ -893,11 +901,8 @@ int do_exec(struct st_query* q)
|
||||
else
|
||||
ds= &ds_res;
|
||||
|
||||
if (!(res_file= popen(cmd, "r")) && q->abort_on_error)
|
||||
die("popen() failed\n");
|
||||
while (fgets(buf, sizeof(buf), res_file))
|
||||
replace_dynstr_append_mem(ds, buf, strlen(buf));
|
||||
pclose(res_file);
|
||||
|
||||
if (glob_replace)
|
||||
free_replace();
|
||||
@ -916,8 +921,9 @@ int do_exec(struct st_query* q)
|
||||
if (ds == &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)
|
||||
@ -1052,7 +1058,7 @@ int do_system(struct st_query* q)
|
||||
eval_expr(&v, p, 0); /* NULL terminated */
|
||||
if (v.str_val_len)
|
||||
{
|
||||
char expr_buf[512];
|
||||
char expr_buf[1024];
|
||||
if ((uint)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);
|
||||
@ -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;
|
||||
int tmp[MAX_DELIMITER]= {0};
|
||||
if (line_buffer_pos == line_buffer)
|
||||
return fgetc(file);
|
||||
return *--line_buffer_pos;
|
||||
}
|
||||
|
||||
for (i= 0; c == *(delimiter + i) && i < delimiter_length;
|
||||
i++, c= fgetc(*cur_file))
|
||||
tmp[i]= c;
|
||||
void my_ungetc(int 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;
|
||||
|
||||
for (j= i; j > 0 && i != delimiter_length; j--)
|
||||
ungetc(tmp[j], *cur_file);
|
||||
if (i == delimiter_length)
|
||||
{
|
||||
ungetc(tmp[i], *cur_file);
|
||||
*p= 0;
|
||||
return 1;
|
||||
}
|
||||
return 1; /* Found delimiter */
|
||||
|
||||
/* didn't find delimiter, push back things that we read */
|
||||
my_ungetc(c);
|
||||
while (i > 1)
|
||||
my_ungetc(tmp[--i]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1681,7 +1712,7 @@ int read_line(char* buf, int size)
|
||||
for (; p < buf_end ;)
|
||||
{
|
||||
no_save= 0;
|
||||
c= fgetc(*cur_file);
|
||||
c= my_getc(*cur_file);
|
||||
if (feof(*cur_file))
|
||||
{
|
||||
if ((*cur_file) != stdin)
|
||||
@ -1696,8 +1727,11 @@ int read_line(char* buf, int size)
|
||||
switch(state) {
|
||||
case R_NORMAL:
|
||||
/* Only accept '{' in the beginning of a line */
|
||||
if (end_of_query(c, p))
|
||||
if (end_of_query(c))
|
||||
{
|
||||
*p= 0;
|
||||
return 0;
|
||||
}
|
||||
else if (c == '\'')
|
||||
state = R_Q1;
|
||||
else if (c == '"')
|
||||
@ -1733,7 +1767,7 @@ int read_line(char* buf, int size)
|
||||
*buf= 0;
|
||||
return 0;
|
||||
}
|
||||
else if (end_of_query(c, p) || c == '{')
|
||||
else if (end_of_query(c) || c == '{')
|
||||
{
|
||||
*p= 0;
|
||||
return 0;
|
||||
@ -1753,8 +1787,11 @@ int read_line(char* buf, int size)
|
||||
state= R_ESC_SLASH_Q1;
|
||||
break;
|
||||
case R_ESC_Q_Q1:
|
||||
if (end_of_query(c, p))
|
||||
if (end_of_query(c))
|
||||
{
|
||||
*p= 0;
|
||||
return 0;
|
||||
}
|
||||
if (c != '\'')
|
||||
state= R_NORMAL;
|
||||
else
|
||||
@ -1771,8 +1808,11 @@ int read_line(char* buf, int size)
|
||||
state= R_ESC_SLASH_Q2;
|
||||
break;
|
||||
case R_ESC_Q_Q2:
|
||||
if (end_of_query(c, p))
|
||||
if (end_of_query(c))
|
||||
{
|
||||
*p= 0;
|
||||
return 0;
|
||||
}
|
||||
if (c != '"')
|
||||
state= R_NORMAL;
|
||||
else
|
||||
@ -1797,11 +1837,12 @@ int read_query(struct st_query** q_ptr)
|
||||
char *p = read_query_buf, * p1 ;
|
||||
int expected_errno;
|
||||
struct st_query* q;
|
||||
DBUG_ENTER("read_query_buf");
|
||||
|
||||
if (parser.current_line < parser.read_lines)
|
||||
{
|
||||
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))) ||
|
||||
insert_dynamic(&q_lines, (gptr) &q))
|
||||
@ -1820,7 +1861,7 @@ int read_query(struct st_query** q_ptr)
|
||||
q->type = Q_UNKNOWN;
|
||||
q->query_buf= q->query= 0;
|
||||
if (read_line(read_query_buf, sizeof(read_query_buf)))
|
||||
return 1;
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (*p == '#')
|
||||
{
|
||||
@ -1874,7 +1915,7 @@ int read_query(struct st_query** q_ptr)
|
||||
q->first_argument= p;
|
||||
q->end= strend(q->query);
|
||||
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 (!q->record_file[0] && !result_file)
|
||||
@ -2379,6 +2417,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
|
||||
mysql_error(mysql);
|
||||
|
||||
end:
|
||||
free_replace();
|
||||
last_result=0;
|
||||
if (ds == &ds_tmp)
|
||||
dynstr_free(&ds_tmp);
|
||||
@ -2392,10 +2431,12 @@ void get_query_type(struct st_query* q)
|
||||
{
|
||||
char save;
|
||||
uint type;
|
||||
DBUG_ENTER("get_query_type");
|
||||
|
||||
if (*q->query == '}')
|
||||
{
|
||||
q->type = Q_END_BLOCK;
|
||||
return;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
if (q->type != Q_COMMENT_WITH_COMMAND)
|
||||
q->type = Q_QUERY;
|
||||
@ -2406,8 +2447,10 @@ void get_query_type(struct st_query* q)
|
||||
q->query[q->first_word_len]=save;
|
||||
if (type > 0)
|
||||
q->type=(enum enum_commands) type; /* Found command */
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
static byte *get_var_key(const byte* var, uint* len,
|
||||
my_bool __attribute__((unused)) t)
|
||||
{
|
||||
|
@ -63,29 +63,30 @@ extern const char *client_errors[]; /* Error messages */
|
||||
#define CR_PROBE_MASTER_CONNECT 2025
|
||||
#define CR_SSL_CONNECTION_ERROR 2026
|
||||
#define CR_MALFORMED_PACKET 2027
|
||||
#define CR_WRONG_LICENSE 2028
|
||||
|
||||
/* new 4.1 error codes */
|
||||
#define CR_NULL_POINTER 2028
|
||||
#define CR_NO_PREPARE_STMT 2029
|
||||
#define CR_PARAMS_NOT_BOUND 2030
|
||||
#define CR_DATA_TRUNCATED 2031
|
||||
#define CR_NO_PARAMETERS_EXISTS 2032
|
||||
#define CR_INVALID_PARAMETER_NO 2033
|
||||
#define CR_INVALID_BUFFER_USE 2034
|
||||
#define CR_UNSUPPORTED_PARAM_TYPE 2035
|
||||
#define CR_NULL_POINTER 2029
|
||||
#define CR_NO_PREPARE_STMT 2030
|
||||
#define CR_PARAMS_NOT_BOUND 2031
|
||||
#define CR_DATA_TRUNCATED 2032
|
||||
#define CR_NO_PARAMETERS_EXISTS 2033
|
||||
#define CR_INVALID_PARAMETER_NO 2034
|
||||
#define CR_INVALID_BUFFER_USE 2035
|
||||
#define CR_UNSUPPORTED_PARAM_TYPE 2036
|
||||
|
||||
#define CR_SHARED_MEMORY_CONNECTION 2036
|
||||
#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2037
|
||||
#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2038
|
||||
#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2039
|
||||
#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2040
|
||||
#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2041
|
||||
#define CR_SHARED_MEMORY_MAP_ERROR 2042
|
||||
#define CR_SHARED_MEMORY_EVENT_ERROR 2043
|
||||
#define CR_SHARED_MEMORY_CONNECT_ABANDODED_ERROR 2044
|
||||
#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2045
|
||||
#define CR_CONN_UNKNOW_PROTOCOL 2046
|
||||
#define CR_INVALID_CONN_HANDLE 2047
|
||||
#define CR_SECURE_AUTH 2048
|
||||
#define CR_FETCH_CANCELLED 2049
|
||||
#define CR_NO_DATA 2050
|
||||
#define CR_SHARED_MEMORY_CONNECTION 2037
|
||||
#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR 2038
|
||||
#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR 2039
|
||||
#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040
|
||||
#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR 2041
|
||||
#define CR_SHARED_MEMORY_FILE_MAP_ERROR 2042
|
||||
#define CR_SHARED_MEMORY_MAP_ERROR 2043
|
||||
#define CR_SHARED_MEMORY_EVENT_ERROR 2044
|
||||
#define CR_SHARED_MEMORY_CONNECT_ABANDODED_ERROR 2045
|
||||
#define CR_SHARED_MEMORY_CONNECT_SET_ERROR 2046
|
||||
#define CR_CONN_UNKNOW_PROTOCOL 2047
|
||||
#define CR_INVALID_CONN_HANDLE 2048
|
||||
#define CR_SECURE_AUTH 2049
|
||||
#define CR_FETCH_CANCELLED 2050
|
||||
#define CR_NO_DATA 2051
|
||||
|
@ -23,4 +23,9 @@
|
||||
|
||||
/* mysqld compile time options */
|
||||
#endif /* _CUSTOMCONFIG_ */
|
||||
|
||||
#ifndef LICENSE
|
||||
#define LICENSE "GPL"
|
||||
#endif /* LICENSE */
|
||||
|
||||
#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.
|
||||
*/
|
||||
|
||||
/* 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
|
||||
used in page reorganization). */
|
||||
@ -1089,18 +1086,18 @@ btr_page_get_split_rec_to_left(
|
||||
page = btr_cur_get_page(cursor);
|
||||
insert_point = btr_cur_get_rec(cursor);
|
||||
|
||||
if ((page_header_get_ptr(page, PAGE_LAST_INSERT)
|
||||
== 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)))) {
|
||||
if (page_header_get_ptr(page, PAGE_LAST_INSERT)
|
||||
== page_rec_get_next(insert_point)) {
|
||||
|
||||
infimum = page_get_infimum_rec(page);
|
||||
|
||||
if ((infimum != insert_point)
|
||||
&& (page_rec_get_next(infimum) != insert_point)) {
|
||||
/* If the convergence is in the middle of a page, include also
|
||||
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;
|
||||
} else {
|
||||
@ -1134,29 +1131,29 @@ btr_page_get_split_rec_to_right(
|
||||
page = btr_cur_get_page(cursor);
|
||||
insert_point = btr_cur_get_rec(cursor);
|
||||
|
||||
if ((page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point)
|
||||
&& (page_header_get_field(page, PAGE_DIRECTION) == PAGE_RIGHT)
|
||||
&& ((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)))) {
|
||||
/* We use eager heuristics: if the new insert would be right after
|
||||
the previous insert on the same page, we assume that there is a
|
||||
pattern of sequential inserts here. */
|
||||
|
||||
if (page_header_get_ptr(page, PAGE_LAST_INSERT) == insert_point) {
|
||||
|
||||
supremum = page_get_supremum_rec(page);
|
||||
|
||||
if ((page_rec_get_next(insert_point) != supremum)
|
||||
&& (page_rec_get_next(page_rec_get_next(insert_point))
|
||||
!= supremum)
|
||||
&& (page_rec_get_next(page_rec_get_next(
|
||||
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))
|
||||
!= supremum) {
|
||||
|
||||
/* If there are >= 3 user records up from the insert
|
||||
point, split all but 2 off */
|
||||
/* If there are >= 2 user records up from the insert
|
||||
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(
|
||||
page_rec_get_next(insert_point)));
|
||||
*split_rec = page_rec_get_next(
|
||||
page_rec_get_next(insert_point));
|
||||
} else {
|
||||
/* Else split at inserted record */
|
||||
/* Else split at the new record to insert */
|
||||
*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);
|
||||
|
||||
/* Count the number of different key values minus one
|
||||
for each prefix of the key on this index page: we subtract
|
||||
one because otherwise our algorithm would give a wrong
|
||||
estimate for an index where there is just one key value */
|
||||
/* Count the number of different key values for each prefix of
|
||||
the key on this index page. If the prefix does not determine
|
||||
the index record uniquely in te B-tree, then we subtract one
|
||||
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);
|
||||
|
||||
@ -2707,6 +2708,9 @@ btr_estimate_number_of_different_key_vals(
|
||||
&matched_bytes);
|
||||
|
||||
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]++;
|
||||
}
|
||||
|
||||
@ -2716,6 +2720,18 @@ btr_estimate_number_of_different_key_vals(
|
||||
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 +=
|
||||
btr_rec_get_externally_stored_len(rec);
|
||||
mtr_commit(&mtr);
|
||||
|
@ -668,15 +668,15 @@ does nothing! */
|
||||
void
|
||||
que_thr_handle_error(
|
||||
/*=================*/
|
||||
que_thr_t* thr __attribute((unused)),
|
||||
que_thr_t* thr __attribute__((unused)),
|
||||
/* in: query thread */
|
||||
ulint err_no __attribute((unused)),
|
||||
ulint err_no __attribute__((unused)),
|
||||
/* in: error number */
|
||||
byte* err_str __attribute((unused)),
|
||||
byte* err_str __attribute__((unused)),
|
||||
/* in, own: error string or NULL; NOTE: the
|
||||
function will take care of freeing of the
|
||||
string! */
|
||||
ulint err_len __attribute((unused)))
|
||||
ulint err_len __attribute__((unused)))
|
||||
/* in: error string length */
|
||||
{
|
||||
/* Does nothing */
|
||||
|
@ -52,6 +52,7 @@ const char *client_errors[]=
|
||||
"Error connecting to master:",
|
||||
"SSL connection error",
|
||||
"Malformed packet",
|
||||
"This client library is licensed only for use with MySQL servers having '%s' license",
|
||||
"Invalid use of null pointer",
|
||||
"Statement not prepared",
|
||||
"Parameters data was not supplied",
|
||||
@ -110,6 +111,7 @@ const char *client_errors[]=
|
||||
"Error connecting to master:",
|
||||
"SSL connection error",
|
||||
"Malformed packet",
|
||||
"This client library is licensed only for use with MySQL servers having '%s' license",
|
||||
"Invalid use of null pointer",
|
||||
"Statement not prepared",
|
||||
"Parameters data was not supplied",
|
||||
@ -166,6 +168,7 @@ const char *client_errors[]=
|
||||
"Error connecting to master:",
|
||||
"SSL connection error",
|
||||
"Malformed packet",
|
||||
"This client library is licensed only for use with MySQL servers having '%s' license",
|
||||
"Invalid use of null pointer",
|
||||
"Statement not prepared",
|
||||
"Not all parameters data supplied",
|
||||
|
@ -603,6 +603,57 @@ mysql_connect(MYSQL *mysql,const char *host,
|
||||
#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
|
||||
**************************************************************************/
|
||||
|
@ -10,7 +10,7 @@
|
||||
# Access Definitions
|
||||
#--
|
||||
DB=test
|
||||
DBPASSWD=
|
||||
DBPASSWD=""
|
||||
VERBOSE=""
|
||||
USE_MANAGER=0
|
||||
MY_TZ=GMT-3
|
||||
@ -18,7 +18,7 @@ TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work
|
||||
LOCAL_SOCKET=@MYSQL_UNIX_ADDR@
|
||||
|
||||
# For query_cache test
|
||||
case "$SYSTEM" in
|
||||
case `uname` in
|
||||
SCO_SV | UnixWare | OpenUNIX )
|
||||
# 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"
|
||||
fi
|
||||
|
||||
MYSQLADMIN="$BASEDIR/client/mysqladmin"
|
||||
CLIENT_BINDIR="$BASEDIR/client"
|
||||
MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
|
||||
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_PWGEN="$BASEDIR/client/mysqlmanager-pwgen"
|
||||
MYSQL="$BASEDIR/client/mysql"
|
||||
MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
|
||||
MYSQL="$CLIENT_BINDIR/mysql"
|
||||
LANGUAGE="$BASEDIR/sql/share/english/"
|
||||
CHARSETSDIR="$BASEDIR/sql/share/charsets"
|
||||
INSTALL_DB="./install_test_db"
|
||||
@ -486,17 +487,18 @@ else
|
||||
else
|
||||
MYSQLD="$VALGRIND $BASEDIR/bin/mysqld"
|
||||
fi
|
||||
MYSQL_TEST="$BASEDIR/bin/mysqltest"
|
||||
MYSQL_DUMP="$BASEDIR/bin/mysqldump"
|
||||
MYSQL_BINLOG="$BASEDIR/bin/mysqlbinlog"
|
||||
MYSQLADMIN="$BASEDIR/bin/mysqladmin"
|
||||
WAIT_PID="$BASEDIR/bin/mysql_waitpid"
|
||||
MYSQL_MANAGER="$BASEDIR/bin/mysqlmanager"
|
||||
MYSQL_MANAGER_CLIENT="$BASEDIR/bin/mysqlmanagerc"
|
||||
MYSQL_MANAGER_PWGEN="$BASEDIR/bin/mysqlmanager-pwgen"
|
||||
MYSQL="$BASEDIR/bin/mysql"
|
||||
CLIENT_BINDIR="$BASEDIR/bin"
|
||||
MYSQL_TEST="$CLIENT_BINDIR/mysqltest"
|
||||
MYSQL_DUMP="$CLIENT_BINDIR/mysqldump"
|
||||
MYSQL_BINLOG="$CLIENT_BINDIR/mysqlbinlog"
|
||||
MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
|
||||
WAIT_PID="$CLIENT_BINDIR/mysql_waitpid"
|
||||
MYSQL_MANAGER="$CLIENT_BINDIR/mysqlmanager"
|
||||
MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc"
|
||||
MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
|
||||
MYSQL="$CLIENT_BINDIR/mysql"
|
||||
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"
|
||||
then
|
||||
LANGUAGE="$BASEDIR/share/mysql/english/"
|
||||
@ -507,11 +509,12 @@ else
|
||||
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_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password="
|
||||
MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password="
|
||||
export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES
|
||||
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=$DBPASSWD"
|
||||
export MYSQL MYSQL_DUMP MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES CLIENT_BINDIR
|
||||
|
||||
|
||||
if [ -z "$MASTER_MYSQLD" ]
|
||||
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;
|
||||
N M
|
||||
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;
|
||||
ERROR HY000: The target table P2 of the DELETE is not updatable
|
||||
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
|
||||
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'
|
||||
drop table t1;
|
||||
|
@ -119,15 +119,6 @@ ASIN(0.8+0.2)
|
||||
SELECT ASIN(1.2-0.2);
|
||||
ASIN(1.2-0.2)
|
||||
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);
|
||||
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
|
||||
|
@ -112,6 +112,18 @@ n s
|
||||
2 two test
|
||||
3 three 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;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
drop table mysqltest.t1;
|
||||
|
@ -26,7 +26,7 @@ select (@id := id) - id from t3;
|
||||
0
|
||||
kill @id;
|
||||
drop table t2,t3;
|
||||
ERROR 08S01: Server shutdown in progress
|
||||
Got one of the listed errors
|
||||
show binlog events from 79;
|
||||
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)
|
||||
|
@ -3,6 +3,10 @@ Tables_in_db
|
||||
columns_priv
|
||||
db
|
||||
func
|
||||
help_category
|
||||
help_keyword
|
||||
help_relation
|
||||
help_topic
|
||||
host
|
||||
tables_priv
|
||||
user
|
||||
@ -26,7 +30,7 @@ db CREATE TABLE `db` (
|
||||
`Lock_tables_priv` enum('N','Y') NOT NULL default 'N',
|
||||
PRIMARY KEY (`Host`,`Db`,`User`),
|
||||
KEY `User` (`User`)
|
||||
) TYPE=MyISAM COMMENT='Database privileges'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Database privileges'
|
||||
show create table host;
|
||||
Table Create Table
|
||||
host CREATE TABLE `host` (
|
||||
@ -45,13 +49,13 @@ host CREATE TABLE `host` (
|
||||
`Create_tmp_table_priv` enum('N','Y') NOT NULL default 'N',
|
||||
`Lock_tables_priv` enum('N','Y') NOT NULL default 'N',
|
||||
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;
|
||||
Table Create Table
|
||||
user CREATE TABLE `user` (
|
||||
`Host` varchar(60) 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',
|
||||
`Insert_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_connections` int(11) unsigned NOT NULL default '0',
|
||||
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;
|
||||
Table Create Table
|
||||
func CREATE TABLE `func` (
|
||||
`name` char(64) NOT NULL default '',
|
||||
`name` char(64) binary NOT NULL default '',
|
||||
`ret` tinyint(1) NOT NULL default '0',
|
||||
`dl` char(128) NOT NULL default '',
|
||||
`type` enum('function','aggregate') NOT NULL default 'function',
|
||||
PRIMARY KEY (`name`)
|
||||
) TYPE=MyISAM COMMENT='User defined functions'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='User defined functions'
|
||||
show create table tables_priv;
|
||||
Table Create Table
|
||||
tables_priv CREATE TABLE `tables_priv` (
|
||||
@ -99,12 +103,12 @@ tables_priv CREATE TABLE `tables_priv` (
|
||||
`User` char(16) binary NOT NULL default '',
|
||||
`Table_name` char(64) binary 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 '',
|
||||
`Column_priv` set('Select','Insert','Update','References') NOT NULL default '',
|
||||
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
|
||||
KEY `Grantor` (`Grantor`)
|
||||
) TYPE=MyISAM COMMENT='Table privileges'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table privileges'
|
||||
show create table columns_priv;
|
||||
Table Create Table
|
||||
columns_priv CREATE TABLE `columns_priv` (
|
||||
@ -113,7 +117,7 @@ columns_priv CREATE TABLE `columns_priv` (
|
||||
`User` char(16) binary NOT NULL default '',
|
||||
`Table_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 '',
|
||||
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
|
||||
10
|
||||
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;
|
||||
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;
|
||||
-- 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;
|
||||
-- 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;
|
||||
|
@ -45,7 +45,9 @@ SELECT ASIN(1.2-0.2);
|
||||
# Bug #3051 FLOOR returns invalid
|
||||
#
|
||||
|
||||
select floor(log(4)/log(2));
|
||||
select floor(log(8)/log(2));
|
||||
select floor(log(16)/log(2));
|
||||
# This can't be tested as it's not portable
|
||||
#select floor(log(4)/log(2));
|
||||
#select floor(log(8)/log(2));
|
||||
#select floor(log(16)/log(2));
|
||||
|
||||
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;
|
||||
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
|
||||
# table to be overwritten.
|
||||
# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
|
||||
|
@ -45,7 +45,7 @@ select (@id := id) - id from t3;
|
||||
kill @id;
|
||||
drop table t2,t3;
|
||||
connection master;
|
||||
--error 1053;
|
||||
--error 1053,0;
|
||||
reap;
|
||||
connection master1;
|
||||
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;
|
||||
delete from test_db;
|
||||
--disable_warnings
|
||||
insert into test_db (Host,Db,User) values (@name,@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_host select * from mysql.host;
|
||||
delete from test_host;
|
||||
--disable_warnings
|
||||
insert into test_host (Host,Db) values (@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_user select * from mysql.user;
|
||||
delete from test_user;
|
||||
--disable_warnings
|
||||
insert into test_user (Host,User) values (@name,@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_func select * from mysql.func;
|
||||
delete from test_func;
|
||||
--disable_warnings
|
||||
insert into test_func (name) values (@name);
|
||||
--enable_warnings
|
||||
|
||||
create table test_tables_priv select * from mysql.tables_priv;
|
||||
delete from test_tables_priv;
|
||||
--disable_warnings
|
||||
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;
|
||||
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);
|
||||
--enable_warnings
|
||||
|
||||
# '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);
|
||||
select col1 n from t1 union select col2 n from t1 order by n;
|
||||
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- *
|
||||
* 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"
|
||||
|
@ -188,7 +188,7 @@ then
|
||||
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 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 Timestamp timestamp(14),"
|
||||
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=""
|
||||
socket=""
|
||||
database="mysql"
|
||||
bindir=""
|
||||
|
||||
file=mysql_fix_privilege_tables.sql
|
||||
|
||||
@ -40,6 +41,7 @@ parse_arguments() {
|
||||
--port=*) port=`echo "$arg" | sed -e "s;--port=;;"` ;;
|
||||
--socket=*) socket=`echo "$arg" | sed -e "s;--socket=;;"` ;;
|
||||
--database=*) database=`echo "$arg" | sed -e "s;--database=;;"` ;;
|
||||
--bindir=*) bindir=`echo "$arg" | sed -e "s;--bindir=;;"` ;;
|
||||
*)
|
||||
if test -n "$pick_args"
|
||||
then
|
||||
@ -54,21 +56,15 @@ parse_arguments() {
|
||||
|
||||
# Get first arguments from the my.cfg file, groups [mysqld] and
|
||||
# [mysql_install_db], and then merge with the command line arguments
|
||||
if test -x ./bin/my_print_defaults
|
||||
then
|
||||
print_defaults="./bin/my_print_defaults"
|
||||
elif test -x @bindr@/my_print_defaults
|
||||
then
|
||||
print_defaults="@bindir@/my_print_defaults"
|
||||
elif test -x @bindir@/mysql_print_defaults
|
||||
then
|
||||
print_defaults="@bindir@/mysql_print_defaults"
|
||||
elif test -x extra/my_print_defaults
|
||||
then
|
||||
print_defaults="extra/my_print_defaults"
|
||||
else
|
||||
print_defaults="my_print_defaults"
|
||||
fi
|
||||
|
||||
for dir in ./bin @bindir@ @bindir@ extra $bindir/../bin $bindir/../extra
|
||||
do
|
||||
if test -x $dir/my_print_defaults
|
||||
then
|
||||
print_defaults="$dir/my_print_defaults"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
parse_arguments `$print_defaults $defaults mysql_install_db mysql_fix_privilege_tables`
|
||||
parse_arguments PICK-ARGS-FROM-ARGV "$@"
|
||||
@ -76,11 +72,17 @@ parse_arguments PICK-ARGS-FROM-ARGV "$@"
|
||||
if test -z "$basedir"
|
||||
then
|
||||
basedir=@prefix@
|
||||
if test -z "$bindir"
|
||||
then
|
||||
bindir=@bindir@
|
||||
fi
|
||||
execdir=@libexecdir@
|
||||
pkgdatadir=@pkgdatadir@
|
||||
else
|
||||
if test -z "$bindir"
|
||||
then
|
||||
bindir="$basedir/bin"
|
||||
fi
|
||||
if test -x "$basedir/libexec/mysqld"
|
||||
then
|
||||
execdir="$basedir/libexec"
|
||||
@ -101,7 +103,6 @@ fi
|
||||
|
||||
cmd="$bindir/mysql -f --user=$user --host=$host"
|
||||
if test -z "$password" ; then
|
||||
else
|
||||
cmd="$cmd --password=$password"
|
||||
fi
|
||||
if test ! -z "$port"; then
|
||||
|
@ -7,19 +7,18 @@
|
||||
|
||||
-- On unix, you should use the mysql_fix_privilege_tables script to execute
|
||||
-- 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 db type=MyISAM;
|
||||
ALTER TABLE host type=MyISAM;
|
||||
ALTER TABLE func type=MyISAM;
|
||||
ALTER TABLE columns_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;
|
||||
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,
|
||||
dl char(128) DEFAULT '' 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 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
|
||||
ADD ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL,
|
||||
ADD ssl_cipher BLOB NOT NULL,
|
||||
@ -46,11 +49,15 @@ ADD x509_issuer BLOB NOT NULL,
|
||||
ADD x509_subject BLOB 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 (
|
||||
Host char(60) DEFAULT '' NOT NULL,
|
||||
Db char(60) DEFAULT '' NOT NULL,
|
||||
User char(16) DEFAULT '' NOT NULL,
|
||||
Table_name char(60) DEFAULT '' NOT NULL,
|
||||
Host char(60) binary DEFAULT '' NOT NULL,
|
||||
Db char(64) binary DEFAULT '' NOT NULL,
|
||||
User char(16) binary DEFAULT '' NOT NULL,
|
||||
Table_name char(64) binary DEFAULT '' NOT NULL,
|
||||
Grantor char(77) DEFAULT '' NOT NULL,
|
||||
Timestamp timestamp(14),
|
||||
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)
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- 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;
|
||||
|
||||
--
|
||||
-- Add the new 'type' column to the func table.
|
||||
--
|
||||
|
||||
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
|
||||
SET @hadShowDbPriv:=0;
|
||||
SELECT @hadShowDbPriv:=1 FROM user WHERE Show_db_priv LIKE '%';
|
||||
|
||||
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 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,
|
||||
@ -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_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
|
||||
ADD max_questions int(11) NOT NULL AFTER x509_subject,
|
||||
ADD max_updates int(11) unsigned NOT NULL AFTER max_questions,
|
||||
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
|
||||
ADD Create_tmp_table_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 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
|
||||
#
|
||||
|
@ -151,7 +151,7 @@ then
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
resolved=`$bindir/resolveip localhost 2>&1`
|
||||
if [ $? -eq 0 ]
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Neither host '$hostname' and 'localhost' could not be looked up with"
|
||||
echo "$bindir/resolveip"
|
||||
|
@ -895,7 +895,7 @@ int load_master_data(THD* thd)
|
||||
|
||||
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)
|
||||
{
|
||||
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 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],
|
||||
sizeof(active_mi->master_log_name));
|
||||
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)
|
||||
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",
|
||||
&SV::group_concat_max_len);
|
||||
|
||||
static const char license[]= "GPL";
|
||||
|
||||
/* Read only variables */
|
||||
|
||||
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 */
|
||||
sys_var_const_str sys_license("license", LICENSE);
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user