github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/partition_test.go (about) 1 // Copyright 2018 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 sql_test 12 13 import ( 14 "context" 15 "testing" 16 17 "github.com/cockroachdb/cockroach/pkg/config/zonepb" 18 "github.com/cockroachdb/cockroach/pkg/keys" 19 "github.com/cockroachdb/cockroach/pkg/server" 20 "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" 21 "github.com/cockroachdb/cockroach/pkg/sql/tests" 22 "github.com/cockroachdb/cockroach/pkg/testutils/serverutils" 23 "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" 24 "github.com/cockroachdb/cockroach/pkg/util/encoding" 25 "github.com/cockroachdb/cockroach/pkg/util/leaktest" 26 "github.com/cockroachdb/cockroach/pkg/util/protoutil" 27 ) 28 29 // Test the behavior of a binary that doesn't link in CCL when it comes to 30 // dealing with partitions. Some things are expected to work, others aren't. 31 func TestRemovePartitioningOSS(t *testing.T) { 32 defer leaktest.AfterTest(t)() 33 34 ctx := context.Background() 35 params, _ := tests.CreateTestServerParams() 36 s, sqlDBRaw, kvDB := serverutils.StartServer(t, params) 37 sqlDB := sqlutils.MakeSQLRunner(sqlDBRaw) 38 defer s.Stopper().Stop(ctx) 39 40 const numRows = 100 41 if err := tests.CreateKVTable(sqlDBRaw, "kv", numRows); err != nil { 42 t.Fatal(err) 43 } 44 tableDesc := sqlbase.GetTableDescriptor(kvDB, keys.SystemSQLCodec, "t", "kv") 45 tableKey := sqlbase.MakeDescMetadataKey(keys.SystemSQLCodec, tableDesc.ID) 46 47 // Hack in partitions. Doing this properly requires a CCL binary. 48 tableDesc.PrimaryIndex.Partitioning = sqlbase.PartitioningDescriptor{ 49 NumColumns: 1, 50 Range: []sqlbase.PartitioningDescriptor_Range{{ 51 Name: "p1", 52 FromInclusive: encoding.EncodeIntValue(nil /* appendTo */, encoding.NoColumnID, 1), 53 ToExclusive: encoding.EncodeIntValue(nil /* appendTo */, encoding.NoColumnID, 2), 54 }}, 55 } 56 tableDesc.Indexes[0].Partitioning = sqlbase.PartitioningDescriptor{ 57 NumColumns: 1, 58 Range: []sqlbase.PartitioningDescriptor_Range{{ 59 Name: "p2", 60 FromInclusive: encoding.EncodeIntValue(nil /* appendTo */, encoding.NoColumnID, 1), 61 ToExclusive: encoding.EncodeIntValue(nil /* appendTo */, encoding.NoColumnID, 2), 62 }}, 63 } 64 // Note that this is really a gross hack - it breaks planner caches, which 65 // assume that nothing is going to change out from under them like this. We 66 // "fix" the issue by altering the table's name to refresh the cache, below. 67 if err := kvDB.Put(ctx, tableKey, sqlbase.WrapDescriptor(tableDesc)); err != nil { 68 t.Fatal(err) 69 } 70 sqlDB.Exec(t, "ALTER TABLE t.kv RENAME to t.kv2") 71 sqlDB.Exec(t, "ALTER TABLE t.kv2 RENAME to t.kv") 72 exp := `CREATE TABLE kv ( 73 k INT8 NOT NULL, 74 v INT8 NULL, 75 CONSTRAINT "primary" PRIMARY KEY (k ASC), 76 INDEX foo (v ASC) PARTITION BY RANGE (v) ( 77 PARTITION p2 VALUES FROM (1) TO (2) 78 ), 79 FAMILY fam_0_k (k), 80 FAMILY fam_1_v (v) 81 ) PARTITION BY RANGE (k) ( 82 PARTITION p1 VALUES FROM (1) TO (2) 83 ) 84 -- Warning: Partitioned table with no zone configurations.` 85 if a := sqlDB.QueryStr(t, "SHOW CREATE t.kv")[0][1]; exp != a { 86 t.Fatalf("expected:\n%s\n\ngot:\n%s\n\n", exp, a) 87 } 88 89 // Hack in partition zone configs. This also requires a CCL binary to do 90 // properly. 91 zoneConfig := zonepb.ZoneConfig{ 92 Subzones: []zonepb.Subzone{ 93 { 94 IndexID: uint32(tableDesc.PrimaryIndex.ID), 95 PartitionName: "p1", 96 Config: s.(*server.TestServer).Cfg.DefaultZoneConfig, 97 }, 98 { 99 IndexID: uint32(tableDesc.Indexes[0].ID), 100 PartitionName: "p2", 101 Config: s.(*server.TestServer).Cfg.DefaultZoneConfig, 102 }, 103 }, 104 } 105 zoneConfigBytes, err := protoutil.Marshal(&zoneConfig) 106 if err != nil { 107 t.Fatal(err) 108 } 109 sqlDB.Exec(t, `INSERT INTO system.zones VALUES ($1, $2)`, tableDesc.ID, zoneConfigBytes) 110 for _, p := range []string{ 111 "PARTITION p1 OF INDEX t.public.kv@primary", 112 "PARTITION p2 OF INDEX t.public.kv@foo", 113 } { 114 if exists := sqlutils.ZoneConfigExists(t, sqlDB, p); !exists { 115 t.Fatalf("zone config for %s does not exist", p) 116 } 117 } 118 119 // Some things don't work. 120 sqlDB.ExpectErr(t, 121 "OSS binaries do not include enterprise features", 122 `ALTER PARTITION p1 OF TABLE t.kv CONFIGURE ZONE USING DEFAULT`) 123 sqlDB.ExpectErr(t, 124 "OSS binaries do not include enterprise features", 125 `ALTER PARTITION p2 OF INDEX t.kv@foo CONFIGURE ZONE USING DEFAULT`) 126 127 // But removing partitioning works. 128 sqlDB.Exec(t, `ALTER TABLE t.kv PARTITION BY NOTHING`) 129 sqlDB.Exec(t, `ALTER INDEX t.kv@foo PARTITION BY NOTHING`) 130 sqlDB.Exec(t, `DELETE FROM system.zones WHERE id = $1`, tableDesc.ID) 131 sqlDB.Exec(t, `ALTER TABLE t.kv PARTITION BY NOTHING`) 132 sqlDB.Exec(t, `ALTER INDEX t.kv@foo PARTITION BY NOTHING`) 133 134 exp = `CREATE TABLE kv ( 135 k INT8 NOT NULL, 136 v INT8 NULL, 137 CONSTRAINT "primary" PRIMARY KEY (k ASC), 138 INDEX foo (v ASC), 139 FAMILY fam_0_k (k), 140 FAMILY fam_1_v (v) 141 )` 142 if a := sqlDB.QueryStr(t, "SHOW CREATE t.kv")[0][1]; exp != a { 143 t.Fatalf("expected:\n%s\n\ngot:\n%s\n\n", exp, a) 144 } 145 }