Merge branch 'mysql/5.5' into 5.5
This commit is contained in:
commit
ae29ea2d86
@ -238,7 +238,7 @@ static void dbDisconnect(char *host);
|
|||||||
static void DBerror(MYSQL *mysql, const char *when);
|
static void DBerror(MYSQL *mysql, const char *when);
|
||||||
static void safe_exit(int error);
|
static void safe_exit(int error);
|
||||||
static void print_result();
|
static void print_result();
|
||||||
static uint fixed_name_length(const char *name);
|
static size_t fixed_name_length(const char *name);
|
||||||
static char *fix_table_name(char *dest, char *src);
|
static char *fix_table_name(char *dest, char *src);
|
||||||
int what_to_do = 0;
|
int what_to_do = 0;
|
||||||
|
|
||||||
@ -583,10 +583,10 @@ static int process_selected_tables(char *db, char **table_names, int tables)
|
|||||||
} /* process_selected_tables */
|
} /* process_selected_tables */
|
||||||
|
|
||||||
|
|
||||||
static uint fixed_name_length(const char *name)
|
static size_t fixed_name_length(const char *name)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
uint extra_length= 2; /* count the first/last backticks */
|
size_t extra_length= 2; /* count the first/last backticks */
|
||||||
DBUG_ENTER("fixed_name_length");
|
DBUG_ENTER("fixed_name_length");
|
||||||
|
|
||||||
for (p= name; *p; p++)
|
for (p= name; *p; p++)
|
||||||
@ -594,7 +594,7 @@ static uint fixed_name_length(const char *name)
|
|||||||
if (*p == '`')
|
if (*p == '`')
|
||||||
extra_length++;
|
extra_length++;
|
||||||
}
|
}
|
||||||
DBUG_RETURN((uint) ((p - name) + extra_length));
|
DBUG_RETURN((size_t) ((p - name) + extra_length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -653,7 +653,7 @@ static int process_all_tables_in_db(char *database)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
char *tables, *end;
|
char *tables, *end;
|
||||||
uint tot_length = 0;
|
size_t tot_length = 0;
|
||||||
|
|
||||||
char *views, *views_end;
|
char *views, *views_end;
|
||||||
uint tot_views_length = 0;
|
uint tot_views_length = 0;
|
||||||
@ -756,7 +756,9 @@ static int fix_table_storage_name(const char *name)
|
|||||||
|
|
||||||
if (strncmp(name, "#mysql50#", 9))
|
if (strncmp(name, "#mysql50#", 9))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
sprintf(qbuf, "RENAME TABLE `%s` TO `%s`", name, name + 9);
|
my_snprintf(qbuf, sizeof(qbuf), "RENAME TABLE `%s` TO `%s`",
|
||||||
|
name, name + 9);
|
||||||
|
|
||||||
rc= run_query(qbuf);
|
rc= run_query(qbuf);
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
||||||
@ -771,7 +773,8 @@ static int fix_database_storage_name(const char *name)
|
|||||||
|
|
||||||
if (strncmp(name, "#mysql50#", 9))
|
if (strncmp(name, "#mysql50#", 9))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
sprintf(qbuf, "ALTER DATABASE `%s` UPGRADE DATA DIRECTORY NAME", name);
|
my_snprintf(qbuf, sizeof(qbuf), "ALTER DATABASE `%s` UPGRADE DATA DIRECTORY "
|
||||||
|
"NAME", name);
|
||||||
rc= run_query(qbuf);
|
rc= run_query(qbuf);
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
||||||
@ -791,7 +794,7 @@ static int rebuild_table(char *name)
|
|||||||
ptr= strmov(query, "ALTER TABLE ");
|
ptr= strmov(query, "ALTER TABLE ");
|
||||||
ptr= fix_table_name(ptr, name);
|
ptr= fix_table_name(ptr, name);
|
||||||
ptr= strxmov(ptr, " FORCE", NullS);
|
ptr= strxmov(ptr, " FORCE", NullS);
|
||||||
if (mysql_real_query(sock, query, (uint)(ptr - query)))
|
if (mysql_real_query(sock, query, (ulong)(ptr - query)))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to %s\n", query);
|
fprintf(stderr, "Failed to %s\n", query);
|
||||||
fprintf(stderr, "Error: %s\n", mysql_error(sock));
|
fprintf(stderr, "Error: %s\n", mysql_error(sock));
|
||||||
@ -850,7 +853,7 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||||||
{
|
{
|
||||||
char *query, *end, options[100], message[100];
|
char *query, *end, options[100], message[100];
|
||||||
char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
|
char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
|
||||||
uint query_length= 0;
|
size_t query_length= 0, query_size= sizeof(char)*(length+110);
|
||||||
const char *op = 0;
|
const char *op = 0;
|
||||||
const char *tab_view;
|
const char *tab_view;
|
||||||
DBUG_ENTER("handle_request_for_tables");
|
DBUG_ENTER("handle_request_for_tables");
|
||||||
@ -902,10 +905,12 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||||||
DBUG_RETURN(fix_table_storage_name(tables));
|
DBUG_RETURN(fix_table_storage_name(tables));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME))))
|
if (!(query =(char *) my_malloc(query_size, MYF(MY_WME))))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
if (opt_all_in_1)
|
if (opt_all_in_1)
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(strlen(op)+strlen(tables)+strlen(options)+8+1 <= query_size);
|
||||||
|
|
||||||
/* No backticks here as we added them before */
|
/* No backticks here as we added them before */
|
||||||
query_length= sprintf(query, "%s%s%s %s", op,
|
query_length= sprintf(query, "%s%s%s %s", op,
|
||||||
tab_view, tables, options);
|
tab_view, tables, options);
|
||||||
@ -921,7 +926,7 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||||||
(int) (ptr - org)));
|
(int) (ptr - org)));
|
||||||
table_name= table_name_buff;
|
table_name= table_name_buff;
|
||||||
ptr= strxmov(ptr, " ", options, NullS);
|
ptr= strxmov(ptr, " ", options, NullS);
|
||||||
query_length= (uint) (ptr - query);
|
query_length= (size_t) (ptr - query);
|
||||||
}
|
}
|
||||||
if (mysql_real_query(sock, query, query_length))
|
if (mysql_real_query(sock, query, query_length))
|
||||||
{
|
{
|
||||||
@ -1040,7 +1045,10 @@ static void print_result()
|
|||||||
prev_alter[0]= 0;
|
prev_alter[0]= 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
strcpy(prev_alter, alter_txt);
|
{
|
||||||
|
strncpy(prev_alter, alter_txt, MAX_ALTER_STR_SIZE-1);
|
||||||
|
prev_alter[MAX_ALTER_STR_SIZE-1]= 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1193,7 +1201,7 @@ int main(int argc, char **argv)
|
|||||||
process_databases(argv);
|
process_databases(argv);
|
||||||
if (opt_auto_repair)
|
if (opt_auto_repair)
|
||||||
{
|
{
|
||||||
uint i;
|
size_t i;
|
||||||
|
|
||||||
if (!opt_silent && (tables4repair.elements || tables4rebuild.elements))
|
if (!opt_silent && (tables4repair.elements || tables4rebuild.elements))
|
||||||
puts("\nRepairing tables");
|
puts("\nRepairing tables");
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
|
|
||||||
static void add_load_option(DYNAMIC_STRING *str, const char *option,
|
static void add_load_option(DYNAMIC_STRING *str, const char *option,
|
||||||
const char *option_value);
|
const char *option_value);
|
||||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
static ulong find_set(TYPELIB *lib, const char *x, size_t length,
|
||||||
char **err_pos, uint *err_len);
|
char **err_pos, uint *err_len);
|
||||||
static char *alloc_query_str(ulong size);
|
static char *alloc_query_str(ulong size);
|
||||||
|
|
||||||
@ -862,7 +862,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
opt_set_charset= 0;
|
opt_set_charset= 0;
|
||||||
opt_compatible_mode_str= argument;
|
opt_compatible_mode_str= argument;
|
||||||
opt_compatible_mode= find_set(&compatible_mode_typelib,
|
opt_compatible_mode= find_set(&compatible_mode_typelib,
|
||||||
argument, (uint) strlen(argument),
|
argument, strlen(argument),
|
||||||
&err_ptr, &err_len);
|
&err_ptr, &err_len);
|
||||||
if (err_len)
|
if (err_len)
|
||||||
{
|
{
|
||||||
@ -872,7 +872,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
}
|
}
|
||||||
#if !defined(DBUG_OFF)
|
#if !defined(DBUG_OFF)
|
||||||
{
|
{
|
||||||
uint size_for_sql_mode= 0;
|
size_t size_for_sql_mode= 0;
|
||||||
const char **ptr;
|
const char **ptr;
|
||||||
for (ptr= compatible_mode_names; *ptr; ptr++)
|
for (ptr= compatible_mode_names; *ptr; ptr++)
|
||||||
size_for_sql_mode+= strlen(*ptr);
|
size_for_sql_mode+= strlen(*ptr);
|
||||||
@ -1143,8 +1143,8 @@ static int fetch_db_collation(const char *db_name,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(db_cl_name, db_cl_row[0], db_cl_size);
|
strncpy(db_cl_name, db_cl_row[0], db_cl_size-1);
|
||||||
db_cl_name[db_cl_size - 1]= 0; /* just in case. */
|
db_cl_name[db_cl_size - 1]= 0;
|
||||||
|
|
||||||
} while (FALSE);
|
} while (FALSE);
|
||||||
|
|
||||||
@ -1193,7 +1193,7 @@ check_consistent_binlog_pos(char *binlog_pos_file, char *binlog_pos_offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *my_case_str(const char *str,
|
static char *my_case_str(const char *str,
|
||||||
uint str_len,
|
size_t str_len,
|
||||||
const char *token,
|
const char *token,
|
||||||
uint token_len)
|
uint token_len)
|
||||||
{
|
{
|
||||||
@ -1409,7 +1409,7 @@ static int switch_character_set_results(MYSQL *mysql, const char *cs_name)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static char *cover_definer_clause(const char *stmt_str,
|
static char *cover_definer_clause(const char *stmt_str,
|
||||||
uint stmt_length,
|
size_t stmt_length,
|
||||||
const char *definer_version_str,
|
const char *definer_version_str,
|
||||||
uint definer_version_length,
|
uint definer_version_length,
|
||||||
const char *stmt_version_str,
|
const char *stmt_version_str,
|
||||||
@ -1591,14 +1591,14 @@ static void dbDisconnect(char *host)
|
|||||||
} /* dbDisconnect */
|
} /* dbDisconnect */
|
||||||
|
|
||||||
|
|
||||||
static void unescape(FILE *file,char *pos,uint length)
|
static void unescape(FILE *file,char *pos, size_t length)
|
||||||
{
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
DBUG_ENTER("unescape");
|
DBUG_ENTER("unescape");
|
||||||
if (!(tmp=(char*) my_malloc(length*2+1, MYF(MY_WME))))
|
if (!(tmp=(char*) my_malloc(length*2+1, MYF(MY_WME))))
|
||||||
die(EX_MYSQLERR, "Couldn't allocate memory");
|
die(EX_MYSQLERR, "Couldn't allocate memory");
|
||||||
|
|
||||||
mysql_real_escape_string(&mysql_connection, tmp, pos, length);
|
mysql_real_escape_string(&mysql_connection, tmp, pos, (ulong)length);
|
||||||
fputc('\'', file);
|
fputc('\'', file);
|
||||||
fputs(tmp, file);
|
fputs(tmp, file);
|
||||||
fputc('\'', file);
|
fputc('\'', file);
|
||||||
@ -1712,7 +1712,7 @@ static char *quote_for_like(const char *name, char *buff)
|
|||||||
Quote '<' '>' '&' '\"' chars and print a string to the xml_file.
|
Quote '<' '>' '&' '\"' chars and print a string to the xml_file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void print_quoted_xml(FILE *xml_file, const char *str, ulong len,
|
static void print_quoted_xml(FILE *xml_file, const char *str, size_t len,
|
||||||
my_bool is_attribute_name)
|
my_bool is_attribute_name)
|
||||||
{
|
{
|
||||||
const char *end;
|
const char *end;
|
||||||
@ -1973,7 +1973,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name,
|
|||||||
squeezed to a single hyphen.
|
squeezed to a single hyphen.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void print_xml_comment(FILE *xml_file, ulong len,
|
static void print_xml_comment(FILE *xml_file, size_t len,
|
||||||
const char *comment_string)
|
const char *comment_string)
|
||||||
{
|
{
|
||||||
const char* end;
|
const char* end;
|
||||||
@ -2090,7 +2090,7 @@ static uint dump_events_for_db(char *db)
|
|||||||
DBUG_ENTER("dump_events_for_db");
|
DBUG_ENTER("dump_events_for_db");
|
||||||
DBUG_PRINT("enter", ("db: '%s'", db));
|
DBUG_PRINT("enter", ("db: '%s'", db));
|
||||||
|
|
||||||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
mysql_real_escape_string(mysql, db_name_buff, db, (ulong)strlen(db));
|
||||||
|
|
||||||
/* nice comments */
|
/* nice comments */
|
||||||
print_comment(sql_file, 0,
|
print_comment(sql_file, 0,
|
||||||
@ -2209,6 +2209,7 @@ static uint dump_events_for_db(char *db)
|
|||||||
(const char *) (query_str != NULL ? query_str : row[3]),
|
(const char *) (query_str != NULL ? query_str : row[3]),
|
||||||
(const char *) delimiter);
|
(const char *) delimiter);
|
||||||
|
|
||||||
|
my_free(query_str);
|
||||||
restore_time_zone(sql_file, delimiter);
|
restore_time_zone(sql_file, delimiter);
|
||||||
restore_sql_mode(sql_file, delimiter);
|
restore_sql_mode(sql_file, delimiter);
|
||||||
|
|
||||||
@ -2302,7 +2303,7 @@ static uint dump_routines_for_db(char *db)
|
|||||||
DBUG_ENTER("dump_routines_for_db");
|
DBUG_ENTER("dump_routines_for_db");
|
||||||
DBUG_PRINT("enter", ("db: '%s'", db));
|
DBUG_PRINT("enter", ("db: '%s'", db));
|
||||||
|
|
||||||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
mysql_real_escape_string(mysql, db_name_buff, db, (ulong)strlen(db));
|
||||||
|
|
||||||
/* nice comments */
|
/* nice comments */
|
||||||
print_comment(sql_file, 0,
|
print_comment(sql_file, 0,
|
||||||
@ -2356,9 +2357,9 @@ static uint dump_routines_for_db(char *db)
|
|||||||
if the user has EXECUTE privilege he see routine names, but NOT the
|
if the user has EXECUTE privilege he see routine names, but NOT the
|
||||||
routine body of other routines that are not the creator of!
|
routine body of other routines that are not the creator of!
|
||||||
*/
|
*/
|
||||||
DBUG_PRINT("info",("length of body for %s row[2] '%s' is %d",
|
DBUG_PRINT("info",("length of body for %s row[2] '%s' is %zu",
|
||||||
routine_name, row[2] ? row[2] : "(null)",
|
routine_name, row[2] ? row[2] : "(null)",
|
||||||
row[2] ? (int) strlen(row[2]) : 0));
|
row[2] ? strlen(row[2]) : 0));
|
||||||
if (row[2] == NULL)
|
if (row[2] == NULL)
|
||||||
{
|
{
|
||||||
print_comment(sql_file, 1, "\n-- insufficient privileges to %s\n",
|
print_comment(sql_file, 1, "\n-- insufficient privileges to %s\n",
|
||||||
@ -3918,7 +3919,7 @@ static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
|
|||||||
int i;
|
int i;
|
||||||
char name_buff[NAME_LEN*2+3];
|
char name_buff[NAME_LEN*2+3];
|
||||||
|
|
||||||
mysql_real_escape_string(mysql, name_buff, db, strlen(db));
|
mysql_real_escape_string(mysql, name_buff, db, (ulong)strlen(db));
|
||||||
|
|
||||||
init_dynamic_string_checked(&where, " AND TABLESPACE_NAME IN ("
|
init_dynamic_string_checked(&where, " AND TABLESPACE_NAME IN ("
|
||||||
"SELECT DISTINCT TABLESPACE_NAME FROM"
|
"SELECT DISTINCT TABLESPACE_NAME FROM"
|
||||||
@ -3931,7 +3932,7 @@ static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
|
|||||||
for (i=0 ; i<tables ; i++)
|
for (i=0 ; i<tables ; i++)
|
||||||
{
|
{
|
||||||
mysql_real_escape_string(mysql, name_buff,
|
mysql_real_escape_string(mysql, name_buff,
|
||||||
table_names[i], strlen(table_names[i]));
|
table_names[i], (ulong)strlen(table_names[i]));
|
||||||
|
|
||||||
dynstr_append_checked(&where, "'");
|
dynstr_append_checked(&where, "'");
|
||||||
dynstr_append_checked(&where, name_buff);
|
dynstr_append_checked(&where, name_buff);
|
||||||
@ -3962,7 +3963,7 @@ static int dump_tablespaces_for_databases(char** databases)
|
|||||||
{
|
{
|
||||||
char db_name_buff[NAME_LEN*2+3];
|
char db_name_buff[NAME_LEN*2+3];
|
||||||
mysql_real_escape_string(mysql, db_name_buff,
|
mysql_real_escape_string(mysql, db_name_buff,
|
||||||
databases[i], strlen(databases[i]));
|
databases[i], (ulong)strlen(databases[i]));
|
||||||
dynstr_append_checked(&where, "'");
|
dynstr_append_checked(&where, "'");
|
||||||
dynstr_append_checked(&where, db_name_buff);
|
dynstr_append_checked(&where, db_name_buff);
|
||||||
dynstr_append_checked(&where, "',");
|
dynstr_append_checked(&where, "',");
|
||||||
@ -5003,7 +5004,7 @@ static int start_transaction(MYSQL *mysql_con)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
static ulong find_set(TYPELIB *lib, const char *x, size_t length,
|
||||||
char **err_pos, uint *err_len)
|
char **err_pos, uint *err_len)
|
||||||
{
|
{
|
||||||
const char *end= x + length;
|
const char *end= x + length;
|
||||||
@ -5061,7 +5062,7 @@ static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
|
|||||||
fputc(' ',file);
|
fputc(' ',file);
|
||||||
fputs(prefix, file);
|
fputs(prefix, file);
|
||||||
if (string_value)
|
if (string_value)
|
||||||
unescape(file,row[0],(uint) strlen(row[0]));
|
unescape(file,row[0], strlen(row[0]));
|
||||||
else
|
else
|
||||||
fputs(row[0], file);
|
fputs(row[0], file);
|
||||||
check_io(file);
|
check_io(file);
|
||||||
@ -5314,8 +5315,8 @@ static my_bool get_view_structure(char *table, char* db)
|
|||||||
verbose_msg("-- Retrieving view structure for table %s...\n", table);
|
verbose_msg("-- Retrieving view structure for table %s...\n", table);
|
||||||
|
|
||||||
#ifdef NOT_REALLY_USED_YET
|
#ifdef NOT_REALLY_USED_YET
|
||||||
sprintf(insert_pat, "SET SQL_QUOTE_SHOW_CREATE=%d",
|
dynstr_append_checked(&insert_pat, "SET SQL_QUOTE_SHOW_CREATE=");
|
||||||
(opt_quoted || opt_keywords));
|
dynstr_append_checked(&insert_pat, (opt_quoted || opt_keywords)? "1":"0");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
result_table= quote_name(table, table_buff, 1);
|
result_table= quote_name(table, table_buff, 1);
|
||||||
|
@ -51,9 +51,9 @@ static int list_tables(MYSQL *mysql,const char *db,const char *table);
|
|||||||
static int list_table_status(MYSQL *mysql,const char *db,const char *table);
|
static int list_table_status(MYSQL *mysql,const char *db,const char *table);
|
||||||
static int list_fields(MYSQL *mysql,const char *db,const char *table,
|
static int list_fields(MYSQL *mysql,const char *db,const char *table,
|
||||||
const char *field);
|
const char *field);
|
||||||
static void print_header(const char *header,uint head_length,...);
|
static void print_header(const char *header,size_t head_length,...);
|
||||||
static void print_row(const char *header,uint head_length,...);
|
static void print_row(const char *header,size_t head_length,...);
|
||||||
static void print_trailer(uint length,...);
|
static void print_trailer(size_t length,...);
|
||||||
static void print_res_header(MYSQL_RES *result);
|
static void print_res_header(MYSQL_RES *result);
|
||||||
static void print_res_top(MYSQL_RES *result);
|
static void print_res_top(MYSQL_RES *result);
|
||||||
static void print_res_row(MYSQL_RES *result,MYSQL_ROW cur);
|
static void print_res_row(MYSQL_RES *result,MYSQL_ROW cur);
|
||||||
@ -366,7 +366,8 @@ static int
|
|||||||
list_dbs(MYSQL *mysql,const char *wild)
|
list_dbs(MYSQL *mysql,const char *wild)
|
||||||
{
|
{
|
||||||
const char *header;
|
const char *header;
|
||||||
uint length, counter = 0;
|
size_t length = 0;
|
||||||
|
uint counter = 0;
|
||||||
ulong rowcount = 0L;
|
ulong rowcount = 0L;
|
||||||
char tables[NAME_LEN+1], rows[NAME_LEN+1];
|
char tables[NAME_LEN+1], rows[NAME_LEN+1];
|
||||||
char query[NAME_LEN + 100];
|
char query[NAME_LEN + 100];
|
||||||
@ -404,7 +405,7 @@ list_dbs(MYSQL *mysql,const char *wild)
|
|||||||
printf("Wildcard: %s\n",wild);
|
printf("Wildcard: %s\n",wild);
|
||||||
|
|
||||||
header="Databases";
|
header="Databases";
|
||||||
length=(uint) strlen(header);
|
length= strlen(header);
|
||||||
field=mysql_fetch_field(result);
|
field=mysql_fetch_field(result);
|
||||||
if (length < field->max_length)
|
if (length < field->max_length)
|
||||||
length=field->max_length;
|
length=field->max_length;
|
||||||
@ -492,7 +493,8 @@ static int
|
|||||||
list_tables(MYSQL *mysql,const char *db,const char *table)
|
list_tables(MYSQL *mysql,const char *db,const char *table)
|
||||||
{
|
{
|
||||||
const char *header;
|
const char *header;
|
||||||
uint head_length, counter = 0;
|
size_t head_length;
|
||||||
|
uint counter = 0;
|
||||||
char query[NAME_LEN + 100], rows[NAME_LEN], fields[16];
|
char query[NAME_LEN + 100], rows[NAME_LEN], fields[16];
|
||||||
MYSQL_FIELD *field;
|
MYSQL_FIELD *field;
|
||||||
MYSQL_RES *result;
|
MYSQL_RES *result;
|
||||||
@ -529,7 +531,7 @@ list_tables(MYSQL *mysql,const char *db,const char *table)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
|
||||||
header="Tables";
|
header="Tables";
|
||||||
head_length=(uint) strlen(header);
|
head_length= strlen(header);
|
||||||
field=mysql_fetch_field(result);
|
field=mysql_fetch_field(result);
|
||||||
if (head_length < field->max_length)
|
if (head_length < field->max_length)
|
||||||
head_length=field->max_length;
|
head_length=field->max_length;
|
||||||
@ -647,7 +649,7 @@ list_table_status(MYSQL *mysql,const char *db,const char *wild)
|
|||||||
len= sizeof(query);
|
len= sizeof(query);
|
||||||
len-= my_snprintf(query, len, "show table status from `%s`", db);
|
len-= my_snprintf(query, len, "show table status from `%s`", db);
|
||||||
if (wild && wild[0] && len)
|
if (wild && wild[0] && len)
|
||||||
strxnmov(query + strlen(query), len, " like '", wild, "'", NullS);
|
strxnmov(query + strlen(query), len - 1, " like '", wild, "'", NullS);
|
||||||
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
||||||
{
|
{
|
||||||
fprintf(stderr,"%s: Cannot get status for db: %s, table: %s: %s\n",
|
fprintf(stderr,"%s: Cannot get status for db: %s, table: %s: %s\n",
|
||||||
@ -680,7 +682,7 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||||||
const char *wild)
|
const char *wild)
|
||||||
{
|
{
|
||||||
char query[NAME_LEN + 100];
|
char query[NAME_LEN + 100];
|
||||||
int len;
|
size_t len;
|
||||||
MYSQL_RES *result;
|
MYSQL_RES *result;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
ulong UNINIT_VAR(rows);
|
ulong UNINIT_VAR(rows);
|
||||||
@ -710,7 +712,7 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||||||
len-= my_snprintf(query, len, "show /*!32332 FULL */ columns from `%s`",
|
len-= my_snprintf(query, len, "show /*!32332 FULL */ columns from `%s`",
|
||||||
table);
|
table);
|
||||||
if (wild && wild[0] && len)
|
if (wild && wild[0] && len)
|
||||||
strxnmov(query + strlen(query), len, " like '", wild, "'", NullS);
|
strxnmov(query + strlen(query), len - 1, " like '", wild, "'", NullS);
|
||||||
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
||||||
{
|
{
|
||||||
fprintf(stderr,"%s: Cannot list columns in db: %s, table: %s: %s\n",
|
fprintf(stderr,"%s: Cannot list columns in db: %s, table: %s: %s\n",
|
||||||
@ -758,10 +760,10 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_header(const char *header,uint head_length,...)
|
print_header(const char *header,size_t head_length,...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
uint length,i,str_length,pre_space;
|
size_t length,i,str_length,pre_space;
|
||||||
const char *field;
|
const char *field;
|
||||||
|
|
||||||
va_start(args,head_length);
|
va_start(args,head_length);
|
||||||
@ -784,10 +786,10 @@ print_header(const char *header,uint head_length,...)
|
|||||||
putchar('|');
|
putchar('|');
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
str_length=(uint) strlen(field);
|
str_length= strlen(field);
|
||||||
if (str_length > length)
|
if (str_length > length)
|
||||||
str_length=length+1;
|
str_length=length+1;
|
||||||
pre_space=(uint) (((int) length-(int) str_length)/2)+1;
|
pre_space= ((length- str_length)/2)+1;
|
||||||
for (i=0 ; i < pre_space ; i++)
|
for (i=0 ; i < pre_space ; i++)
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
for (i = 0 ; i < str_length ; i++)
|
for (i = 0 ; i < str_length ; i++)
|
||||||
@ -821,11 +823,11 @@ print_header(const char *header,uint head_length,...)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_row(const char *header,uint head_length,...)
|
print_row(const char *header,size_t head_length,...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
const char *field;
|
const char *field;
|
||||||
uint i,length,field_length;
|
size_t i,length,field_length;
|
||||||
|
|
||||||
va_start(args,head_length);
|
va_start(args,head_length);
|
||||||
field=header; length=head_length;
|
field=header; length=head_length;
|
||||||
@ -834,7 +836,7 @@ print_row(const char *header,uint head_length,...)
|
|||||||
putchar('|');
|
putchar('|');
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
fputs(field,stdout);
|
fputs(field,stdout);
|
||||||
field_length=(uint) strlen(field);
|
field_length= strlen(field);
|
||||||
for (i=field_length ; i <= length ; i++)
|
for (i=field_length ; i <= length ; i++)
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
if (!(field=va_arg(args,char *)))
|
if (!(field=va_arg(args,char *)))
|
||||||
@ -848,10 +850,10 @@ print_row(const char *header,uint head_length,...)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_trailer(uint head_length,...)
|
print_trailer(size_t head_length,...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
uint length,i;
|
size_t length,i;
|
||||||
|
|
||||||
va_start(args,head_length);
|
va_start(args,head_length);
|
||||||
length=head_length;
|
length=head_length;
|
||||||
@ -894,7 +896,7 @@ static void print_res_top(MYSQL_RES *result)
|
|||||||
mysql_field_seek(result,0);
|
mysql_field_seek(result,0);
|
||||||
while((field = mysql_fetch_field(result)))
|
while((field = mysql_fetch_field(result)))
|
||||||
{
|
{
|
||||||
if ((length=(uint) strlen(field->name)) > field->max_length)
|
if ((length= strlen(field->name)) > field->max_length)
|
||||||
field->max_length=length;
|
field->max_length=length;
|
||||||
else
|
else
|
||||||
length=field->max_length;
|
length=field->max_length;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (C) 2000-2007 MySQL AB
|
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
Use is subject to license terms
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -28,3 +28,18 @@ ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`
|
|||||||
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
||||||
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
DROP TABLE t2, t1;
|
DROP TABLE t2, t1;
|
||||||
|
#
|
||||||
|
# BUG#22037930: INSERT IGNORE FAILS TO IGNORE FOREIGN
|
||||||
|
# KEY CONSTRAINT
|
||||||
|
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE= INNODB;
|
||||||
|
CREATE TABLE t2 (fld1 VARCHAR(10), fld2 INT NOT NULL,
|
||||||
|
CONSTRAINT fk FOREIGN KEY (fld2) REFERENCES t1(fld1)) ENGINE= INNODB;
|
||||||
|
# Without patch, reports incorrect error.
|
||||||
|
INSERT INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||||
|
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
|
REPLACE INTO t2 VALUES('abc', 2);
|
||||||
|
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
|
INSERT IGNORE INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||||
|
Warnings:
|
||||||
|
Warning 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
24
mysql-test/r/ssl_ca.result
Normal file
24
mysql-test/r/ssl_ca.result
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#
|
||||||
|
# Bug#21920657: SSL-CA FAILS SILENTLY IF THE PATH CANNOT BE FOUND
|
||||||
|
#
|
||||||
|
# try to connect with wrong '--ssl-ca' path : should fail
|
||||||
|
ERROR 2026 (HY000): SSL connection error: SSL_CTX_set_default_verify_paths failed
|
||||||
|
# try to connect with correct '--ssl-ca' path : should connect
|
||||||
|
Variable_name Value
|
||||||
|
Ssl_cipher DHE-RSA-AES256-SHA
|
||||||
|
#
|
||||||
|
# Bug#21920678: SSL-CA DOES NOT ACCEPT ~USER TILDE HOME DIRECTORY
|
||||||
|
# PATH SUBSTITUTION
|
||||||
|
#
|
||||||
|
# try to connect with '--ssl-ca' option using tilde home directoy
|
||||||
|
# path substitution : should connect
|
||||||
|
Variable_name Value
|
||||||
|
Ssl_cipher DHE-RSA-AES256-SHA
|
||||||
|
# try to connect with '--ssl-key' option using tilde home directoy
|
||||||
|
# path substitution : should connect
|
||||||
|
Variable_name Value
|
||||||
|
Ssl_cipher DHE-RSA-AES256-SHA
|
||||||
|
# try to connect with '--ssl-cert' option using tilde home directoy
|
||||||
|
# path substitution : should connect
|
||||||
|
Variable_name Value
|
||||||
|
Ssl_cipher DHE-RSA-AES256-SHA
|
@ -41,3 +41,24 @@ UPDATE t1, t2 SET t2.fld2= t2.fld2 + 3;
|
|||||||
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
||||||
|
|
||||||
DROP TABLE t2, t1;
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#22037930: INSERT IGNORE FAILS TO IGNORE FOREIGN
|
||||||
|
--echo # KEY CONSTRAINT
|
||||||
|
|
||||||
|
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE= INNODB;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (fld1 VARCHAR(10), fld2 INT NOT NULL,
|
||||||
|
CONSTRAINT fk FOREIGN KEY (fld2) REFERENCES t1(fld1)) ENGINE= INNODB;
|
||||||
|
|
||||||
|
--echo # Without patch, reports incorrect error.
|
||||||
|
--error ER_NO_REFERENCED_ROW_2
|
||||||
|
INSERT INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||||
|
--error ER_NO_REFERENCED_ROW_2
|
||||||
|
REPLACE INTO t2 VALUES('abc', 2);
|
||||||
|
|
||||||
|
--enable_warnings
|
||||||
|
INSERT IGNORE INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||||
|
--disable_warnings
|
||||||
|
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
35
mysql-test/t/ssl_ca.test
Normal file
35
mysql-test/t/ssl_ca.test
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
--source include/have_ssl.inc
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#21920657: SSL-CA FAILS SILENTLY IF THE PATH CANNOT BE FOUND
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo # try to connect with wrong '--ssl-ca' path : should fail
|
||||||
|
--error 1
|
||||||
|
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/wrong-cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'" 2>&1
|
||||||
|
|
||||||
|
--echo # try to connect with correct '--ssl-ca' path : should connect
|
||||||
|
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#21920678: SSL-CA DOES NOT ACCEPT ~USER TILDE HOME DIRECTORY
|
||||||
|
--echo # PATH SUBSTITUTION
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--let $mysql_test_dir_path= `SELECT REPLACE('$MYSQL_TEST_DIR', '$HOME', '~')`
|
||||||
|
|
||||||
|
--echo # try to connect with '--ssl-ca' option using tilde home directoy
|
||||||
|
--echo # path substitution : should connect
|
||||||
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||||
|
--exec $MYSQL --ssl-ca=$mysql_test_dir_path/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||||
|
|
||||||
|
--echo # try to connect with '--ssl-key' option using tilde home directoy
|
||||||
|
--echo # path substitution : should connect
|
||||||
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||||
|
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$mysql_test_dir_path/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||||
|
|
||||||
|
--echo # try to connect with '--ssl-cert' option using tilde home directoy
|
||||||
|
--echo # path substitution : should connect
|
||||||
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||||
|
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$mysql_test_dir_path/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2000, 2013, Oracle and/or its affiliates
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2010, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -163,6 +163,10 @@ char *argv[];
|
|||||||
}
|
}
|
||||||
else if (argc > 3)
|
else if (argc > 3)
|
||||||
for (n = atoi(argv[3]); n > 0; n--) {
|
for (n = atoi(argv[3]); n > 0; n--) {
|
||||||
|
if(sizeof(buf)-1 < strlen(argv[1]))
|
||||||
|
{
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
(void) strcpy(buf, argv[1]);
|
(void) strcpy(buf, argv[1]);
|
||||||
(void) split(buf, fields, MNF, argv[2]);
|
(void) split(buf, fields, MNF, argv[2]);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||||
# MA 02110-1301, USA
|
# MA 02110-1301, USA
|
||||||
|
|
||||||
# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU Library General Public
|
# modify it under the terms of the GNU Library General Public
|
||||||
@ -621,7 +621,11 @@ sub my_which
|
|||||||
my ($command) = @_;
|
my ($command) = @_;
|
||||||
my (@paths, $path);
|
my (@paths, $path);
|
||||||
|
|
||||||
return $command if (-f $command && -x $command);
|
# If the argument is not 'my_print_defaults' then it would be of the format
|
||||||
|
# <absolute_path>/<program>
|
||||||
|
return $command if ($command ne 'my_print_defaults' && -f $command &&
|
||||||
|
-x $command);
|
||||||
|
|
||||||
@paths = split(':', $ENV{'PATH'});
|
@paths = split(':', $ENV{'PATH'});
|
||||||
foreach $path (@paths)
|
foreach $path (@paths)
|
||||||
{
|
{
|
||||||
|
@ -1197,6 +1197,20 @@ static int add_init_command(struct st_mysql_options *options, const char *cmd)
|
|||||||
my_free((OPTS)->extension->X); \
|
my_free((OPTS)->extension->X); \
|
||||||
EXTENSION_SET(OPTS, X, my_strdup((STR), MYF(MY_WME)));
|
EXTENSION_SET(OPTS, X, my_strdup((STR), MYF(MY_WME)));
|
||||||
|
|
||||||
|
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
|
||||||
|
static char *set_ssl_option_unpack_path(const char *arg)
|
||||||
|
{
|
||||||
|
char *opt_var= NULL;
|
||||||
|
if (arg)
|
||||||
|
{
|
||||||
|
char buff[FN_REFLEN + 1];
|
||||||
|
unpack_filename(buff, (char *)arg);
|
||||||
|
opt_var= my_strdup(buff, MYF(MY_WME));
|
||||||
|
}
|
||||||
|
return opt_var;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
|
||||||
|
|
||||||
void mysql_read_default_options(struct st_mysql_options *options,
|
void mysql_read_default_options(struct st_mysql_options *options,
|
||||||
const char *filename,const char *group)
|
const char *filename,const char *group)
|
||||||
{
|
{
|
||||||
@ -1796,10 +1810,10 @@ mysql_ssl_set(MYSQL *mysql __attribute__((unused)) ,
|
|||||||
my_free(mysql->options.ssl_ca);
|
my_free(mysql->options.ssl_ca);
|
||||||
my_free(mysql->options.ssl_capath);
|
my_free(mysql->options.ssl_capath);
|
||||||
my_free(mysql->options.ssl_cipher);
|
my_free(mysql->options.ssl_cipher);
|
||||||
mysql->options.ssl_key= strdup_if_not_null(key);
|
mysql->options.ssl_key= set_ssl_option_unpack_path(key);
|
||||||
mysql->options.ssl_cert= strdup_if_not_null(cert);
|
mysql->options.ssl_cert= set_ssl_option_unpack_path(cert);
|
||||||
mysql->options.ssl_ca= strdup_if_not_null(ca);
|
mysql->options.ssl_ca= set_ssl_option_unpack_path(ca);
|
||||||
mysql->options.ssl_capath= strdup_if_not_null(capath);
|
mysql->options.ssl_capath= set_ssl_option_unpack_path(capath);
|
||||||
mysql->options.ssl_cipher= strdup_if_not_null(cipher);
|
mysql->options.ssl_cipher= strdup_if_not_null(cipher);
|
||||||
mysql->options.use_ssl= TRUE;
|
mysql->options.use_ssl= TRUE;
|
||||||
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
|
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
|
||||||
|
13
sql/item.cc
13
sql/item.cc
@ -244,9 +244,6 @@ bool Item::val_bool()
|
|||||||
*/
|
*/
|
||||||
String *Item::val_str_ascii(String *str)
|
String *Item::val_str_ascii(String *str)
|
||||||
{
|
{
|
||||||
if (!(collation.collation->state & MY_CS_NONASCII))
|
|
||||||
return val_str(str);
|
|
||||||
|
|
||||||
DBUG_ASSERT(str != &str_value);
|
DBUG_ASSERT(str != &str_value);
|
||||||
|
|
||||||
uint errors;
|
uint errors;
|
||||||
@ -254,10 +251,14 @@ String *Item::val_str_ascii(String *str)
|
|||||||
if (!res)
|
if (!res)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((null_value= str->copy(res->ptr(), res->length(),
|
if (!(res->charset()->state & MY_CS_NONASCII))
|
||||||
collation.collation, &my_charset_latin1,
|
str= res;
|
||||||
&errors)))
|
else
|
||||||
|
{
|
||||||
|
if ((null_value= str->copy(res->ptr(), res->length(), collation.collation,
|
||||||
|
&my_charset_latin1, &errors)))
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/*
|
/* Copyright (c) 2003, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2003-2007 MySQL AB, 2009, 2010 Sun Microsystems, Inc.
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
Use is subject to license terms.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2016, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2005, 2012, Oracle and/or its affiliates.
|
/* Copyright (c) 2005, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2012, Monty Program Ab
|
Copyright (c) 2009, 2016, Monty Program Ab
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2016, MariaDB
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
@ -8424,9 +8424,6 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
|||||||
/*
|
/*
|
||||||
When the open and locking succeeded, we check all tables to
|
When the open and locking succeeded, we check all tables to
|
||||||
ensure that they still have the correct type.
|
ensure that they still have the correct type.
|
||||||
|
|
||||||
We can use a down cast here since we know that every table added
|
|
||||||
to the tables_to_lock is a RPL_TABLE_LIST.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -8445,10 +8442,37 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
|||||||
NOTE: The base tables are added here are removed when
|
NOTE: The base tables are added here are removed when
|
||||||
close_thread_tables is called.
|
close_thread_tables is called.
|
||||||
*/
|
*/
|
||||||
RPL_TABLE_LIST *ptr= rli->tables_to_lock;
|
TABLE_LIST *table_list_ptr= rli->tables_to_lock;
|
||||||
for (uint i= 0 ; ptr && (i < rli->tables_to_lock_count);
|
for (uint i=0 ; table_list_ptr && (i < rli->tables_to_lock_count);
|
||||||
ptr= static_cast<RPL_TABLE_LIST*>(ptr->next_global), i++)
|
table_list_ptr= table_list_ptr->next_global, i++)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Below if condition takes care of skipping base tables that
|
||||||
|
make up the MERGE table (which are added by open_tables()
|
||||||
|
call). They are added next to the merge table in the list.
|
||||||
|
For eg: If RPL_TABLE_LIST is t3->t1->t2 (where t1 and t2
|
||||||
|
are base tables for merge table 't3'), open_tables will modify
|
||||||
|
the list by adding t1 and t2 again immediately after t3 in the
|
||||||
|
list (*not at the end of the list*). New table_to_lock list will
|
||||||
|
look like t3->t1'->t2'->t1->t2 (where t1' and t2' are TABLE_LIST
|
||||||
|
objects added by open_tables() call). There is no flag(or logic) in
|
||||||
|
open_tables() that can skip adding these base tables to the list.
|
||||||
|
So the logic here should take care of skipping them.
|
||||||
|
|
||||||
|
tables_to_lock_count logic will take care of skipping base tables
|
||||||
|
that are added at the end of the list.
|
||||||
|
For eg: If RPL_TABLE_LIST is t1->t2->t3, open_tables will modify
|
||||||
|
the list into t1->t2->t3->t1'->t2'. t1' and t2' will be skipped
|
||||||
|
because tables_to_lock_count logic in this for loop.
|
||||||
|
*/
|
||||||
|
if (table_list_ptr->parent_l)
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
We can use a down cast here since we know that every table added
|
||||||
|
to the tables_to_lock is a RPL_TABLE_LIST (or child table which is
|
||||||
|
skipped above).
|
||||||
|
*/
|
||||||
|
RPL_TABLE_LIST *ptr= static_cast<RPL_TABLE_LIST*>(table_list_ptr);
|
||||||
DBUG_ASSERT(ptr->m_tabledef_valid);
|
DBUG_ASSERT(ptr->m_tabledef_valid);
|
||||||
TABLE *conv_table;
|
TABLE *conv_table;
|
||||||
if (!ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
if (!ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
||||||
@ -8489,7 +8513,15 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
|||||||
*/
|
*/
|
||||||
TABLE_LIST *ptr= rli->tables_to_lock;
|
TABLE_LIST *ptr= rli->tables_to_lock;
|
||||||
for (uint i=0 ; ptr && (i < rli->tables_to_lock_count); ptr= ptr->next_global, i++)
|
for (uint i=0 ; ptr && (i < rli->tables_to_lock_count); ptr= ptr->next_global, i++)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Please see comment in above 'for' loop to know the reason
|
||||||
|
for this if condition
|
||||||
|
*/
|
||||||
|
if (ptr->parent_l)
|
||||||
|
continue;
|
||||||
const_cast<Relay_log_info*>(rli)->m_table_map.set_table(ptr->table_id, ptr->table);
|
const_cast<Relay_log_info*>(rli)->m_table_map.set_table(ptr->table_id, ptr->table);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_QUERY_CACHE
|
#ifdef HAVE_QUERY_CACHE
|
||||||
query_cache.invalidate_locked_for_write(thd, rli->tables_to_lock);
|
query_cache.invalidate_locked_for_write(thd, rli->tables_to_lock);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (c) 2007, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -119,16 +119,25 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
|||||||
/*
|
/*
|
||||||
When the open and locking succeeded, we check all tables to
|
When the open and locking succeeded, we check all tables to
|
||||||
ensure that they still have the correct type.
|
ensure that they still have the correct type.
|
||||||
|
|
||||||
We can use a down cast here since we know that every table added
|
|
||||||
to the tables_to_lock is a RPL_TABLE_LIST.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
RPL_TABLE_LIST *ptr= rli->tables_to_lock;
|
TABLE_LIST *table_list_ptr= rli->tables_to_lock;
|
||||||
for (uint i= 0 ; ptr&& (i< rli->tables_to_lock_count);
|
for (uint i=0 ; table_list_ptr&& (i< rli->tables_to_lock_count);
|
||||||
ptr= static_cast<RPL_TABLE_LIST*>(ptr->next_global), i++)
|
table_list_ptr= table_list_ptr->next_global, i++)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Please see comment in log_event.cc-Rows_log_event::do_apply_event()
|
||||||
|
function for the explanation of the below if condition
|
||||||
|
*/
|
||||||
|
if (table_list_ptr->parent_l)
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
We can use a down cast here since we know that every table added
|
||||||
|
to the tables_to_lock is a RPL_TABLE_LIST(or child table which is
|
||||||
|
skipped above).
|
||||||
|
*/
|
||||||
|
RPL_TABLE_LIST *ptr=static_cast<RPL_TABLE_LIST*>(table_list_ptr);
|
||||||
DBUG_ASSERT(ptr->m_tabledef_valid);
|
DBUG_ASSERT(ptr->m_tabledef_valid);
|
||||||
TABLE *conv_table;
|
TABLE *conv_table;
|
||||||
if (!ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
if (!ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
||||||
@ -162,7 +171,15 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
|
|||||||
*/
|
*/
|
||||||
TABLE_LIST *ptr= rli->tables_to_lock;
|
TABLE_LIST *ptr= rli->tables_to_lock;
|
||||||
for (uint i=0; ptr && (i < rli->tables_to_lock_count); ptr= ptr->next_global, i++)
|
for (uint i=0; ptr && (i < rli->tables_to_lock_count); ptr= ptr->next_global, i++)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Please see comment in log_event.cc-Rows_log_event::do_apply_event()
|
||||||
|
function for the explanation of the below if condition
|
||||||
|
*/
|
||||||
|
if (ptr->parent_l)
|
||||||
|
continue;
|
||||||
const_cast<Relay_log_info*>(rli)->m_table_map.set_table(ptr->table_id, ptr->table);
|
const_cast<Relay_log_info*>(rli)->m_table_map.set_table(ptr->table_id, ptr->table);
|
||||||
|
}
|
||||||
#ifdef HAVE_QUERY_CACHE
|
#ifdef HAVE_QUERY_CACHE
|
||||||
query_cache.invalidate_locked_for_write(thd, rli->tables_to_lock);
|
query_cache.invalidate_locked_for_write(thd, rli->tables_to_lock);
|
||||||
#endif
|
#endif
|
||||||
@ -1545,16 +1562,25 @@ int Old_rows_log_event::do_apply_event(Relay_log_info const *rli)
|
|||||||
/*
|
/*
|
||||||
When the open and locking succeeded, we check all tables to
|
When the open and locking succeeded, we check all tables to
|
||||||
ensure that they still have the correct type.
|
ensure that they still have the correct type.
|
||||||
|
|
||||||
We can use a down cast here since we know that every table added
|
|
||||||
to the tables_to_lock is a RPL_TABLE_LIST.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
RPL_TABLE_LIST *ptr= rli->tables_to_lock;
|
TABLE_LIST *table_list_ptr= rli->tables_to_lock;
|
||||||
for (uint i= 0 ; ptr&& (i< rli->tables_to_lock_count);
|
for (uint i=0; table_list_ptr&& (i< rli->tables_to_lock_count);
|
||||||
ptr= static_cast<RPL_TABLE_LIST*>(ptr->next_global), i++)
|
table_list_ptr= static_cast<RPL_TABLE_LIST*>(table_list_ptr->next_global), i++)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Please see comment in log_event.cc-Rows_log_event::do_apply_event()
|
||||||
|
function for the explanation of the below if condition
|
||||||
|
*/
|
||||||
|
if (table_list_ptr->parent_l)
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
We can use a down cast here since we know that every table added
|
||||||
|
to the tables_to_lock is a RPL_TABLE_LIST (or child table which is
|
||||||
|
skipped above).
|
||||||
|
*/
|
||||||
|
RPL_TABLE_LIST *ptr=static_cast<RPL_TABLE_LIST*>(table_list_ptr);
|
||||||
TABLE *conv_table;
|
TABLE *conv_table;
|
||||||
if (ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
if (ptr->m_tabledef.compatible_with(thd, const_cast<Relay_log_info*>(rli),
|
||||||
ptr->table, &conv_table))
|
ptr->table, &conv_table))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008, 2015, SkySQL Ab.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2000, 2010, Oracle and/or its affiliates.
|
Copyright (c) 2009, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2002, 2013, Oracle and/or its affiliates.
|
Copyright (c) 2002, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2011, 2013, Monty Program Ab
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -480,8 +480,10 @@ sp_name::init_qname(THD *thd)
|
|||||||
bool
|
bool
|
||||||
check_routine_name(LEX_STRING *ident)
|
check_routine_name(LEX_STRING *ident)
|
||||||
{
|
{
|
||||||
if (!ident || !ident->str || !ident->str[0] ||
|
DBUG_ASSERT(ident);
|
||||||
ident->str[ident->length-1] == ' ')
|
DBUG_ASSERT(ident->str);
|
||||||
|
|
||||||
|
if (!ident->str[0] || ident->str[ident->length-1] == ' ')
|
||||||
{
|
{
|
||||||
my_error(ER_SP_WRONG_NAME, MYF(0), ident->str);
|
my_error(ER_SP_WRONG_NAME, MYF(0), ident->str);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2010, 2016, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2011, 2015, MariaDB
|
Copyright (c) 2011, 2016, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -236,7 +236,7 @@ new_VioSSLFd(const char *key_file, const char *cert_file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load certs from the trusted ca */
|
/* Load certs from the trusted ca */
|
||||||
if (SSL_CTX_load_verify_locations(ssl_fd->ssl_context, ca_file, ca_path) == 0)
|
if (SSL_CTX_load_verify_locations(ssl_fd->ssl_context, ca_file, ca_path) <= 0)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("warning", ("SSL_CTX_load_verify_locations failed"));
|
DBUG_PRINT("warning", ("SSL_CTX_load_verify_locations failed"));
|
||||||
if (ca_file || ca_path)
|
if (ca_file || ca_path)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user