vitess.io/vitess@v0.16.2/go/vt/vtgate/planbuilder/show_test.go (about) 1 /* 2 Copyright 2021 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package planbuilder 18 19 import ( 20 "context" 21 "fmt" 22 "testing" 23 24 "github.com/stretchr/testify/require" 25 26 "vitess.io/vitess/go/sqltypes" 27 "vitess.io/vitess/go/vt/sqlparser" 28 "vitess.io/vitess/go/vt/vtgate/vindexes" 29 ) 30 31 func TestBuildDBPlan(t *testing.T) { 32 vschema := &vschemaWrapper{ 33 keyspace: &vindexes.Keyspace{Name: "main"}, 34 } 35 36 testCases := []struct { 37 query string 38 expected string 39 }{{ 40 query: "show databases like 'main'", 41 expected: `[[VARCHAR("main")]]`, 42 }, { 43 query: "show databases like '%ys%'", 44 expected: `[[VARCHAR("mysql")] [VARCHAR("sys")]]`, 45 }} 46 47 for _, s := range testCases { 48 t.Run(s.query, func(t *testing.T) { 49 parserOut, err := sqlparser.Parse(s.query) 50 require.NoError(t, err) 51 52 show := parserOut.(*sqlparser.Show) 53 primitive, err := buildDBPlan(show.Internal.(*sqlparser.ShowBasic), vschema) 54 require.NoError(t, err) 55 56 result, err := primitive.TryExecute(context.Background(), nil, nil, false) 57 require.NoError(t, err) 58 require.Equal(t, s.expected, fmt.Sprintf("%v", result.Rows)) 59 }) 60 } 61 } 62 63 func TestGenerateCharsetRows(t *testing.T) { 64 rows := make([][]sqltypes.Value, 0, 4) 65 rows0 := [][]sqltypes.Value{ 66 append(buildVarCharRow( 67 "utf8", 68 "UTF-8 Unicode", 69 "utf8_general_ci"), 70 sqltypes.NewInt32(3)), 71 } 72 rows1 := [][]sqltypes.Value{ 73 append(buildVarCharRow( 74 "utf8mb4", 75 "UTF-8 Unicode", 76 "utf8mb4_general_ci"), 77 sqltypes.NewInt32(4)), 78 } 79 rows2 := [][]sqltypes.Value{ 80 append(buildVarCharRow( 81 "utf8", 82 "UTF-8 Unicode", 83 "utf8_general_ci"), 84 sqltypes.NewInt32(3)), 85 append(buildVarCharRow( 86 "utf8mb4", 87 "UTF-8 Unicode", 88 "utf8mb4_general_ci"), 89 sqltypes.NewInt32(4)), 90 } 91 92 testcases := []struct { 93 input string 94 expected [][]sqltypes.Value 95 }{ 96 {input: "show charset", expected: rows2}, 97 {input: "show character set", expected: rows2}, 98 {input: "show charset where charset like 'foo%'", expected: rows}, 99 {input: "show charset where charset like 'utf8%'", expected: rows0}, 100 {input: "show charset where charset = 'utf8'", expected: rows0}, 101 {input: "show charset where charset = 'foo%'", expected: rows}, 102 {input: "show charset where charset = 'utf8mb4'", expected: rows1}, 103 } 104 105 charsets := []string{"utf8", "utf8mb4"} 106 107 for _, tc := range testcases { 108 t.Run(tc.input, func(t *testing.T) { 109 stmt, err := sqlparser.Parse(tc.input) 110 require.NoError(t, err) 111 match := stmt.(*sqlparser.Show).Internal.(*sqlparser.ShowBasic) 112 filter := match.Filter 113 actual, err := generateCharsetRows(filter, charsets) 114 require.NoError(t, err) 115 require.Equal(t, tc.expected, actual) 116 }) 117 } 118 }