テーブル名の取得方法
MySQL内部でテーブル名を取得するにはどうしたらいいのでしょう・・・? JavaEEで言うところのApplication Contextみたいなのってどうなってるのかな。
JOIN::prepareの時点で既にTABLE_LISTを持っているので、それより前の段階でテーブルを探してきてるはず。しかしソースをちょっとずつ見ていくのメンドクサイ。
で、いいこと思い付いたw readelfでおk
mir@t43:~/tritonn/show/install/bin$ readelf -s mysqld | grep OBJECT | grep GLOBAL | grep table 16: 084ff7e0 16 OBJECT GLOBAL DEFAULT 23 updatable_views_with_limi 159: 085fc1f4 4 OBJECT GLOBAL DEFAULT 24 lower_case_table_names 371: 085faaf4 4 OBJECT GLOBAL DEFAULT 24 table_alias_charset 439: 084f1244 2 OBJECT GLOBAL DEFAULT 23 internal_table_name 481: 086001f1 1 OBJECT GLOBAL DEFAULT 24 table_rules_on 801: 084fdd40 756 OBJECT GLOBAL DEFAULT 23 schema_tables 966: 085fc208 4 OBJECT GLOBAL DEFAULT 24 dropping_tables 1053: 086006d8 4 OBJECT GLOBAL DEFAULT 24 srv_lower_case_table_name 1682: 084ff7f0 12 OBJECT GLOBAL DEFAULT 23 updatable_views_with_limi 1974: 084ffed0 4 OBJECT GLOBAL DEFAULT 23 myisam_quick_table_bits 2543: 0860020c 20 OBJECT GLOBAL DEFAULT 24 replicate_wild_do_table 2618: 085fa4b0 4 OBJECT GLOBAL DEFAULT 24 unknown_table_name 2875: 08604d44 4 OBJECT GLOBAL DEFAULT 24 table_lock_wait_timeout 2906: 085fc1c8 4 OBJECT GLOBAL DEFAULT 24 table_cache_size 3062: 084fe280 120 OBJECT GLOBAL DEFAULT 23 open_tables_fields_info 3789: 084f8500 32 OBJECT GLOBAL DEFAULT 23 sys_max_tmp_tables 3887: 084f8160 32 OBJECT GLOBAL DEFAULT 23 sys_tmp_table_size 4438: 085fff06 1 OBJECT GLOBAL DEFAULT 24 innobase_file_per_table 5450: 085fc680 32 OBJECT GLOBAL DEFAULT 24 sys_table_cache_size 6605: 084f81c0 32 OBJECT GLOBAL DEFAULT 23 sys_updatable_views_with_ 6857: 08600220 52 OBJECT GLOBAL DEFAULT 24 replicate_ignore_table 6995: 084ff000 672 OBJECT GLOBAL DEFAULT 23 tables_fields_info 7029: 08602624 4 OBJECT GLOBAL DEFAULT 24 fil_n_pending_tablespace_ 7135: 086001f5 1 OBJECT GLOBAL DEFAULT 24 do_table_inited 7139: 086025cc 4 OBJECT GLOBAL DEFAULT 24 trx_sys_multiple_tablespa 7179: 08600440 412 OBJECT GLOBAL DEFAULT 24 fake_time_zone_tables_lis 7295: 085fc700 28 OBJECT GLOBAL DEFAULT 24 sys_table_type 7555: 086001f4 1 OBJECT GLOBAL DEFAULT 24 ignore_table_inited 8405: 086007c4 4 OBJECT GLOBAL DEFAULT 24 srv_print_innodb_tablespa 8443: 085fc660 32 OBJECT GLOBAL DEFAULT 24 sys_table_lock_wait_timeo 8559: 086001f3 1 OBJECT GLOBAL DEFAULT 24 wild_do_table_inited 9261: 08600260 52 OBJECT GLOBAL DEFAULT 24 replicate_do_table 9340: 084fd5a0 56 OBJECT GLOBAL DEFAULT 23 sys_table_types 9481: 084ffcc8 4 OBJECT GLOBAL DEFAULT 23 srv_lock_table_size 9510: 086007f8 4 OBJECT GLOBAL DEFAULT 24 srv_mysql_table 9515: 084fd560 48 OBJECT GLOBAL DEFAULT 23 sys_table_aliases 10016: 086006f0 4 OBJECT GLOBAL DEFAULT 24 srv_file_per_table 10296: 084f8118 28 OBJECT GLOBAL DEFAULT 23 sys_innodb_table_locks 10602: 084fe300 120 OBJECT GLOBAL DEFAULT 23 table_names_fields_info 10931: 084fe4c0 168 OBJECT GLOBAL DEFAULT 23 table_constraints_fields_ 11157: 084ffa60 1 OBJECT GLOBAL DEFAULT 23 mysql_proc_table_exists 11622: 084f8600 32 OBJECT GLOBAL DEFAULT 23 sys_max_heap_table_size 12384: 086007c8 4 OBJECT GLOBAL DEFAULT 24 srv_print_innodb_table_mo 12386: 085fd9d4 4 OBJECT GLOBAL DEFAULT 24 unused_tables 12601: 086001f2 1 OBJECT GLOBAL DEFAULT 24 wild_ignore_table_inited 12604: 085fc1b4 4 OBJECT GLOBAL DEFAULT 24 slave_open_temp_tables 12935: 084fe640 168 OBJECT GLOBAL DEFAULT 23 table_privileges_fields_i 7444: 084ff7e0 16 OBJECT GLOBAL DEFAULT 23 updatable_views_with_limi 7587: 085fc1f4 4 OBJECT GLOBAL DEFAULT 24 lower_case_table_names 7799: 085faaf4 4 OBJECT GLOBAL DEFAULT 24 table_alias_charset 7867: 084f1244 2 OBJECT GLOBAL DEFAULT 23 internal_table_name 7909: 086001f1 1 OBJECT GLOBAL DEFAULT 24 table_rules_on 8229: 084fdd40 756 OBJECT GLOBAL DEFAULT 23 schema_tables 8394: 085fc208 4 OBJECT GLOBAL DEFAULT 24 dropping_tables 8481: 086006d8 4 OBJECT GLOBAL DEFAULT 24 srv_lower_case_table_name 9110: 084ff7f0 12 OBJECT GLOBAL DEFAULT 23 updatable_views_with_limi 9402: 084ffed0 4 OBJECT GLOBAL DEFAULT 23 myisam_quick_table_bits 9971: 0860020c 20 OBJECT GLOBAL DEFAULT 24 replicate_wild_do_table 10046: 085fa4b0 4 OBJECT GLOBAL DEFAULT 24 unknown_table_name 10303: 08604d44 4 OBJECT GLOBAL DEFAULT 24 table_lock_wait_timeout 10334: 085fc1c8 4 OBJECT GLOBAL DEFAULT 24 table_cache_size 10490: 084fe280 120 OBJECT GLOBAL DEFAULT 23 open_tables_fields_info 11217: 084f8500 32 OBJECT GLOBAL DEFAULT 23 sys_max_tmp_tables 11315: 084f8160 32 OBJECT GLOBAL DEFAULT 23 sys_tmp_table_size 11866: 085fff06 1 OBJECT GLOBAL DEFAULT 24 innobase_file_per_table 12878: 085fc680 32 OBJECT GLOBAL DEFAULT 24 sys_table_cache_size 14033: 084f81c0 32 OBJECT GLOBAL DEFAULT 23 sys_updatable_views_with_ 14285: 08600220 52 OBJECT GLOBAL DEFAULT 24 replicate_ignore_table 14423: 084ff000 672 OBJECT GLOBAL DEFAULT 23 tables_fields_info 14457: 08602624 4 OBJECT GLOBAL DEFAULT 24 fil_n_pending_tablespace_ 14563: 086001f5 1 OBJECT GLOBAL DEFAULT 24 do_table_inited 14567: 086025cc 4 OBJECT GLOBAL DEFAULT 24 trx_sys_multiple_tablespa 14607: 08600440 412 OBJECT GLOBAL DEFAULT 24 fake_time_zone_tables_lis 14723: 085fc700 28 OBJECT GLOBAL DEFAULT 24 sys_table_type 14983: 086001f4 1 OBJECT GLOBAL DEFAULT 24 ignore_table_inited 15833: 086007c4 4 OBJECT GLOBAL DEFAULT 24 srv_print_innodb_tablespa 15871: 085fc660 32 OBJECT GLOBAL DEFAULT 24 sys_table_lock_wait_timeo 15987: 086001f3 1 OBJECT GLOBAL DEFAULT 24 wild_do_table_inited 16689: 08600260 52 OBJECT GLOBAL DEFAULT 24 replicate_do_table 16768: 084fd5a0 56 OBJECT GLOBAL DEFAULT 23 sys_table_types 16909: 084ffcc8 4 OBJECT GLOBAL DEFAULT 23 srv_lock_table_size 16938: 086007f8 4 OBJECT GLOBAL DEFAULT 24 srv_mysql_table 16943: 084fd560 48 OBJECT GLOBAL DEFAULT 23 sys_table_aliases 17444: 086006f0 4 OBJECT GLOBAL DEFAULT 24 srv_file_per_table 17724: 084f8118 28 OBJECT GLOBAL DEFAULT 23 sys_innodb_table_locks 18030: 084fe300 120 OBJECT GLOBAL DEFAULT 23 table_names_fields_info 18359: 084fe4c0 168 OBJECT GLOBAL DEFAULT 23 table_constraints_fields_ 18585: 084ffa60 1 OBJECT GLOBAL DEFAULT 23 mysql_proc_table_exists 19050: 084f8600 32 OBJECT GLOBAL DEFAULT 23 sys_max_heap_table_size 19812: 086007c8 4 OBJECT GLOBAL DEFAULT 24 srv_print_innodb_table_mo 19814: 085fd9d4 4 OBJECT GLOBAL DEFAULT 24 unused_tables 20029: 086001f2 1 OBJECT GLOBAL DEFAULT 24 wild_ignore_table_inited 20032: 085fc1b4 4 OBJECT GLOBAL DEFAULT 24 slave_open_temp_tables 20363: 084fe640 168 OBJECT GLOBAL DEFAULT 23 table_privileges_fields_i
たぶんこれでmysqldからグローバル変数名を拾って来れている筈。間違えていたら有識者の方、突っ込みお願いします。
で、ここで出てきたシンボル名でさらにetagsとかcscopeとかで探して見たものの、決定打は見付からず。。。(泣
しかしget_all_tablesという当たりっぽい関数が見付かったので、、、地道にいくことにしました。接続時のDB選択で発生する"SHOW TABLES"らしき処理のbacktrace。
#0 get_all_tables (thd=0x8ae91f8, tables=0x8b08878, cond=0x0) at sql_show.cc:2112 #1 0x08291e89 in get_schema_tables_result (join=0x8b08da0) at sql_show.cc:3992 #2 0x08203886 in JOIN::exec (this=0x8b08da0) at sql_select.cc:1421 #3 0x08204d10 in mysql_select (thd=0x8ae91f8, rref_pointer_array=0x8ae95e8, tables=0x8b08878, wild_num=0, fields=@0x8ae954c, conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2693024256, result=0x8b08d90, unit=0x8ae9298, select_lex=0x8ae94c0) at sql_select.cc:1988 #4 0x08204fa1 in handle_select (thd=0x8ae91f8, lex=0x8ae9234, result=0x8b08d90, setup_tables_done_option=0) at sql_select.cc:254 #5 0x081abf1e in mysql_execute_command (thd=0x8ae91f8) at sql_parse.cc:2587 #6 0x081b3e9e in mysql_parse (thd=0x8ae91f8, inBuf=0x8b08730 "show tables", length=11) at sql_parse.cc:5878 #7 0x081b47fd in dispatch_command (command=COM_QUERY, thd=0x8ae91f8, packet=0x8b00701 "show tables", packet_length=12) at sql_parse.cc:1766 #8 0x081b5b29 in do_command (thd=0x8ae91f8) at sql_parse.cc:1550 #9 0x081b5ee7 in handle_one_connection (arg=0x8ae91f8) at sql_parse.cc:1181 #10 0xb7c3a341 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0 #11 0xb7b6a4ee in clone () from /lib/tls/i686/cmov/libc.so.6
なるほどね。第3引数は0でもいいけど、やはり第2引数はちゃんと設定済みのポインタをあたえないといかんのね。
というわけで、今日はここで撃沈・・・.
P.S.
寝る前にinternals-listの過去ログを漁ってみたら、よさげなスレッドを発見!
http://lists.mysql.com/internals/34118
とりあえず寝る。