Categorygithub.com/ikaiguang/go-sqlparser
repositorypackage
1.0.0
Repository: https://github.com/ikaiguang/go-sqlparser.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
Package hack gives you some efficient functionality at the cost of breaking some Go rules.
Package sqltypes implements interfaces and types that represent SQL values.
No description provided by the author

# README

go-sqlparser

sqlparser, SQL Parser, go sql parser, golang sql parser

摘自 https://github.com/vitessio/vitess

版本


go version go1.11.1 darwin/amd64

cd $GOPATH/src/github.com/vitessio/vitess

git log


commit 32dd398dd5459e5cf15904db35aba7460519b612 (HEAD -> master, origin/master, origin/HEAD)
Merge: 714e12689 066779f52
Author: Michael Demmer <demmer@gmail.com>
Date:   Wed Nov 21 21:19:16 2018 -0500

    Merge pull request #4336 from planetscale/ss-vtgatev3
    
    select *: expand column list for tables with authoritative column lists

commit 714e126899c76a821dac78148f2d51550621edaa
...

Usage

import ( "github.com/ikaiguang/go-sqlparser" )

example

parse_test.go

parse_next_test.go ...

my example


// TestParse Parse
func TestParse(t *testing.T) {
	return

	src := "CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED); -- foo\nSelect --1 from foo;"

	stat, err := sqlparser.Parse(src)
	//stat, err := sqlparser.ParseStrictDDL(src)
	if err != nil {
		t.Errorf("sqlparser.Parse error : %v \n", err)
		return
	}
	t.Logf("sqlparser.Parse success \n")
	t.Logf("%#v \n", stat)

	ddl, ok := stat.(*sqlparser.DDL)
	if !ok {
		t.Errorf("stat.(*sqlparser.DDL) convert fail")
		return
	}
	t.Logf("%#v \n", ddl)
}

// TestTokenizer Tokenizer
func TestTokenizer(t *testing.T) {
	return

	src := `
CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED);
CREATE TABLE bar (a SMALLINT UNSIGNED, b INT UNSIGNED);
CREATE TABLE bar (a SMALLINT UNSIGNED, b INT UNSIGNED);
`
	tokenizer := sqlparser.NewStringTokenizer(src)

	for {
		stat, err := sqlparser.ParseNext(tokenizer)
		if err != nil {
			if err == io.EOF {
				t.Logf("parse done !")
				break
			}
			t.Errorf("sqlparser.ParseNext(tokenizer) fail : %v", err)
			break
		}
		ddl, ok := stat.(*sqlparser.DDL)
		if !ok {
			t.Errorf("stat.(*sqlparser.DDL) convert fail")
			return
		}
		t.Logf("%#v \n", ddl)
	}
}

// TestSplitStatement SplitStatement
func TestSplitStatement(t *testing.T) {
	return

	src := `
CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED);
CREATE TABLE bar (a SMALLINT UNSIGNED, b INT UNSIGNED);
CREATE TABLE bar (a SMALLINT UNSIGNED, b INT UNSIGNED);
`
	for len(src) > 0 {
		// get one
		str1, str2, err := sqlparser.SplitStatement(src)
		if err != nil {
			if err == io.EOF {
				t.Logf("split done !")
				break
			}
			t.Errorf("sqlparser.SplitStatement(src) fail : %v", err)
			break
		}
		t.Logf("%#v \n", str1)
		//t.Logf("%#v \n", str2)

		src = str2
	}
}

// TestSplitStatementToPieces SplitStatementToPieces
func TestSplitStatementToPieces(t *testing.T) {
	//return

	src := `
-- a
CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED);
-- b
CREATE TABLE bar (a SMALLINT UNSIGNED, b INT UNSIGNED);
-- c
#CREATE TABLE ccc (a SMALLINT UNSIGNED, b INT UNSIGNED);
-- d
#CREATE TABLE ccc (a SMALLINT UNSIGNED, b INT UNSIGNED);
`
	pieces, err := sqlparser.SplitStatementToPieces(src)
	if err != nil {
		t.Errorf("sqlparser.SplitStatementToPieces(src) fail : %v", err)
		return
	}
	t.Logf("%#v \n", len(pieces))
	t.Logf("%#v \n", pieces)

	t.Logf("%#v \n", "~~~~~")

	for _, sql := range pieces {
		//stat, err := sqlparser.Parse(sql) // last sql error
		stat, err := sqlparser.ParseStrictDDL(sql) // last sql error
		if err != nil {
			t.Errorf("sqlparser.Parse error : %v \n", err)
			return
		}

		ddl, ok := stat.(*sqlparser.DDL)
		if !ok {
			t.Errorf("stat.(*sqlparser.DDL) convert fail")
			return
		}
		t.Logf("%#v \n", ddl)
	}
}