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  }