miau's blog?

exuberant ctags で SQL のタグ生成

気がついたら ctags日本語対応版 が更新されてた。

ctags5.6J1 (2006/06/12)
 ・5.6対応リリース

何が変わったんだろう?ということで、Change Notes 見てみると・・・大して仕事には影響なさそう。でも、

* Fixed incorrect tag for first field of table [SQL].

の一文が気になった。
へー、SQL もタグ生成できるんだ。ちょっと試してみよう。




試しに、旧バージョン(5.5.3J1)のまま tags ファイル生成してみる。
あ。確かに最初のフィールドについてタグが生成されてない。

ということで、5.6J1 を入れてみる。
おー。確かにジャンプできる。
・・・でもなんかまだ動作おかしくない?

ちょっと見た感じ、

CREATE TABLE employees (
id integer NOT NULL,
name varchar(20),
address varchar(50),
:
)

こんな感じで varchar(20) とかが混ざってると、それ以降のフィールドについてタグが生成されてないっぽい。
ソース読んでみると、怪しい処理発見。
sql.h parseRecord() の中で、

do
{
readToken (token);
if (isType (token, TOKEN_IDENTIFIER))
makeSqlTag (token, SQLTAG_FIELD);
while (!(isType (token, TOKEN_COMMA) ||
isType (token, TOKEN_CLOSE_PAREN)))
readToken (token);
} while (! isType (token, TOKEN_CLOSE_PAREN));

こんなことやってる。閉じ括弧があったら CREATE TABLE 文の最後とみなされてる感じ。これを、

do
{
readToken (token);
if (isType (token, TOKEN_IDENTIFIER))
makeSqlTag (token, SQLTAG_FIELD);
while (!(isType (token, TOKEN_COMMA) ||
isType (token, TOKEN_CLOSE_PAREN)))
if (isType (token, TOKEN_OPEN_PAREN))
skipArgumentList (token);
else
readToken (token);
} while (! isType (token, TOKEN_CLOSE_PAREN));

こう変更。
vcvars32.bat を実行して、nmake mk_mvc.mak とやってコンパイルすると、ちゃんとタグ生成されるようになりました。

ビューの定義見てるときや、プログラム中の SQL を眺めてるときに「このフィールドって何型だっけ?」みたいに思うことが結構あるけど、そんなときにすぐ見られるので便利です。
ビューの定義についてはタグが生成されないけど、大半のフィールドはテーブルと同名のフィールドを使ってるから今のところ問題なし。不便に感じたらいじるとしよう。


ちなみに本家への報告はまだ。よく見たら sql.h は PL/SQL 用のタグ出力用らしく、PL/SQL の仕様見ないとバグかどうか判断できないので。
判断つく方は教えてください。


(追記)
仕様レベルでは調べてませんが、ちゃんと varchar(20) とか扱えるべきですね。近いうちに本家に報告します。


(2006/10/05 追記)

報告してみました。

https://sourceforge.net/tracker/?group_id=6556&atid=106556

「この表現変だよ!」みたいな箇所あったら教えてください。


(2006/10/09 さらに追記)

一昨日くらいに早速返信が。「Revision 463 で対応しましたよ」的な。
対応早いなー、と感心してたけど、sql.h の change log を見た感じだと、色々機能追加してたみたいで、この問題も一緒に対応してたっぽい。
create views にも対応したらしいし、今度暇なときに試してみよう。
posted at 05:53:46 on 2006-09-28 by miau - Category: General No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。