23
23
#include "drizzled/current_session.h"
26
25
#include "trx0i_s.h"
27
26
#include "trx0trx.h" /* for TRX_QUE_STATE_STR_MAX_LEN */
28
27
#include "buf0buddy.h" /* for i_s_cmpmem */
29
28
#include "buf0buf.h" /* for buf_pool and PAGE_ZIP_MIN_SIZE */
30
29
#include "ha_prototypes.h" /* for innobase_convert_name() */
31
30
#include "srv0start.h" /* for srv_was_started */
31
#include "btr0pcur.h" /* for file sys_tables related info. */
32
#include "btr0types.h"
33
#include "dict0load.h" /* for file sys_tables related info. */
35
#include "dict0types.h"
33
36
#include "handler0vars.h"
35
38
using namespace drizzled;
40
InnodbSysTablesTool::InnodbSysTablesTool() :
41
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_TABLES")
43
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
44
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
45
add_field("FLAG", plugin::TableFunction::NUMBER, 0, false);
46
add_field("N_COLS", plugin::TableFunction::NUMBER, 0, false);
47
add_field("SPACE", plugin::TableFunction::NUMBER, 0, false);
50
InnodbSysTablesTool::Generator::Generator(Field **arg) :
51
plugin::TableFunction::Generator(arg)
56
bool InnodbSysTablesTool::Generator::populate()
60
heap = mem_heap_create(1000);
61
mutex_enter(&(dict_sys->mutex));
64
rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
68
/* Get the next record */
69
mutex_enter(&dict_sys->mutex);
71
rec = dict_getnext_system(&pcur, &mtr);
77
mutex_exit(&dict_sys->mutex);
83
dict_table_t* table_rec;
85
/* Create and populate a dict_table_t structure with
86
information from SYS_TABLES row */
87
err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
88
DICT_TABLE_LOAD_FROM_RECORD);
91
mutex_exit(&dict_sys->mutex);
95
push(table_rec->name);
96
push(static_cast<uint64_t>(table_rec->flags));
97
push(static_cast<uint64_t>(table_rec->n_cols));
98
push(static_cast<uint64_t>(table_rec->space));
100
/* push_warning_printf(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
101
ER_CANT_FIND_SYSTEM_REC,
105
/* Since dict_process_sys_tables_rec() is called with
106
DICT_TABLE_LOAD_FROM_RECORD, the table_rec is created in
107
dict_process_sys_tables_rec(), we will need to free it */
109
dict_mem_table_free(table_rec);
112
mem_heap_empty(heap);
117
InnodbSysTableStatsTool::InnodbSysTableStatsTool() :
118
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_TABLESTATS")
120
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
121
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
122
add_field("STATS_INITIALIZED", plugin::TableFunction::STRING, NAME_LEN + 1, false);
123
add_field("NUM_ROWS", plugin::TableFunction::NUMBER, 0, false);
124
add_field("CLUST_INDEX_SIZE", plugin::TableFunction::NUMBER, 0, false);
125
add_field("OTHER_INDEX_SIZE", plugin::TableFunction::NUMBER, 0, false);
126
add_field("MODIFIED_COUNTER", plugin::TableFunction::NUMBER, 0, false);
127
add_field("AUTOINC", plugin::TableFunction::NUMBER, 0, false);
128
add_field("HANDLES_OPENED", plugin::TableFunction::NUMBER, 0, false);
131
InnodbSysTableStatsTool::Generator::Generator(Field **arg) :
132
plugin::TableFunction::Generator(arg)
137
bool InnodbSysTableStatsTool::Generator::populate()
141
heap = mem_heap_create(1000);
142
mutex_enter(&dict_sys->mutex);
144
rec = dict_startscan_system(&pcur, &mtr, SYS_TABLES);
148
/* Get the next record */
149
mutex_enter(&dict_sys->mutex);
151
rec = dict_getnext_system(&pcur, &mtr);
157
mutex_exit(&dict_sys->mutex);
163
dict_table_t* table_rec;
165
/* Fetch the dict_table_t structure corresponding to
166
this SYS_TABLES record */
167
err_msg = dict_process_sys_tables_rec(heap, rec, &table_rec,
168
DICT_TABLE_LOAD_FROM_CACHE);
171
mutex_exit(&dict_sys->mutex);
175
push(table_rec->name);
176
if (table_rec->stat_initialized)
179
push("Uninitialized");
180
push(table_rec->stat_n_rows);
181
push(static_cast<uint64_t>(table_rec->stat_clustered_index_size));
182
push(static_cast<uint64_t>(table_rec->stat_sum_of_other_index_sizes));
183
push(static_cast<uint64_t>(table_rec->stat_modified_counter));
184
push(table_rec->autoinc);
185
push(static_cast<uint64_t>(table_rec->n_mysql_handles_opened));
187
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
188
ER_CANT_FIND_SYSTEM_REC,
192
mem_heap_empty(heap);
197
InnodbSysIndexesTool::InnodbSysIndexesTool() :
198
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_INDEXES")
200
add_field("INDEX_ID", plugin::TableFunction::NUMBER, 0, false);
201
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
202
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
203
add_field("TYPE", plugin::TableFunction::NUMBER, 0, false);
204
add_field("N_FIELDS", plugin::TableFunction::NUMBER, 0, false);
205
add_field("PAGE_NO", plugin::TableFunction::NUMBER, 0, false);
206
add_field("SPACE", plugin::TableFunction::NUMBER, 0, false);
209
InnodbSysIndexesTool::Generator::Generator(Field **arg) :
210
plugin::TableFunction::Generator(arg)
215
bool InnodbSysIndexesTool::Generator::populate()
219
heap = mem_heap_create(1000);
220
mutex_enter(&dict_sys->mutex);
223
/* Start scan the SYS_INDEXES table */
224
rec = dict_startscan_system(&pcur, &mtr, SYS_INDEXES);
228
/* Get the next record */
229
mutex_enter(&dict_sys->mutex);
231
rec = dict_getnext_system(&pcur, &mtr);
237
mutex_exit(&dict_sys->mutex);
242
const char* err_msg;;
244
dict_index_t index_rec;
246
/* Populate a dict_index_t structure with information from
248
err_msg = dict_process_sys_indexes_rec(heap, rec, &index_rec,
252
mutex_exit(&dict_sys->mutex);
255
push(index_rec.name);
256
push(static_cast<uint64_t>(table_id));
257
push(static_cast<uint64_t>(index_rec.type));
258
push(static_cast<uint64_t>(index_rec.n_fields));
259
push(static_cast<uint64_t>(index_rec.page));
260
push(static_cast<uint64_t>(index_rec.space));
262
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
263
ER_CANT_FIND_SYSTEM_REC,
267
mem_heap_empty(heap);
272
mutex_exit(&dict_sys->mutex);
280
InnodbSysColumnsTool::InnodbSysColumnsTool() :
281
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_COLUMNS")
283
add_field("TABLE_ID", plugin::TableFunction::NUMBER, 0, false);
284
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
285
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
286
add_field("MTYPE", plugin::TableFunction::NUMBER, 0, false);
287
add_field("PRTYPE", plugin::TableFunction::NUMBER, 0, false);
288
add_field("LEN", plugin::TableFunction::NUMBER, 0, false);
291
InnodbSysColumnsTool::Generator::Generator(Field **arg) :
292
plugin::TableFunction::Generator(arg)
297
bool InnodbSysColumnsTool::Generator::populate()
301
heap = mem_heap_create(1000);
302
mutex_enter(&dict_sys->mutex);
304
rec = dict_startscan_system(&pcur, &mtr, SYS_COLUMNS);
308
/* Get the next record */
309
mutex_enter(&dict_sys->mutex);
311
rec = dict_getnext_system(&pcur, &mtr);
317
mutex_exit(&dict_sys->mutex);
323
dict_col_t column_rec;
325
const char* col_name;
327
/* populate a dict_col_t structure with information from
329
err_msg = dict_process_sys_columns_rec(heap, rec, &column_rec,
330
&table_id, &col_name);
333
mutex_exit(&dict_sys->mutex);
338
push(static_cast<uint64_t>(column_rec.ind));
339
push(static_cast<uint64_t>(column_rec.mtype));
340
push(static_cast<uint64_t>(column_rec.prtype));
341
push(static_cast<uint64_t>(column_rec.len));
343
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
344
ER_CANT_FIND_SYSTEM_REC,
348
mem_heap_empty(heap);
353
InnodbSysFieldsTool::InnodbSysFieldsTool() :
354
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FIELDS")
356
add_field("INDEX_ID", plugin::TableFunction::NUMBER, 0, false);
357
add_field("NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
358
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
361
InnodbSysFieldsTool::Generator::Generator(Field **arg) :
362
plugin::TableFunction::Generator(arg)
367
bool InnodbSysFieldsTool::Generator::populate()
371
heap = mem_heap_create(1000);
372
mutex_enter(&dict_sys->mutex);
375
/* will save last index id so that we know whether we move to
376
the next index. This is used to calculate prefix length */
379
rec = dict_startscan_system(&pcur, &mtr, SYS_FIELDS);
383
/* Get the next record */
384
mutex_enter(&dict_sys->mutex);
386
rec = dict_getnext_system(&pcur, &mtr);
392
mutex_exit(&dict_sys->mutex);
401
dict_field_t field_rec;
403
/* Populate a dict_field_t structure with information from
405
err_msg = dict_process_sys_fields_rec(heap, rec, &field_rec,
406
&pos, &index_id, last_id);
409
mutex_exit(&dict_sys->mutex);
413
push(field_rec.name);
414
push(static_cast<uint64_t>(pos));
418
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
419
ER_CANT_FIND_SYSTEM_REC,
423
mem_heap_empty(heap);
428
InnodbSysForeignTool::InnodbSysForeignTool() :
429
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FOREIGN")
431
add_field("ID", plugin::TableFunction::STRING, NAME_LEN + 1, false);
432
add_field("FOR_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
433
add_field("REF_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
434
add_field("N_COLS", plugin::TableFunction::NUMBER, 0, false);
435
add_field("TYPE", plugin::TableFunction::NUMBER, 0, false);
438
InnodbSysForeignTool::Generator::Generator(Field **arg) :
439
plugin::TableFunction::Generator(arg)
444
bool InnodbSysForeignTool::Generator::populate()
448
heap = mem_heap_create(1000);
449
mutex_enter(&dict_sys->mutex);
452
rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN);
456
/* Get the next record */
458
mutex_enter(&dict_sys->mutex);
459
rec = dict_getnext_system(&pcur, &mtr);
465
mutex_exit(&dict_sys->mutex);
471
dict_foreign_t foreign_rec;
473
/* Populate a dict_foreign_t structure with information from
475
err_msg = dict_process_sys_foreign_rec(heap, rec, &foreign_rec);
478
mutex_exit(&dict_sys->mutex);
481
push(foreign_rec.id);
482
push(foreign_rec.foreign_table_name);
483
push(foreign_rec.referenced_table_name);
484
push(static_cast<uint64_t>(foreign_rec.n_fields));
485
push(static_cast<uint64_t>(foreign_rec.type));
487
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
488
ER_CANT_FIND_SYSTEM_REC,
492
mem_heap_empty(heap);
497
InnodbSysForeignColsTool::InnodbSysForeignColsTool() :
498
plugin::TableFunction("DATA_DICTIONARY", "INNODB_SYS_FOREIGN_COLS")
500
add_field("ID", plugin::TableFunction::STRING, NAME_LEN + 1, false);
501
add_field("FOR_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
502
add_field("REF_COL_NAME", plugin::TableFunction::STRING, NAME_LEN + 1, false);
503
add_field("POS", plugin::TableFunction::NUMBER, 0, false);
506
InnodbSysForeignColsTool::Generator::Generator(Field **arg) :
507
plugin::TableFunction::Generator(arg)
512
bool InnodbSysForeignColsTool::Generator::populate()
516
heap = mem_heap_create(1000);
517
mutex_enter(&dict_sys->mutex);
520
rec = dict_startscan_system(&pcur, &mtr, SYS_FOREIGN_COLS);
524
/* Get the next record */
525
mutex_enter(&dict_sys->mutex);
527
rec = dict_getnext_system(&pcur, &mtr);
533
mutex_exit(&dict_sys->mutex);
541
const char* for_col_name;
542
const char* ref_col_name;
545
/* Extract necessary information from a SYS_FOREIGN_COLS row */
546
err_msg = dict_process_sys_foreign_col_rec(heap, rec, &name, &for_col_name,
547
&ref_col_name, &pos);
550
mutex_exit(&dict_sys->mutex);
556
push(static_cast<uint64_t>(pos));
558
/* push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
559
ER_CANT_FIND_SYSTEM_REC,
564
mem_heap_empty(heap);
38
570
* Fill the dynamic table data_dictionary.INNODB_CMP and INNODB_CMP_RESET