2014年1月20日月曜日

mysqlコマンドラインクライアントでuseの代わりにcdを使う

何を言っているのか略という感じな気もするタイトルですね。。
話の流れとしては、


とか馬鹿なこと言ってたら
とツッコミが入ったので、やってみました。
最初はuseはステートメントだと思っていたので、SQLパーサーをいじって USEステートメント をCDステートメントに変えてやろうと思っていたんですが、"SQLデリミターを省略しても実行される", "mysqlコマンドラインクライアント上でhelp叩くと出てくる"からmysqlコマンドラインクライアント上のコマンドだよ、とツッコミをもらい、そっちをいじくってみることに。

mysql-5.6.15/client/mysql.ccのこのあたりですね。

 322 static COMMANDS commands[] = {
..
 357   { "use",    'u', com_use,    1,
 358     "Use another database. Takes database name as argument." },
..

mysqlコマンドラインクライアント上のuseコマンドを叩くとcom_use関数が呼ばれて、com_use関数の中でmysql_select_db(&mysql, ..)を叩いてcurrent_dbを変更しています。
com_use関数以降は同じで構わないので、ここだけちゃちゃっと変えてコンパイル。


$ client/mysql -uroot -S /usr/mysql/5.6.15/data/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.15-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> help

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
cd        (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| d1                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> SELECT database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.02 sec)

mysql> cd d1
Database changed

mysql> SELECT database();
+------------+
| database() |
+------------+
| d1         |
+------------+
1 row in set (0.00 sec)

mysql> use mysql
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT database();
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

helpの結果がuseコマンドからcdコマンドになり、useを叩くと末尾にセミコロンを求められる。で、セミコロンつけて送信するとMySQLのパーサーがUSEステートメントとして解釈するから"Query OK, .."の応答メッセージ。

ううむ、意外と面白いぞこれ。

0 件のコメント :

コメントを投稿