29
29
#include "buf0buf.h" /* for buf_pool and PAGE_ZIP_MIN_SIZE */
30
30
#include "ha_prototypes.h" /* for innobase_convert_name() */
31
31
#include "srv0start.h" /* for srv_was_started */
32
#include "btr0pcur.h" /* for file sys_tables related info. */
33
#include "btr0types.h"
34
#include "dict0load.h" /* for file sys_tables related info. */
36
#include "dict0types.h"
38
33
#include "handler0vars.h"
40
35
using namespace drizzled;
42
InnodbSysTablesTool::InnodbSysTablesTool() :
43
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_TABLES")
45
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
46
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
47
add_field("FLAG", plugin::TableFunction::NUMBER, 0, false);
48
add_field("N_COLS", plugin::TableFunction::NUMBER, 0, false);
49
add_field("SPACE", plugin::TableFunction::NUMBER, 0, false);
52
InnodbSysTablesTool::Generator::Generator(Field **arg) :
53
plugin::TableFunction::Generator(arg)
58
bool InnodbSysTablesTool::Generator::populate()
62
heap = mem_heap_create(1000);
63
mutex_enter(&(dict_sys->mutex));
66
rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
70
/* Get the next record */
71
mutex_enter(&dict_sys->mutex);
73
rec = dict_getnext_system(&pcur, &mtr);
79
mutex_exit(&dict_sys->mutex);
85
dict_table_t* table_rec;
87
/* Create and populate a dict_table_t structure with
88
information from SYS_TABLES row */
89
err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
90
DICT_TABLE_LOAD_FROM_RECORD);
93
mutex_exit(&dict_sys->mutex);
97
push(table_rec->name);
98
push(static_cast<uint64_t>(table_rec->flags));
99
push(static_cast<uint64_t>(table_rec->n_cols));
100
push(static_cast<uint64_t>(table_rec->space));
102
/* push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
103
ER_CANT_FIND_SYSTEM_REC,
107
/* Since dict_process_sys_tables_rec() is called with
108
DICT_TABLE_LOAD_FROM_RECORD, the table_rec is created in
109
dict_process_sys_tables_rec(), we will need to free it */
111
dict_mem_table_free(table_rec);
114
mem_heap_empty(heap);
119
InnodbSysTableStatsTool::InnodbSysTableStatsTool() :
120
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_TABLESTATS")
122
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
123
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
124
add_field("STATS_INITIALIZED", plugin::TableFunction::STRING, NAME_LEN + 1, false);
125
add_field("NUM_ROWS", plugin::TableFunction::NUMBER, 0, false);
126
add_field("CLUST_INDEX_SIZE", plugin::TableFunction::NUMBER, 0, false);
127
add_field("OTHER_INDEX_SIZE", plugin::TableFunction::NUMBER, 0, false);
128
add_field("MODIFIED_COUNTER", plugin::TableFunction::NUMBER, 0, false);
129
add_field("AUTOINC", plugin::TableFunction::NUMBER, 0, false);
130
add_field("HANDLES_OPENED", plugin::TableFunction::NUMBER, 0, false);
133
InnodbSysTableStatsTool::Generator::Generator(Field **arg) :
134
plugin::TableFunction::Generator(arg)
139
bool InnodbSysTableStatsTool::Generator::populate()
143
heap = mem_heap_create(1000);
144
mutex_enter(&dict_sys->mutex);
146
rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
150
/* Get the next record */
151
mutex_enter(&dict_sys->mutex);
153
rec = dict_getnext_system(&pcur, &mtr);
159
mutex_exit(&dict_sys->mutex);
165
dict_table_t* table_rec;
167
/* Fetch the dict_table_t structure corresponding to
168
this SYS_TABLES record */
169
err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
170
DICT_TABLE_LOAD_FROM_CACHE);
173
mutex_exit(&dict_sys->mutex);
177
push(table_rec->name);
178
if (table_rec->stat_initialized)
181
push("Uninitialized");
182
push(table_rec->stat_n_rows);
183
push(static_cast<uint64_t>(table_rec->stat_clustered_index_size));
184
push(static_cast<uint64_t>(table_rec->stat_sum_of_other_index_sizes));
185
push(static_cast<uint64_t>(table_rec->stat_modified_counter));
186
push(table_rec->autoinc);
187
push(static_cast<uint64_t>(table_rec->n_mysql_handles_opened));
189
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
190
ER_CANT_FIND_SYSTEM_REC,
194
mem_heap_empty(heap);
199
InnodbSysIndexesTool::InnodbSysIndexesTool() :
200
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_INDEXES")
202
add_field("INDEX_ID", plugin::TableFunction::NUMBER, 0, false);
203
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
204
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
205
add_field("TYPE", plugin::TableFunction::NUMBER, 0, false);
206
add_field("N_FIELDS", plugin::TableFunction::NUMBER, 0, false);
207
add_field("PAGE_NO", plugin::TableFunction::NUMBER, 0, false);
208
add_field("SPACE", plugin::TableFunction::NUMBER, 0, false);
211
InnodbSysIndexesTool::Generator::Generator(Field **arg) :
212
plugin::TableFunction::Generator(arg)
217
bool InnodbSysIndexesTool::Generator::populate()
221
heap = mem_heap_create(1000);
222
mutex_enter(&dict_sys->mutex);
225
/* Start scan the SYS_INDEXES table */
226
rec = dict_startscan_system(&pcur, &mtr, SYS_INDEXES);
230
/* Get the next record */
231
mutex_enter(&dict_sys->mutex);
233
rec = dict_getnext_system(&pcur, &mtr);
239
mutex_exit(&dict_sys->mutex);
244
const char* err_msg;;
246
dict_index_t index_rec;
248
/* Populate a dict_index_t structure with information from
250
err_msg = dict_process_sys_indexes_rec(heap, rec, &index_rec,
254
mutex_exit(&dict_sys->mutex);
257
push(index_rec.name);
258
push(static_cast<uint64_t>(table_id));
259
push(static_cast<uint64_t>(index_rec.type));
260
push(static_cast<uint64_t>(index_rec.n_fields));
261
push(static_cast<uint64_t>(index_rec.page));
262
push(static_cast<uint64_t>(index_rec.space));
264
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
265
ER_CANT_FIND_SYSTEM_REC,
269
mem_heap_empty(heap);
274
mutex_exit(&dict_sys->mutex);
282
InnodbSysColumnsTool::InnodbSysColumnsTool() :
283
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_COLUMNS")
285
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
286
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
287
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
288
add_field("MTYPE", plugin::TableFunction::NUMBER, 0, false);
289
add_field("PRTYPE", plugin::TableFunction::NUMBER, 0, false);
290
add_field("LEN", plugin::TableFunction::NUMBER, 0, false);
293
InnodbSysColumnsTool::Generator::Generator(Field **arg) :
294
plugin::TableFunction::Generator(arg)
299
bool InnodbSysColumnsTool::Generator::populate()
303
heap = mem_heap_create(1000);
304
mutex_enter(&dict_sys->mutex);
306
rec = dict_startscan_system(&pcur, &mtr, SYS_COLUMNS);
310
/* Get the next record */
311
mutex_enter(&dict_sys->mutex);
313
rec = dict_getnext_system(&pcur, &mtr);
319
mutex_exit(&dict_sys->mutex);
325
dict_col_t column_rec;
327
const char* col_name;
329
/* populate a dict_col_t structure with information from
331
err_msg = dict_process_sys_columns_rec(heap, rec, &column_rec,
332
&table_id, &col_name);
335
mutex_exit(&dict_sys->mutex);
340
push(static_cast<uint64_t>(column_rec.ind));
341
push(static_cast<uint64_t>(column_rec.mtype));
342
push(static_cast<uint64_t>(column_rec.prtype));
343
push(static_cast<uint64_t>(column_rec.len));
345
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
346
ER_CANT_FIND_SYSTEM_REC,
350
mem_heap_empty(heap);
355
InnodbSysFieldsTool::InnodbSysFieldsTool() :
356
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FIELDS")
358
add_field("INDEX_ID", plugin::TableFunction::NUMBER, 0, false);
359
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
360
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
363
InnodbSysFieldsTool::Generator::Generator(Field **arg) :
364
plugin::TableFunction::Generator(arg)
369
bool InnodbSysFieldsTool::Generator::populate()
373
heap = mem_heap_create(1000);
374
mutex_enter(&dict_sys->mutex);
377
/* will save last index id so that we know whether we move to
378
the next index. This is used to calculate prefix length */
381
rec = dict_startscan_system(&pcur, &mtr, SYS_FIELDS);
385
/* Get the next record */
386
mutex_enter(&dict_sys->mutex);
388
rec = dict_getnext_system(&pcur, &mtr);
394
mutex_exit(&dict_sys->mutex);
403
dict_field_t field_rec;
405
/* Populate a dict_field_t structure with information from
407
err_msg = dict_process_sys_fields_rec(heap, rec, &field_rec,
408
&pos, &index_id, last_id);
411
mutex_exit(&dict_sys->mutex);
415
push(field_rec.name);
416
push(static_cast<uint64_t>(pos));
420
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
421
ER_CANT_FIND_SYSTEM_REC,
425
mem_heap_empty(heap);
430
InnodbSysForeignTool::InnodbSysForeignTool() :
431
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FOREIGN")
433
add_field("ID", plugin::TableFunction::STRING, NAME_LEN + 1, false);
434
add_field("FOR_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
435
add_field("REF_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
436
add_field("N_COLS", plugin::TableFunction::NUMBER, 0, false);
437
add_field("TYPE", plugin::TableFunction::NUMBER, 0, false);
440
InnodbSysForeignTool::Generator::Generator(Field **arg) :
441
plugin::TableFunction::Generator(arg)
446
bool InnodbSysForeignTool::Generator::populate()
450
heap = mem_heap_create(1000);
451
mutex_enter(&dict_sys->mutex);
454
rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN);
458
/* Get the next record */
460
mutex_enter(&dict_sys->mutex);
461
rec = dict_getnext_system(&pcur, &mtr);
467
mutex_exit(&dict_sys->mutex);
473
dict_foreign_t foreign_rec;
475
/* Populate a dict_foreign_t structure with information from
477
err_msg = dict_process_sys_foreign_rec(heap, rec, &foreign_rec);
480
mutex_exit(&dict_sys->mutex);
483
push(foreign_rec.id);
484
push(foreign_rec.foreign_table_name);
485
push(foreign_rec.referenced_table_name);
486
push(static_cast<uint64_t>(foreign_rec.n_fields));
487
push(static_cast<uint64_t>(foreign_rec.type));
489
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
490
ER_CANT_FIND_SYSTEM_REC,
494
mem_heap_empty(heap);
499
InnodbSysForeignColsTool::InnodbSysForeignColsTool() :
500
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FOREIGN_COLS")
502
add_field("ID", plugin::TableFunction::STRING, NAME_LEN + 1, false);
503
add_field("FOR_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
504
add_field("REF_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
505
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
508
InnodbSysForeignColsTool::Generator::Generator(Field **arg) :
509
plugin::TableFunction::Generator(arg)
514
bool InnodbSysForeignColsTool::Generator::populate()
518
heap = mem_heap_create(1000);
519
mutex_enter(&dict_sys->mutex);
522
rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN_COLS);
526
/* Get the next record */
527
mutex_enter(&dict_sys->mutex);
529
rec = dict_getnext_system(&pcur, &mtr);
535
mutex_exit(&dict_sys->mutex);
543
const char* for_col_name;
544
const char* ref_col_name;
547
/* Extract necessary information from a SYS_FOREIGN_COLS row */
548
err_msg = dict_process_sys_foreign_col_rec(heap, rec, &name, &for_col_name,
549
&ref_col_name, &pos);
552
mutex_exit(&dict_sys->mutex);
558
push(static_cast<uint64_t>(pos));
560
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
561
ER_CANT_FIND_SYSTEM_REC,
566
mem_heap_empty(heap);
572
38
* Fill the dynamic table data_dictionary.INNODB_CMP and INNODB_CMP_RESET