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  }