話の流れとしては、
シェルプロンプトでuse /homeって打った。もう末期。
— yoku0825 (@yoku0825) 2014, 1月 15
とか馬鹿なこと言ってたら
@yoku0825 mysql> cd dbname は時々やるので、mysql コマンドが対応すべき。
— とみたまさひろ (@tmtms) 2014, 1月 15
とツッコミが入ったので、やってみました。最初は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 件のコメント :
コメントを投稿