token_test.go 5.1 KB
Newer Older
martianzhang's avatar
martianzhang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
 * Copyright 2018 Xiaomi, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ast

import (
	"fmt"
	"testing"

	"github.com/XiaoMi/soar/common"

	"github.com/kr/pretty"
)

martianzhang's avatar
martianzhang 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40
func TestTokenize(t *testing.T) {
	err := common.GoldenDiff(func() {
		for _, sql := range common.TestSQLs {
			fmt.Println(sql)
			fmt.Println(Tokenize(sql))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
	}
}

func TestTokenizer(t *testing.T) {
martianzhang's avatar
martianzhang 已提交
41 42 43 44 45 46 47 48 49 50 51
	sqls := []string{
		"select c1,c2,c3 from t1,t2 join t3 on t1.c1=t2.c1 and t1.c3=t3.c1 where id>1000",
		"select sourcetable, if(f.lastcontent = ?, f.lastupdate, f.lastcontent) as lastactivity, f.totalcount as activity, type.class as type, (f.nodeoptions & ?) as nounsubscribe from node as f inner join contenttype as type on type.contenttypeid = f.contenttypeid inner join subscribed as sd on sd.did = f.nodeid and sd.userid = ? union all select f.name as title, f.userid as keyval, ? as sourcetable, ifnull(f.lastpost, f.joindate) as lastactivity, f.posts as activity, ? as type, ? as nounsubscribe from user as f inner join userlist as ul on ul.relationid = f.userid and ul.userid = ? where ul.type = ? and ul.aq = ? order by title limit ?",
		"select c1 from t1 where id>=1000", // test ">="
		"select SQL_CALC_FOUND_ROWS col from tbl where id>1000",
		"SELECT * FROM tb WHERE id=?;",
		"SELECT * FROM tb WHERE id is null;",
		"SELECT * FROM tb WHERE id is not null;",
		"SELECT * FROM tb WHERE id between 1 and 3;",
		"alter table inventory add index idx_store_film` (`store_id`,`film_id`);",
	}
martianzhang's avatar
martianzhang 已提交
52 53 54 55 56 57 58
	err := common.GoldenDiff(func() {
		for _, sql := range sqls {
			pretty.Println(Tokenizer(sql))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
	}
}

func TestGetQuotedString(t *testing.T) {
	var str = []string{
		`"hello world"`,
		"`hello world`",
		`'hello world'`,
		"hello world",
		`'hello \'world'`,
		`"hello \"wor\"ld"`,
		`"hello \"world"`,
		`""`,
		`''`,
		"``",
		`'hello 'world'`,
		`"hello "world"`,
	}
martianzhang's avatar
martianzhang 已提交
77 78 79 80 81 82 83
	err := common.GoldenDiff(func() {
		for _, s := range str {
			fmt.Printf("orignal: %s\nquoted: %s\n", s, getQuotedString(s))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
84 85 86 87
	}
}

func TestCompress(t *testing.T) {
martianzhang's avatar
martianzhang 已提交
88 89 90 91 92 93 94 95
	err := common.GoldenDiff(func() {
		for _, sql := range common.TestSQLs {
			fmt.Println(sql)
			fmt.Println(Compress(sql))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
96
	}
martianzhang's avatar
martianzhang 已提交
97

martianzhang's avatar
martianzhang 已提交
98 99 100
}

func TestFormat(t *testing.T) {
martianzhang's avatar
martianzhang 已提交
101 102 103 104 105 106 107 108
	err := common.GoldenDiff(func() {
		for _, sql := range common.TestSQLs {
			fmt.Println(sql)
			fmt.Println(format(sql))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
109 110 111 112 113 114 115 116 117 118 119 120
	}
}

func TestSplitStatement(t *testing.T) {
	bufs := [][]byte{
		[]byte("select * from test;hello"),
		[]byte("select 'asd;fas', col from test;hello"),
		[]byte("-- select * from test;hello"),
		[]byte("#select * from test;hello"),
		[]byte("select * /*comment*/from test;hello"),
		[]byte("select * /*comment;*/from test;hello"),
		[]byte(`select * /*comment
martianzhang's avatar
martianzhang 已提交
121 122
		;*/
		from test;hello`),
martianzhang's avatar
martianzhang 已提交
123
		[]byte(`select * from test`),
martianzhang's avatar
martianzhang 已提交
124 125 126 127 128 129
		// https://github.com/XiaoMi/soar/issues/66
		[]byte(`/*comment*/`),
		[]byte(`/*comment*/;`),
		[]byte(`--`),
		[]byte(`-- comment`),
		[]byte(`# comment`),
martianzhang's avatar
martianzhang 已提交
130 131 132 133 134
		[]byte(`select
*
-- comment
from tb
where col = 1`),
martianzhang's avatar
martianzhang 已提交
135 136 137
	}
	buf2s := [][]byte{
		[]byte("select * from test\\Ghello"),
138
		[]byte("select 'hello\\Gworld', col from test\\Ghello"),
martianzhang's avatar
martianzhang 已提交
139 140 141 142 143 144 145 146
		[]byte("-- select * from test\\Ghello"),
		[]byte("#select * from test\\Ghello"),
		[]byte("select * /*comment*/from test\\Ghello"),
		[]byte("select * /*comment;*/from test\\Ghello"),
		[]byte(`select * /*comment
        \\G*/
        from test\\Ghello`),
	}
martianzhang's avatar
martianzhang 已提交
147 148 149 150 151 152 153 154 155 156 157 158
	err := common.GoldenDiff(func() {
		for i, buf := range bufs {
			sql, _, _ := SplitStatement(buf, []byte(common.Config.Delimiter))
			fmt.Println(i, sql)
		}
		for i, buf := range buf2s {
			sql, _, _ := SplitStatement(buf, []byte(common.Config.Delimiter))
			fmt.Println(i, sql)
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
159 160 161 162 163 164 165 166 167 168 169 170
	}
}

func TestLeftNewLines(t *testing.T) {
	bufs := [][]byte{
		[]byte(`
		select * from test;hello`),
		[]byte(`select * /*comment
        ;*/
        from test;hello`),
		[]byte(`select * from test`),
	}
martianzhang's avatar
martianzhang 已提交
171 172 173 174 175 176 177
	err := common.GoldenDiff(func() {
		for _, buf := range bufs {
			fmt.Println(LeftNewLines(buf))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
178 179 180 181 182 183 184 185 186 187 188 189
	}
}

func TestNewLines(t *testing.T) {
	bufs := [][]byte{
		[]byte(`
		select * from test;hello`),
		[]byte(`select * /*comment
        ;*/
        from test;hello`),
		[]byte(`select * from test`),
	}
martianzhang's avatar
martianzhang 已提交
190 191 192 193 194 195 196
	err := common.GoldenDiff(func() {
		for _, buf := range bufs {
			fmt.Println(NewLines(buf))
		}
	}, t.Name(), update)
	if nil != err {
		t.Fatal(err)
martianzhang's avatar
martianzhang 已提交
197 198
	}
}