Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@letusfly85

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

More than 5 years have passed since last update.

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をみると、にたようなルールが記載されていました。でも長い。。

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

勉強になりました。

25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?