vitess.io/vitess@v0.16.2/go/vt/sqlparser/keywords_test.go (about)

     1  package sqlparser
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"os"
     7  	"path"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestKeywordTable(t *testing.T) {
    15  	for _, kw := range keywords {
    16  		lookup, ok := keywordLookupTable.LookupString(kw.name)
    17  		require.Truef(t, ok, "keyword %q failed to match", kw.name)
    18  		require.Equalf(t, lookup, kw.id, "keyword %q matched to %d (expected %d)", kw.name, lookup, kw.id)
    19  	}
    20  }
    21  
    22  var vitessReserved = map[string]bool{
    23  	"ESCAPE":        true,
    24  	"NEXT":          true,
    25  	"OFF":           true,
    26  	"SAVEPOINT":     true,
    27  	"SQL_NO_CACHE":  true,
    28  	"TIMESTAMPADD":  true,
    29  	"TIMESTAMPDIFF": true,
    30  }
    31  
    32  func TestCompatibility(t *testing.T) {
    33  	file, err := os.Open(path.Join("testdata", "mysql_keywords.txt"))
    34  	require.NoError(t, err)
    35  	defer file.Close()
    36  
    37  	scanner := bufio.NewScanner(file)
    38  	skipStep := 4
    39  	for scanner.Scan() {
    40  		if skipStep != 0 {
    41  			skipStep--
    42  			continue
    43  		}
    44  
    45  		afterSplit := strings.SplitN(scanner.Text(), "\t", 2)
    46  		word, reserved := afterSplit[0], afterSplit[1] == "1"
    47  		if reserved || vitessReserved[word] {
    48  			word = "`" + word + "`"
    49  		}
    50  		sql := fmt.Sprintf("create table %s(c1 int)", word)
    51  		_, err := ParseStrictDDL(sql)
    52  		if err != nil {
    53  			t.Errorf("%s is not compatible with mysql", word)
    54  		}
    55  	}
    56  }