github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/opt/cat/utils_test.go (about) 1 // Copyright 2019 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package cat_test 12 13 import ( 14 "context" 15 "fmt" 16 "testing" 17 18 "github.com/cockroachdb/cockroach/pkg/sql/opt/cat" 19 "github.com/cockroachdb/cockroach/pkg/sql/opt/testutils/testcat" 20 "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" 21 ) 22 23 func TestExpandDataSourceGlob(t *testing.T) { 24 testcat := testcat.New() 25 ctx := context.Background() 26 27 exec := func(sql string) { 28 if _, err := testcat.ExecuteDDL(sql); err != nil { 29 t.Fatal(err) 30 } 31 } 32 exec("CREATE TABLE a (x INT)") 33 exec("CREATE TABLE b (x INT)") 34 exec("CREATE TABLE c (x INT)") 35 36 testCases := []struct { 37 pattern tree.TablePattern 38 expected string 39 }{ 40 { 41 pattern: tree.NewTableName("t", "a"), 42 expected: `[t.public.a]`, 43 }, 44 { 45 pattern: tree.NewTableName("t", "z"), 46 expected: `error: no data source matches prefix: "t.public.z"`, 47 }, 48 { 49 pattern: &tree.AllTablesSelector{ObjectNamePrefix: tree.ObjectNamePrefix{}}, 50 expected: `[t.public.a t.public.b t.public.c]`, 51 }, 52 { 53 pattern: &tree.AllTablesSelector{ObjectNamePrefix: tree.ObjectNamePrefix{ 54 SchemaName: "t", ExplicitSchema: true, 55 }}, 56 expected: `[t.public.a t.public.b t.public.c]`, 57 }, 58 { 59 pattern: &tree.AllTablesSelector{ObjectNamePrefix: tree.ObjectNamePrefix{ 60 SchemaName: "z", ExplicitSchema: true, 61 }}, 62 expected: `error: target database or schema does not exist`, 63 }, 64 } 65 66 for _, tc := range testCases { 67 var res string 68 names, err := cat.ExpandDataSourceGlob(ctx, testcat, cat.Flags{}, tc.pattern) 69 if err != nil { 70 res = fmt.Sprintf("error: %v", err) 71 } else { 72 var r []string 73 for _, n := range names { 74 r = append(r, n.FQString()) 75 } 76 res = fmt.Sprintf("%v", r) 77 } 78 if res != tc.expected { 79 t.Errorf("pattern: %v expected: %s got: %s", tc.pattern, tc.expected, res) 80 } 81 } 82 } 83 84 func TestResolveTableIndex(t *testing.T) { 85 testcat := testcat.New() 86 ctx := context.Background() 87 88 exec := func(sql string) { 89 if _, err := testcat.ExecuteDDL(sql); err != nil { 90 t.Fatal(err) 91 } 92 } 93 exec("CREATE TABLE a (x INT, INDEX idx1(x))") 94 exec("CREATE TABLE b (x INT, INDEX idx2(x))") 95 exec("CREATE TABLE c (x INT, INDEX idx2(x))") 96 97 testCases := []struct { 98 name tree.TableIndexName 99 expected string 100 }{ 101 // Both table name and index are set. 102 { 103 name: tree.TableIndexName{ 104 Table: tree.MakeTableName("t", "a"), 105 Index: "idx1", 106 }, 107 expected: `t.public.a@idx1`, 108 }, 109 { 110 name: tree.TableIndexName{ 111 Table: tree.MakeTableName("t", "a"), 112 Index: "idx2", 113 }, 114 expected: `error: index "idx2" does not exist`, 115 }, 116 117 // Only table name is set. 118 { 119 name: tree.TableIndexName{ 120 Table: tree.MakeTableName("t", "a"), 121 }, 122 expected: `t.public.a@primary`, 123 }, 124 { 125 name: tree.TableIndexName{ 126 Table: tree.MakeTableName("z", "a"), 127 }, 128 expected: `error: no data source matches prefix: "z.public.a"`, 129 }, 130 { 131 name: tree.TableIndexName{ 132 Table: tree.MakeTableName("t", "z"), 133 }, 134 expected: `error: no data source matches prefix: "t.public.z"`, 135 }, 136 137 // Only index name is set. 138 { 139 name: tree.TableIndexName{ 140 Index: "idx1", 141 }, 142 expected: `t.public.a@idx1`, 143 }, 144 { 145 name: tree.TableIndexName{ 146 Table: tree.MakeTableName("t", ""), 147 Index: "idx1", 148 }, 149 expected: `t.public.a@idx1`, 150 }, 151 { 152 name: tree.TableIndexName{ 153 Table: func() tree.TableName { 154 var t tree.TableName 155 t.SchemaName = "public" 156 t.ExplicitSchema = true 157 return t 158 }(), 159 Index: "idx1", 160 }, 161 expected: `t.public.a@idx1`, 162 }, 163 { 164 name: tree.TableIndexName{ 165 Table: tree.MakeTableName("z", ""), 166 Index: "idx1", 167 }, 168 expected: `error: target database or schema does not exist`, 169 }, 170 { 171 name: tree.TableIndexName{ 172 Index: "idx2", 173 }, 174 expected: `error: index name "idx2" is ambiguous (found in t.public.c and t.public.b)`, 175 }, 176 } 177 178 for _, tc := range testCases { 179 var res string 180 idx, tn, err := cat.ResolveTableIndex(ctx, testcat, cat.Flags{}, &tc.name) 181 if err != nil { 182 res = fmt.Sprintf("error: %v", err) 183 } else { 184 res = fmt.Sprintf("%s@%s", tn.FQString(), idx.Name()) 185 } 186 if res != tc.expected { 187 t.Errorf("pattern: %v expected: %s got: %s", tc.name.String(), tc.expected, res) 188 } 189 } 190 }