generated at
sqlcのコードリーディング
sqlcの内部実装が気になったのでコードを読んでみる
v1.26.0時点の内容を元に、気になる部分について調べる

WASMプラグインの実行周り
WASMプラグインについてのドキュメントはこちら - docs/guides/plugins.md

WASMプラグインのダウンロード
1. sqlc.yamlで指定されたURLへHTTPリクエストを送り、ダウンロードする (internal/ext/wasm/wasm.go#L87-L97)
1. internal/cmd/generate.go#L355-L360 - wasm.Runner が作られているのはここ
2. internal/cmd/generate.go#L195 - plug 変数の実体はここで作られている
2. sqlc.yamlで指定されたプラグインのチェックサムと実際のチェックサムが一致していることを検証する (internal/ext/wasm/wasm.go#L126-L133)
3. チェックサムが一致したら、ダウンロードしてきたWASMプラグインをローカルに保存する (internal/ext/wasm/wasm.go#L135-L143)
ファイル名は、下記ディレクトリ配下に ${チェックサム}/plugin.wasm という名前で保存される
WASMプラグインの保存先は以下のいずれか (internal/cache/cache.go#L25-L35)
1. SQLCCACHE配下の /plugins ディレクトリ
2. ${os.UserCacheDir()}/sqlc/plugins (デフォルト)

WASMプラグインの実行
1. wasm.Runner.Invoke() - ここでWASMプラグインが実行されている (internal/ext/wasm/wasm.go#L188)
2. ダウンロードされたWASMプラグインのコンパイルとwazeroランタイムの作成を行う (internal/ext/wasm/wasm.go#L145-L164)
wazeroというのは、Go向けのWebAssemblyランタイムとのこと
WASIも利用されている (internal/ext/wasm/wasm.go#L153)
3. wazeroを使ってWASMを実行する (internal/ext/wasm/wasm.go#L206-L242)
WASMプラグインが標準出力に出力した結果をデコードする (internal/ext/wasm/wasm.go#L217, internal/ext/wasm/wasm.go#L240)

スキーマの解析
1. (*Compiler).ParseCatalog のあたりが怪しそう (internal/cmd/generate.go#L308)
引数としてsqlc.yaml sql.schema を受け取っているっぽい
*Compiler を作成する際に、RDBMSに応じて Parser を作っている (internal/compiler/engine.go#L42-L63)
2. (*Compiler).ParseCatalog の実体は (*Compiler).parseCatalog にある (internal/compiler/engine.go#L71-L73)
3. (*Compiler).parseCatalog sqlc.yaml sql.schema で指定された .sql ファイルを解析して、 Catalog を更新している (internal/compiler/compile.go#L29-L53)
この際に、 migrations.RemoveRollbackStatements によって各種マイグレーションツール(dbmate, sql-migrateなど)における down 用のSQLを削除している (internal/migrations/migrations.go#L14-L33)
スキーマの定義ファイルを読み込む処理は sqlpath.Glob で記述されている (internal/sql/sqlpath/read.go#L19)
スキーマファイルの一覧は基本的に os.ReadDir で読み込まれている
os.ReadDir はファイル名順でファイル名の一覧を返す
各種マイグレーションツールのマイグレーションファイルは、ファイル名の頭にタイムスタンプがつくから、これにより意図した順番で .sql ファイルの一覧が取得できる
4. (*Catalog).Update の実体はここ (internal/sql/catalog/catalog.go#L45)
この .Update() メソッドは、各 .sql ファイルごとに都度呼び出される
Catalog は現在のスキーマ定義に関するスナップショットを管理していて、 .Update'( によりスナップショットが更新される
この .Update() の内部では Parser が返却した各ノードを愚直に一つずつ検査し、 *Catalog に定義された各種ノード種別に対応するメソッドを呼んでスナップショットを更新している