mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
BUG#20839 Illegal error code: 155 returned downgrading from 5.1.12-> 5.1.11
post-review fixes. Magnus suggested use of DYNAMIC_STRING instead of futzing with c strings. also making usage of TABLEs clearer in store_schema_partitions_record.
This commit is contained in:
@@ -2759,86 +2759,66 @@ static int dump_all_tablespaces()
|
||||
|
||||
static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
|
||||
{
|
||||
char *where;
|
||||
DYNAMIC_STRING where;
|
||||
int r;
|
||||
int i;
|
||||
|
||||
size_t sz= 200+tables*(NAME_LEN*2+3);
|
||||
where= my_malloc(sz, MYF(MY_WME));
|
||||
|
||||
if (!where)
|
||||
return 1;
|
||||
|
||||
char name_buff[NAME_LEN*2+3];
|
||||
|
||||
mysql_real_escape_string(mysql, name_buff, db, strlen(db));
|
||||
|
||||
snprintf(where,sz-1,
|
||||
" AND TABLESPACE_NAME IN ("
|
||||
init_dynamic_string(&where, " AND TABLESPACE_NAME IN ("
|
||||
"SELECT DISTINCT TABLESPACE_NAME FROM"
|
||||
" INFORMATION_SCHEMA.PARTITIONS"
|
||||
" WHERE"
|
||||
" TABLE_SCHEMA='%s'"
|
||||
" AND TABLE_NAME IN (", name_buff);
|
||||
" TABLE_SCHEMA='", 256, 1024);
|
||||
dynstr_append(&where, name_buff);
|
||||
dynstr_append(&where, "' AND TABLE_NAME IN (");
|
||||
|
||||
for (i=0 ; i<tables ; i++)
|
||||
{
|
||||
mysql_real_escape_string(mysql, name_buff,
|
||||
table_names[i], strlen(table_names[i]));
|
||||
strncat(where,"'",sz-3);
|
||||
strncat(where,name_buff,sz-3);
|
||||
strncat(where,"'",sz-3);
|
||||
strncat(where,",",sz-3);
|
||||
|
||||
dynstr_append(&where, "'");
|
||||
dynstr_append(&where, name_buff);
|
||||
dynstr_append(&where, "',");
|
||||
}
|
||||
sz= strlen(where);
|
||||
where[sz-1]= ')';
|
||||
where[sz]= ')';
|
||||
where[sz+1]= '\0';
|
||||
where.str[--where.length]= '\0';
|
||||
dynstr_append(&where,"))");
|
||||
|
||||
DBUG_PRINT("info",("Dump TS for Tables where: %s",where));
|
||||
r= dump_tablespaces(where);
|
||||
my_free(where, MYF(0));
|
||||
r= dump_tablespaces(where.str);
|
||||
dynstr_free(&where);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int dump_tablespaces_for_databases(char** databases)
|
||||
{
|
||||
char *where;
|
||||
DYNAMIC_STRING where;
|
||||
int r;
|
||||
int i;
|
||||
|
||||
size_t sz= 150;
|
||||
for (i=0 ; databases[i]!=NULL ; i++)
|
||||
sz+=(strlen(databases[i])*2)+3+1;
|
||||
|
||||
where= my_malloc(sz, MYF(MY_WME));
|
||||
if(!where)
|
||||
return 1;
|
||||
|
||||
strncpy(where,
|
||||
" AND TABLESPACE_NAME IN ("
|
||||
init_dynamic_string(&where, " AND TABLESPACE_NAME IN ("
|
||||
"SELECT DISTINCT TABLESPACE_NAME FROM"
|
||||
" INFORMATION_SCHEMA.PARTITIONS"
|
||||
" WHERE"
|
||||
" TABLE_SCHEMA IN (", sz-1);
|
||||
" TABLE_SCHEMA IN (", 256, 1024);
|
||||
|
||||
for (i=0 ; databases[i]!=NULL ; i++)
|
||||
{
|
||||
char db_name_buff[NAME_LEN*2+3];
|
||||
mysql_real_escape_string(mysql, db_name_buff,
|
||||
databases[i], strlen(databases[i]));
|
||||
strncat(where,"'",sz-3);
|
||||
strncat(where,db_name_buff,sz-3);
|
||||
strncat(where,"'",sz-3);
|
||||
strncat(where,",",sz-3);
|
||||
dynstr_append(&where, "'");
|
||||
dynstr_append(&where, db_name_buff);
|
||||
dynstr_append(&where, "',");
|
||||
}
|
||||
sz= strlen(where);
|
||||
where[sz-1]= ')';
|
||||
where[sz]= ')';
|
||||
where[sz+1]= '\0';
|
||||
where.str[--where.length]='\0';
|
||||
dynstr_append(&where,"))");
|
||||
|
||||
DBUG_PRINT("info",("Dump TS for DBs where: %s",where));
|
||||
r= dump_tablespaces(where);
|
||||
my_free(where, MYF(0));
|
||||
r= dump_tablespaces(where.str);
|
||||
dynstr_free(&where);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -2847,7 +2827,7 @@ static int dump_tablespaces(char* ts_where)
|
||||
MYSQL_ROW row;
|
||||
MYSQL_RES *tableres;
|
||||
char buf[FN_REFLEN];
|
||||
char sqlbuf[1024];
|
||||
DYNAMIC_STRING sqlbuf;
|
||||
int first;
|
||||
/*
|
||||
The following are used for parsing the EXTRA field
|
||||
@@ -2856,7 +2836,7 @@ static int dump_tablespaces(char* ts_where)
|
||||
char *ubs;
|
||||
char *endsemi;
|
||||
|
||||
snprintf(sqlbuf,sizeof(sqlbuf),"%s%s%s%s%s",
|
||||
init_dynamic_string(&sqlbuf,
|
||||
"SELECT LOGFILE_GROUP_NAME,"
|
||||
" FILE_NAME,"
|
||||
" TOTAL_EXTENTS,"
|
||||
@@ -2866,18 +2846,24 @@ static int dump_tablespaces(char* ts_where)
|
||||
" FROM INFORMATION_SCHEMA.FILES"
|
||||
" WHERE FILE_TYPE = 'UNDO LOG'"
|
||||
" AND FILE_NAME IS NOT NULL",
|
||||
(ts_where)?
|
||||
256, 1024);
|
||||
if(ts_where)
|
||||
{
|
||||
dynstr_append(&sqlbuf,
|
||||
" AND LOGFILE_GROUP_NAME IN ("
|
||||
"SELECT DISTINCT LOGFILE_GROUP_NAME"
|
||||
" FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE'"
|
||||
:"",
|
||||
(ts_where)?ts_where:"",
|
||||
(ts_where)?")":"",
|
||||
" FROM INFORMATION_SCHEMA.FILES"
|
||||
" WHERE FILE_TYPE = 'DATAFILE'"
|
||||
);
|
||||
dynstr_append(&sqlbuf, ts_where);
|
||||
dynstr_append(&sqlbuf, ")");
|
||||
}
|
||||
dynstr_append(&sqlbuf,
|
||||
" GROUP BY LOGFILE_GROUP_NAME, FILE_NAME"
|
||||
", ENGINE"
|
||||
" ORDER BY LOGFILE_GROUP_NAME");
|
||||
|
||||
if (mysql_query(mysql, sqlbuf) ||
|
||||
if (mysql_query(mysql, sqlbuf.str) ||
|
||||
!(tableres = mysql_store_result(mysql)))
|
||||
{
|
||||
if (mysql_errno(mysql) == ER_BAD_TABLE_ERROR ||
|
||||
@@ -2944,8 +2930,8 @@ static int dump_tablespaces(char* ts_where)
|
||||
strxmov(buf, row[0], NullS);
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(sqlbuf,sizeof(sqlbuf),"%s%s%s",
|
||||
dynstr_free(&sqlbuf);
|
||||
init_dynamic_string(&sqlbuf,
|
||||
"SELECT DISTINCT TABLESPACE_NAME,"
|
||||
" FILE_NAME,"
|
||||
" LOGFILE_GROUP_NAME,"
|
||||
@@ -2954,10 +2940,14 @@ static int dump_tablespaces(char* ts_where)
|
||||
" ENGINE"
|
||||
" FROM INFORMATION_SCHEMA.FILES"
|
||||
" WHERE FILE_TYPE = 'DATAFILE'",
|
||||
(ts_where)?ts_where:"",
|
||||
" ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME");
|
||||
256, 1024);
|
||||
|
||||
if (mysql_query_with_error_report(mysql, &tableres,sqlbuf))
|
||||
if(ts_where)
|
||||
dynstr_append(&sqlbuf, ts_where);
|
||||
|
||||
dynstr_append(&sqlbuf, " ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME");
|
||||
|
||||
if (mysql_query_with_error_report(mysql, &tableres, sqlbuf.str))
|
||||
return 1;
|
||||
|
||||
buf[0]= 0;
|
||||
@@ -3003,6 +2993,8 @@ static int dump_tablespaces(char* ts_where)
|
||||
strxmov(buf, row[0], NullS);
|
||||
}
|
||||
}
|
||||
|
||||
dynstr_free(&sqlbuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -3888,11 +3888,12 @@ static void collect_partition_expr(List<char> &field_list, String *str)
|
||||
}
|
||||
|
||||
|
||||
static void store_schema_partitions_record(THD *thd, TABLE *table,
|
||||
TABLE *show_table,
|
||||
static void store_schema_partitions_record(THD *thd, TABLE *schema_table,
|
||||
TABLE *showing_table,
|
||||
partition_element *part_elem,
|
||||
handler *file, uint part_id)
|
||||
{
|
||||
TABLE* table= schema_table;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
PARTITION_INFO stat_info;
|
||||
TIME time;
|
||||
@@ -3950,8 +3951,7 @@ static void store_schema_partitions_record(THD *thd, TABLE *table,
|
||||
strlen(part_elem->tablespace_name), cs);
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info",("FOO"));
|
||||
char *ts= show_table->file->get_tablespace_name(thd);
|
||||
char *ts= showing_table->file->get_tablespace_name(thd);
|
||||
if(ts)
|
||||
table->field[24]->store(ts, strlen(ts), cs);
|
||||
else
|
||||
|
Reference in New Issue
Block a user