LoginSignup
33
24

More than 5 years have passed since last update.

Golangでparserをつくって、SQLを解析してみよう!

Last updated at Posted at 2016-02-10

Golangで、sqlとか、プログラムとか、DSLのパースってできないのかな、と調べていたら下記を見つけました。

2014年時点ですでにできていたんですね。。

上記では、github.com/benbjohnson/sql-parserというリポジトリで説明してくれています。

おおまかな流れは、

  1. Token作成
  2. Lexer作成
  3. Parser作成

といったところです。

で、それらを呼び出す、mainがない。。。ということで、フォークして、main.goを実装してみました。

main.go
package main

import "strings"

func main() {
    query := "select * from my_table"
    println(query)
    r := strings.NewReader(query)

    //parser生成。queryをくわせる。
    parser := NewParser(r)

    //parse実行。SelectStatementのstructが取得できる
    stmt, err := parser.Parse()
    if err != nil {
        println(err.Error())
    }

    //取得結果を標準出力。
    println(stmt.TableName)
    for _, field := range stmt.Fields {
        println(field)
    }
}

実行してみると、parser.goで定義されたSelectStatementというstcuctが取得し、標準出力してくれます。

ここまでやって、antlrとかだと、select_statementっていったら、grammerファイルに記述されたルールだったような。。となります。

plsql.g4
select_statement
    : subquery_factoring_clause? subquery (for_update_clause | order_by_clause)*
    ;

もやもやっとしたまま記事を進めていくと、なんとinfluxdbの内部でも利用している、とのことでした。

ここにある、ast.goをみると、にたようなルールが記載されていました。でも長い。。

時間があるときに読み込んでみようと思います。

勉強になりました。

33
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
24