github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/logictest/testdata/logic_test/alter_primary_key (about)

     1  # 3node-tenant fails due to
     2  # https://github.com/cockroachdb/cockroach/issues/47900.
     3  # LogicTest: !3node-tenant
     4  
     5  statement ok
     6  SET experimental_enable_hash_sharded_indexes = true
     7  
     8  statement ok
     9  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, z INT NOT NULL, w INT, INDEX i (x), INDEX i2 (z))
    10  
    11  statement ok
    12  INSERT INTO t VALUES (1, 2, 3, 4), (5, 6, 7, 8)
    13  
    14  query T noticetrace
    15  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y, z)
    16  ----
    17  NOTICE: primary key changes are finalized asynchronously; further schema changes on this table may be restricted until the job completes
    18  
    19  query IIII rowsort
    20  SELECT * FROM t@primary
    21  ----
    22  1 2 3 4
    23  5 6 7 8
    24  
    25  statement ok
    26  INSERT INTO t VALUES (9, 10, 11, 12)
    27  
    28  query IIII rowsort
    29  SELECT * from t@primary
    30  ----
    31  1 2 3 4
    32  5 6 7 8
    33  9 10 11 12
    34  
    35  statement ok
    36  UPDATE t SET x = 2 WHERE z = 7
    37  
    38  query IIII rowsort
    39  SELECT * from t@primary
    40  ----
    41  1 2 3 4
    42  2 6 7 8
    43  9 10 11 12
    44  
    45  query T
    46  SELECT feature_name FROM crdb_internal.feature_usage
    47  WHERE feature_name IN ('sql.schema.alter_table.alter_primary_key') AND usage_count > 0
    48  ORDER BY feature_name
    49  ----
    50  sql.schema.alter_table.alter_primary_key
    51  
    52  # Test primary key changes on storing indexes with different column families (the randomizer will do this for us).
    53  statement ok
    54  DROP TABLE t;
    55  CREATE TABLE t (
    56    x INT PRIMARY KEY, y INT, z INT NOT NULL, w INT, v INT,
    57    INDEX i1 (y) STORING (w, v), INDEX i2 (z) STORING (y, v)
    58  );
    59  INSERT INTO t VALUES (1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15);
    60  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (z);
    61  INSERT INTO t VALUES (16, 17, 18, 19, 20)
    62  
    63  query III rowsort
    64  SELECT y, w, v FROM t@i1
    65  ----
    66  2 4 5
    67  7 9 10
    68  12 14 15
    69  17 19 20
    70  
    71  query III rowsort
    72  SELECT y, z, v FROM t@i2
    73  ----
    74  2 3 5
    75  7 8 10
    76  12 13 15
    77  17 18 20
    78  
    79  # Test that composite values are encoded correctly in covering indexes.
    80  statement ok
    81  CREATE TABLE t_composite (x INT PRIMARY KEY, y DECIMAL NOT NULL);
    82  INSERT INTO t_composite VALUES (1, 1.0), (2, 1.001)
    83  
    84  statement ok
    85  ALTER TABLE t_composite ALTER PRIMARY KEY USING COLUMNS (y)
    86  
    87  query IT rowsort
    88  SELECT * FROM t_composite@primary
    89  ----
    90  1 1.0
    91  2 1.001
    92  
    93  # Test that we can drop tables after a primary key change.
    94  statement ok
    95  DROP TABLE t_composite
    96  
    97  # Test altering a primary key interleaving into another table.
    98  statement ok
    99  CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y), FAMILY (x, y));
   100  CREATE TABLE child (x INT PRIMARY KEY, y INT NOT NULL, z INT NOT NULL, FAMILY (x, y, z));
   101  INSERT INTO parent VALUES (1, 2), (4, 5);
   102  INSERT INTO child VALUES (1, 2, 3), (4, 5, 6);
   103  ALTER TABLE child ALTER PRIMARY KEY USING COLUMNS (x, y, z) INTERLEAVE IN PARENT parent(x, y)
   104  
   105  query TT
   106  SHOW CREATE child
   107  ----
   108  child  CREATE TABLE child (
   109             x INT8 NOT NULL,
   110             y INT8 NOT NULL,
   111             z INT8 NOT NULL,
   112             CONSTRAINT "primary" PRIMARY KEY (x ASC, y ASC, z ASC),
   113             UNIQUE INDEX child_x_key (x ASC),
   114             FAMILY fam_0_x_y_z (x, y, z)
   115         ) INTERLEAVE IN PARENT parent (x, y)
   116  
   117  
   118  query II rowsort
   119  SELECT * FROM parent
   120  ----
   121  1 2
   122  4 5
   123  
   124  query TTT
   125  SELECT * FROM [EXPLAIN SELECT * FROM child WHERE x >= 1 AND x < 5 AND y >= 2 AND y <= 6] OFFSET 2
   126  ----
   127  scan  ·            ·
   128  ·     table        child@primary
   129  ·     spans        /1/2/#/57/2-/4/6/#/57/3
   130  ·     filter       (y >= 2) AND (y <= 6)
   131  
   132  query III rowsort
   133  SELECT * FROM child WHERE x >= 1 AND x < 5 AND y >= 2 AND y <= 6
   134  ----
   135  1 2 3
   136  4 5 6
   137  
   138  statement error pq: cannot change primary key of table parent because table\(s\) \[child\] are interleaved into it
   139  ALTER TABLE parent ALTER PRIMARY KEY USING COLUMNS (x)
   140  
   141  statement ok
   142  CREATE TABLE child2 (x INT, y INT, z INT, PRIMARY KEY (x, y, z)) INTERLEAVE IN PARENT parent (x, y)
   143  
   144  statement error pq: cannot change primary key of table parent because table\(s\) \[child, child2\] are interleaved into it
   145  ALTER TABLE parent ALTER PRIMARY KEY USING COLUMNS (x)
   146  
   147  statement error pq: unimplemented: "parent" is interleaved by table "child"
   148  DROP TABLE parent
   149  
   150  statement ok
   151  DROP TABLE parent CASCADE
   152  
   153  # Test that we can change the primary key of an interleaved child.
   154  statement ok
   155  DROP TABLE IF EXISTS child;
   156  CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y), FAMILY (x, y));
   157  CREATE TABLE child (
   158    x INT, y INT NOT NULL, z INT NOT NULL,
   159    FAMILY (x, y, z), PRIMARY KEY (x, y, z)
   160  ) INTERLEAVE IN PARENT parent (x, y);
   161  INSERT INTO parent VALUES (1, 2), (4, 5);
   162  INSERT INTO child VALUES (1, 2, 3), (4, 5, 6);
   163  ALTER TABLE child ALTER PRIMARY KEY USING COLUMNS (y, z)
   164  
   165  query TT
   166  SHOW CREATE child
   167  ----
   168  child  CREATE TABLE child (
   169         x INT8 NOT NULL,
   170         y INT8 NOT NULL,
   171         z INT8 NOT NULL,
   172         CONSTRAINT "primary" PRIMARY KEY (y ASC, z ASC),
   173         UNIQUE INDEX child_x_y_z_key (x ASC, y ASC, z ASC),
   174         FAMILY fam_0_x_y_z (x, y, z)
   175  )
   176  
   177  query TTT
   178  SELECT * FROM [EXPLAIN SELECT * FROM child WHERE y >=2 AND y <= 6] OFFSET 2
   179  ----
   180  scan  ·      ·
   181  ·     table  child@primary
   182  ·     spans  /2-/7
   183  
   184  query III rowsort
   185  SELECT * FROM child WHERE y >=2 AND y <= 6
   186  ----
   187  1 2 3
   188  4 5 6
   189  
   190  # We can drop parent because it isn't an interleaved parent anymore.
   191  statement ok
   192  DROP TABLE parent
   193  
   194  # Test that we can change the primary key of an interleaved child
   195  # that also has a secondary index interleaved.
   196  statement ok
   197  DROP TABLE IF EXISTS child;
   198  CREATE TABLE parent (x INT PRIMARY KEY);
   199  CREATE TABLE child (
   200    x INT, y INT, PRIMARY KEY (x, y), z INT NOT NULL, W INT,
   201    FAMILY (x, y, z, w)
   202  ) INTERLEAVE IN PARENT parent (x);
   203  CREATE INDEX i ON child (x, w) INTERLEAVE IN PARENT parent (x);
   204  INSERT INTO parent VALUES (1);
   205  INSERT INTO child VALUES (1, 2, 3, 4);
   206  ALTER TABLE child ALTER PRIMARY KEY USING COLUMNS (x, y, z) INTERLEAVE IN PARENT parent (x)
   207  
   208  query TT
   209  SHOW CREATE child
   210  ----
   211  child  CREATE TABLE child (
   212           x INT8 NOT NULL,
   213           y INT8 NOT NULL,
   214           z INT8 NOT NULL,
   215           w INT8 NULL,
   216           CONSTRAINT "primary" PRIMARY KEY (x ASC, y ASC, z ASC),
   217           UNIQUE INDEX child_x_y_key (x ASC, y ASC),
   218           INDEX i (x ASC, w ASC) INTERLEAVE IN PARENT parent (x),
   219           FAMILY fam_0_x_y_z_w (x, y, z, w)
   220         ) INTERLEAVE IN PARENT parent (x)
   221  
   222  # If child@i was not properly rewritten, we wouldn't be able to select
   223  # all columns in child from it without an index join
   224  query TTT
   225  SELECT * FROM [EXPLAIN SELECT * FROM child@i] OFFSET 2
   226  ----
   227  scan  ·      ·
   228  ·     table  child@i
   229  ·     spans  FULL SCAN
   230  
   231  query IIII
   232  SELECT * FROM child@i
   233  ----
   234  1 2 3 4
   235  
   236  subtest foreign_keys
   237  
   238  # Test primary key changes on tables with inbound and outbound FK's.
   239  statement ok
   240  CREATE TABLE fk1 (x INT NOT NULL);
   241  CREATE TABLE fk2 (x INT NOT NULL, UNIQUE INDEX i (x));
   242  ALTER TABLE fk1 ADD CONSTRAINT fk FOREIGN KEY (x) REFERENCES fk2(x);
   243  INSERT INTO fk2 VALUES (1);
   244  INSERT INTO fk1 VALUES (1)
   245  
   246  statement ok
   247  ALTER TABLE fk1 ALTER PRIMARY KEY USING COLUMNS (x)
   248  
   249  statement ok
   250  INSERT INTO fk2 VALUES (2);
   251  INSERT INTO fk1 VALUES (2)
   252  
   253  statement ok
   254  ALTER TABLE fk2 ALTER PRIMARY KEY USING COLUMNS (x)
   255  
   256  statement ok
   257  INSERT INTO fk2 VALUES (3);
   258  INSERT INTO fk1 VALUES (3)
   259  
   260  # Test some self-referencing foreign keys.
   261  statement ok
   262  CREATE TABLE self (a INT PRIMARY KEY, x INT, y INT, z INT, w INT NOT NULL,
   263    INDEX (x), UNIQUE INDEX (y), INDEX (z));
   264  INSERT INTO self VALUES (1, 1, 1, 1, 1);
   265  ALTER TABLE self ADD CONSTRAINT fk1 FOREIGN KEY (z) REFERENCES self (y);
   266  ALTER TABLE self ADD CONSTRAINT fk2 FOREIGN KEY (x) REFERENCES self (y);
   267  
   268  statement ok
   269  ALTER TABLE self ALTER PRIMARY KEY USING COLUMNS (w)
   270  
   271  statement ok
   272  INSERT INTO self VALUES (2, 1, 2, 1, 2);
   273  INSERT INTO self VALUES (3, 2, 3, 2, 3)
   274  
   275  # Set up a bunch of foreign key references pointing into and out of a table.
   276  statement ok
   277  CREATE TABLE t1 (x INT PRIMARY KEY, y INT NOT NULL, z INT, w INT, INDEX (y), INDEX (z), UNIQUE INDEX (w));
   278  CREATE TABLE t2 (y INT, UNIQUE INDEX (y));
   279  CREATE TABLE t3 (z INT, UNIQUE INDEX (z));
   280  CREATE TABLE t4 (w INT, INDEX (w));
   281  CREATE TABLE t5 (x INT, INDEX (x));
   282  INSERT INTO t1 VALUES (1, 1, 1, 1);
   283  INSERT INTO t2 VALUES (1);
   284  INSERT INTO t3 VALUES (1);
   285  INSERT INTO t4 VALUES (1);
   286  INSERT INTO t5 VALUES (1);
   287  ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (y) REFERENCES t2(y);
   288  ALTER TABLE t1 ADD CONSTRAINT fk2 FOREIGN KEY (z) REFERENCES t3(z);
   289  ALTER TABLE t4 ADD CONSTRAINT fk3 FOREIGN KEY (w) REFERENCES t1(w);
   290  ALTER TABLE t5 ADD CONSTRAINT fk4 FOREIGN KEY (x) REFERENCES t1(x);
   291  ALTER TABLE t1 ALTER PRIMARY KEY USING COLUMNS (y)
   292  
   293  statement ok
   294  INSERT INTO t2 VALUES (5);
   295  INSERT INTO t3 VALUES (6);
   296  INSERT INTO t1 VALUES (7, 5, 6, 8);
   297  INSERT INTO t4 VALUES (8);
   298  INSERT INTO t5 VALUES (7)
   299  
   300  statement error insert on table "t1" violates foreign key constraint "fk1"
   301  INSERT INTO t1 VALUES (100, 100, 100, 100)
   302  
   303  statement error insert on table "t4" violates foreign key constraint "fk3"
   304  INSERT INTO t4 VALUES (101)
   305  
   306  # Ensure that we still rewrite a primary index if the index column has name "rowid".
   307  statement ok
   308  DROP TABLE IF EXISTS t;
   309  CREATE TABLE t (rowid INT PRIMARY KEY, y INT NOT NULL, FAMILY (rowid, y));
   310  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
   311  
   312  query TT
   313  SHOW CREATE t
   314  ----
   315  t  CREATE TABLE t (
   316     rowid INT8 NOT NULL,
   317     y INT8 NOT NULL,
   318     CONSTRAINT "primary" PRIMARY KEY (y ASC),
   319     UNIQUE INDEX t_rowid_key (rowid ASC),
   320     FAMILY fam_0_rowid_y (rowid, y)
   321  )
   322  
   323  subtest index_rewrites
   324  # Test that indexes that need to get rewritten indeed get rewritten.
   325  statement ok
   326  DROP TABLE IF EXISTS t;
   327  CREATE TABLE t (
   328    x INT PRIMARY KEY,
   329    y INT NOT NULL, -- will be new primary key.
   330    z INT NOT NULL,
   331    w INT,
   332    v JSONB,
   333    INDEX i1 (w), -- will get rewritten.
   334    INDEX i2 (y), -- will get rewritten.
   335    UNIQUE INDEX i3 (z) STORING (y), -- will not be rewritten.
   336    UNIQUE INDEX i4 (z), -- will be rewritten.
   337    UNIQUE INDEX i5 (w) STORING (y), -- will be rewritten.
   338    INVERTED INDEX i6 (v), -- will be rewritten.
   339    INDEX i7 (z) USING HASH WITH BUCKET_COUNT = 4, -- will be rewritten.
   340    FAMILY (x, y, z, w, v)
   341  );
   342  INSERT INTO t VALUES (1, 2, 3, 4, '{}');
   343  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
   344  
   345  query TT
   346  SHOW CREATE t
   347  ----
   348  t  CREATE TABLE t (
   349     x INT8 NOT NULL,
   350     y INT8 NOT NULL,
   351     z INT8 NOT NULL,
   352     w INT8 NULL,
   353     v JSONB NULL,
   354     CONSTRAINT "primary" PRIMARY KEY (y ASC),
   355     UNIQUE INDEX i3 (z ASC) STORING (y),
   356     UNIQUE INDEX t_x_key (x ASC),
   357     INDEX i1 (w ASC),
   358     INDEX i2 (y ASC),
   359     UNIQUE INDEX i4 (z ASC),
   360     UNIQUE INDEX i5 (w ASC) STORING (y),
   361     INVERTED INDEX i6 (v),
   362     INDEX i7 (z ASC) USING HASH WITH BUCKET_COUNT = 4,
   363     FAMILY fam_0_x_y_z_w_v_crdb_internal_z_shard_4 (x, y, z, w, v, crdb_internal_z_shard_4)
   364  )
   365  
   366  # Test that the indexes we expect got rewritten. All but i3 should have been rewritten,
   367  # so all but i3's indexID should be larger than 7.
   368  
   369  query IT
   370  SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_name = 't' ORDER BY index_id
   371  ----
   372  4 i3
   373  9 primary
   374  10 t_x_key
   375  11 i1
   376  12 i2
   377  13 i4
   378  14 i5
   379  15 i6
   380  16 i7
   381  
   382  # Make sure that each index can index join against the new primary key;
   383  
   384  query TTT
   385  SELECT * FROM [EXPLAIN SELECT * FROM t@i1] OFFSET 2
   386  ----
   387  index-join  ·            ·
   388   │          table        t@primary
   389   │          key columns  y
   390   └── scan   ·            ·
   391  ·           table        t@i1
   392  ·           spans        FULL SCAN
   393  
   394  query IIIIT
   395  SELECT * FROM t@i1
   396  ----
   397  1 2 3 4 {}
   398  
   399  query TTT
   400  SELECT * FROM [EXPLAIN SELECT * FROM t@i2] OFFSET 2
   401  ----
   402  index-join  ·            ·
   403   │          table        t@primary
   404   │          key columns  y
   405   └── scan   ·            ·
   406  ·           table        t@i2
   407  ·           spans        FULL SCAN
   408  
   409  query IIIIT
   410  SELECT * FROM t@i2
   411  ----
   412  1 2 3 4 {}
   413  
   414  query TTT
   415  SELECT * FROM [EXPLAIN SELECT * FROM t@i3] OFFSET 2
   416  ----
   417  index-join  ·            ·
   418   │          table        t@primary
   419   │          key columns  y
   420   └── scan   ·            ·
   421  ·           table        t@i3
   422  ·           spans        FULL SCAN
   423  
   424  query IIIIT
   425  SELECT * FROM t@i3
   426  ----
   427  1 2 3 4 {}
   428  
   429  query TTT
   430  SELECT * FROM [EXPLAIN SELECT * FROM t@i4] OFFSET 2
   431  ----
   432  index-join  ·            ·
   433   │          table        t@primary
   434   │          key columns  y
   435   └── scan   ·            ·
   436  ·           table        t@i4
   437  ·           spans        FULL SCAN
   438  
   439  query IIIIT
   440  SELECT * FROM t@i4
   441  ----
   442  1 2 3 4 {}
   443  
   444  query TTT
   445  SELECT * FROM [EXPLAIN SELECT * FROM t@i5] OFFSET 2
   446  ----
   447  index-join  ·            ·
   448   │          table        t@primary
   449   │          key columns  y
   450   └── scan   ·            ·
   451  ·           table        t@i5
   452  ·           spans        FULL SCAN
   453  
   454  query IIIIT
   455  SELECT * FROM t@i5
   456  ----
   457  1 2 3 4 {}
   458  
   459  query TTT
   460  SELECT * FROM [EXPLAIN SELECT * FROM t@i7] OFFSET 2
   461  ----
   462  index-join  ·            ·
   463   │          table        t@primary
   464   │          key columns  y
   465   └── scan   ·            ·
   466  ·           table        t@i7
   467  ·           spans        FULL SCAN
   468  
   469  query IIIIT
   470  SELECT * FROM t@i5
   471  ----
   472  1 2 3 4 {}
   473  
   474  subtest hash_sharded
   475  
   476  statement ok
   477  DROP TABLE IF EXISTS t;
   478  CREATE TABLE t (
   479    x INT PRIMARY KEY,
   480    y INT NOT NULL,
   481    z INT,
   482    INDEX i1 (z) USING HASH WITH BUCKET_COUNT = 5,
   483    FAMILY (x, y, z)
   484  );
   485  INSERT INTO t VALUES (1, 2, 3);
   486  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y) USING HASH WITH BUCKET_COUNT = 10
   487  
   488  query TT
   489  SHOW CREATE t
   490  ----
   491  t  CREATE TABLE t (
   492     x INT8 NOT NULL,
   493     y INT8 NOT NULL,
   494     z INT8 NULL,
   495     CONSTRAINT "primary" PRIMARY KEY (y ASC) USING HASH WITH BUCKET_COUNT = 10,
   496     UNIQUE INDEX t_x_key (x ASC),
   497     INDEX i1 (z ASC) USING HASH WITH BUCKET_COUNT = 5,
   498     FAMILY fam_0_x_y_z_crdb_internal_z_shard_5 (x, y, z, crdb_internal_z_shard_5, crdb_internal_y_shard_10)
   499  )
   500  
   501  query TTT
   502  SELECT * FROM [EXPLAIN INSERT INTO t VALUES (4, 5, 6)] OFFSET 2
   503  ----
   504  count                  ·            ·
   505   └── insert-fast-path  ·            ·
   506  ·                      into         t(x, y, z, crdb_internal_z_shard_5, crdb_internal_y_shard_10)
   507  ·                      strategy     inserter
   508  ·                      auto commit  ·
   509  ·                      size         7 columns, 1 row
   510  
   511  # Ensure that all of the indexes have been rewritten.
   512  query IT
   513  SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_name = 't' ORDER BY index_id
   514  ----
   515  3 primary
   516  4 t_x_key
   517  5 i1
   518  
   519  query III
   520  SELECT * FROM t@primary
   521  ----
   522  1 2 3
   523  
   524  query III
   525  SELECT * FROM t@t_x_key
   526  ----
   527  1 2 3
   528  
   529  query III
   530  SELECT * FROM t@i1
   531  ----
   532  1 2 3
   533  
   534  statement error pq: interleaved indexes cannot also be hash sharded
   535  DROP TABLE IF EXISTS parent, t CASCADE;
   536  CREATE TABLE parent (x INT PRIMARY KEY);
   537  CREATE TABLE t (x INT NOT NULL, y INT NOT NULL);
   538  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x, y) USING HASH WITH BUCKET_COUNT = 10 INTERLEAVE IN PARENT parent (x)
   539  
   540  statement ok
   541  DROP TABLE IF EXISTS t;
   542  CREATE TABLE t (
   543    x INT PRIMARY KEY USING HASH WITH BUCKET_COUNT=5,
   544    y INT NOT NULL,
   545    z INT,
   546    INDEX i (z),
   547    FAMILY (x, y, z)
   548  );
   549  INSERT INTO t VALUES (1, 2, 3);
   550  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
   551  
   552  query TT
   553  SHOW CREATE t
   554  ----
   555  t  CREATE TABLE t (
   556     x INT8 NOT NULL,
   557     y INT8 NOT NULL,
   558     z INT8 NULL,
   559     CONSTRAINT "primary" PRIMARY KEY (y ASC),
   560     UNIQUE INDEX t_crdb_internal_x_shard_5_x_key (x ASC) USING HASH WITH BUCKET_COUNT = 5,
   561     INDEX i (z ASC),
   562     FAMILY fam_0_x_y_z_crdb_internal_x_shard_5 (x, y, z, crdb_internal_x_shard_5)
   563  )
   564  
   565  query III
   566  SELECT * FROM t@t_crdb_internal_x_shard_5_x_key
   567  ----
   568  1 2 3
   569  
   570  query III
   571  SELECT * FROM t@i
   572  ----
   573  1 2 3
   574  
   575  # Ensure we don't rewrite default primary index even if its name isn't rowid.
   576  statement ok
   577  DROP TABLE IF EXISTS t;
   578  CREATE TABLE t (rowid INT NOT NULL);
   579  
   580  query TT
   581  SHOW CREATE t
   582  ----
   583  t  CREATE TABLE t (
   584     rowid INT8 NOT NULL,
   585     FAMILY "primary" (rowid, rowid_1)
   586  )
   587  
   588  statement ok
   589  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (rowid)
   590  
   591  query TT
   592  SHOW CREATE t
   593  ----
   594  t  CREATE TABLE t (
   595     rowid INT8 NOT NULL,
   596     CONSTRAINT "primary" PRIMARY KEY (rowid ASC),
   597     FAMILY "primary" (rowid, rowid_1)
   598  )
   599  
   600  # Regression for old primary key not using PrimaryIndexEncoding as its encoding type.
   601  subtest encoding_bug
   602  
   603  # This test ensures that while the old primary key is in the mutations list it is
   604  # able to be updated and deleted with the primary index encoding.
   605  statement ok
   606  DROP TABLE IF EXISTS t;
   607  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, z INT NOT NULL, FAMILY (x, y, z));
   608  INSERT INTO t VALUES (1, 2, 3);
   609  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (z);
   610  UPDATE t SET y = 3 WHERE z = 3
   611  
   612  # Test for #45363.
   613  
   614  statement ok
   615  DROP TABLE IF EXISTS t;
   616  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
   617  
   618  statement ok
   619  BEGIN
   620  
   621  statement ok
   622  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
   623  
   624  statement error pq: unimplemented: cannot perform other schema changes in the same transaction as a primary key change
   625  CREATE INDEX ON t (y)
   626  
   627  statement ok
   628  ROLLBACK
   629  
   630  statement ok
   631  DROP TABLE IF EXISTS t;
   632  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
   633  
   634  statement ok
   635  BEGIN
   636  
   637  statement ok
   638  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y)
   639  
   640  statement error pq: unimplemented: cannot perform other schema changes in the same transaction as a primary key change
   641  ALTER TABLE t ADD COLUMN z INT
   642  
   643  statement ok
   644  ROLLBACK
   645  
   646  subtest add_pk_rowid
   647  # Tests for #45509.
   648  statement ok
   649  DROP TABLE IF EXISTS t;
   650  CREATE TABLE t (x INT PRIMARY KEY)
   651  
   652  statement error pq: multiple primary keys for table "t" are not allowed
   653  ALTER TABLE t ADD PRIMARY KEY (x)
   654  
   655  statement ok
   656  DROP TABLE IF EXISTS t;
   657  CREATE TABLE t (x INT NOT NULL)
   658  
   659  statement ok
   660  ALTER TABLE t ADD PRIMARY KEY (x)
   661  
   662  query TT
   663  SHOW CREATE t
   664  ----
   665  t  CREATE TABLE t (
   666     x INT8 NOT NULL,
   667     CONSTRAINT "primary" PRIMARY KEY (x ASC),
   668     FAMILY "primary" (x, rowid)
   669  )
   670  
   671  statement ok
   672  DROP TABLE IF EXISTS t1, t2 CASCADE;
   673  CREATE TABLE t1 (x INT PRIMARY KEY);
   674  CREATE TABLE t2 (x INT NOT NULL, y INT NOT NULL, FAMILY (x, y));
   675  ALTER TABLE t2 ADD PRIMARY KEY (x, y) INTERLEAVE IN PARENT t1 (x)
   676  
   677  query TT
   678  SHOW CREATE t2
   679  ----
   680  t2 CREATE TABLE t2 (
   681       x INT8 NOT NULL,
   682       y INT8 NOT NULL,
   683       CONSTRAINT "primary" PRIMARY KEY (x ASC, y ASC),
   684       FAMILY fam_0_x_y_rowid (x, y, rowid)
   685  ) INTERLEAVE IN PARENT t1 (x)
   686  
   687  # Check that changing the primary key of a table removes interleave
   688  # backreferences from the parent. The final drop will succeed if
   689  # the backreferences have been removed.
   690  statement ok
   691  DROP TABLE IF EXISTS t1, t2 CASCADE;
   692  CREATE TABLE t1 (x INT PRIMARY KEY);
   693  CREATE TABLE t2 (x INT, y INT, PRIMARY KEY (x, y), FAMILY (x, y)) INTERLEAVE IN PARENT t1 (x);
   694  ALTER TABLE t2 ALTER PRIMARY KEY USING COLUMNS (x, y);
   695  DROP TABLE t1
   696  
   697  statement ok
   698  DROP TABLE IF EXISTS t;
   699  CREATE TABLE t (x INT NOT NULL);
   700  ALTER TABLE t ADD PRIMARY KEY (x) USING HASH WITH BUCKET_COUNT=4
   701  
   702  query TT
   703  SHOW CREATE t
   704  ----
   705  t  CREATE TABLE t (
   706     x INT8 NOT NULL,
   707     CONSTRAINT "primary" PRIMARY KEY (x ASC) USING HASH WITH BUCKET_COUNT = 4,
   708     FAMILY "primary" (x, rowid, crdb_internal_x_shard_4)
   709  )
   710  
   711  statement ok
   712  DROP TABLE IF EXISTS t;
   713  CREATE TABLE t (x INT NOT NULL);
   714  ALTER TABLE t ADD CONSTRAINT "primary" PRIMARY KEY (x)
   715  
   716  query TT
   717  SHOW CREATE t
   718  ----
   719  t  CREATE TABLE t (
   720     x INT8 NOT NULL,
   721     CONSTRAINT "primary" PRIMARY KEY (x ASC),
   722     FAMILY "primary" (x, rowid)
   723  )
   724  
   725  # Regression for #45362.
   726  statement ok
   727  DROP TABLE IF EXISTS t;
   728  CREATE TABLE t (x INT NOT NULL)
   729  
   730  statement ok
   731  BEGIN
   732  
   733  statement ok
   734  ALTER TABLE t ADD COLUMN y INT
   735  
   736  statement error pq: unimplemented: cannot perform a primary key change on t with other schema changes on t in the same transaction
   737  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x)
   738  
   739  statement ok
   740  ROLLBACK
   741  
   742  # Ensure that starting a primary key change that does not
   743  # enqueue any mutations doesn't start a job.
   744  # TODO (rohany): This test might become obselete when #44923 is fixed.
   745  statement ok
   746  DROP TABLE IF EXISTS t;
   747  CREATE TABLE t (x INT NOT NULL);
   748  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x)
   749  
   750  query I
   751  SELECT job_id FROM [SHOW JOBS] WHERE
   752  description = 'CLEANUP JOB for ''ALTER TABLE test.public.t ALTER PRIMARY KEY USING COLUMNS (y)''' AND
   753  status = 'running'
   754  ----
   755  
   756  subtest add_drop_pk
   757  
   758  statement ok
   759  DROP TABLE IF EXISTS t;
   760  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y))
   761  
   762  statement error pq: unimplemented: primary key of table t dropped without subsequent addition of new primary key
   763  ALTER TABLE t DROP CONSTRAINT "primary"
   764  
   765  statement error pq: multiple primary keys for table "t" are not allowed
   766  ALTER TABLE t ADD CONSTRAINT "primary" PRIMARY KEY (y), DROP CONSTRAINT "primary"
   767  
   768  statement error pq: multiple primary keys for table "t" are not allowed
   769  ALTER TABLE t ADD CONSTRAINT "primary" PRIMARY KEY (y)
   770  
   771  statement ok
   772  ALTER TABLE t DROP CONSTRAINT "primary", ADD CONSTRAINT "primary" PRIMARY KEY (y)
   773  
   774  query TT
   775  SHOW CREATE t
   776  ----
   777  t  CREATE TABLE t (
   778     x INT8 NOT NULL,
   779     y INT8 NOT NULL,
   780     CONSTRAINT "primary" PRIMARY KEY (y ASC),
   781     FAMILY fam_0_x (x),
   782     FAMILY fam_1_y (y)
   783  )
   784  
   785  # Test that we can issue a DROP CONSTRAINT + ADD PRIMARY KEY
   786  # in the same transaction.
   787  statement ok
   788  DROP TABLE t;
   789  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y))
   790  
   791  statement ok
   792  BEGIN
   793  
   794  statement ok
   795  ALTER TABLE t DROP CONSTRAINT "primary"
   796  
   797  statement ok
   798  ALTER TABLE t ADD CONSTRAINT "primary" PRIMARY KEY (y)
   799  
   800  statement ok
   801  COMMIT
   802  
   803  query TT
   804  SHOW CREATE t
   805  ----
   806  t  CREATE TABLE t (
   807     x INT8 NOT NULL,
   808     y INT8 NOT NULL,
   809     CONSTRAINT "primary" PRIMARY KEY (y ASC),
   810     FAMILY fam_0_x (x),
   811     FAMILY fam_1_y (y)
   812  )
   813  
   814  # Ensure that we can't use a table with a dropped primary key
   815  # in any DML statements.
   816  statement ok
   817  DROP TABLE t;
   818  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
   819  
   820  statement ok
   821  BEGIN
   822  
   823  statement ok
   824  ALTER TABLE t DROP CONSTRAINT "primary"
   825  
   826  statement error pgcode 55C02 requested table does not have a primary key
   827  INSERT INTO t VALUES (1, 1)
   828  
   829  statement ok
   830  ROLLBACK
   831  
   832  statement ok
   833  BEGIN
   834  
   835  statement ok
   836  ALTER TABLE t DROP CONSTRAINT "primary"
   837  
   838  statement error pgcode 55C02 pq: requested table does not have a primary key
   839  DELETE FROM t WHERE x = 1
   840  
   841  statement ok
   842  ROLLBACK
   843  
   844  statement ok
   845  BEGIN
   846  
   847  statement ok
   848  ALTER TABLE t DROP CONSTRAINT "primary"
   849  
   850  statement error pgcode 55C02 pq: requested table does not have a primary key
   851  UPDATE t SET x = 1 WHERE y = 1
   852  
   853  statement ok
   854  ROLLBACK
   855  
   856  statement ok
   857  BEGIN
   858  
   859  statement ok
   860  ALTER TABLE t DROP CONSTRAINT "primary"
   861  
   862  statement error pgcode 55C02 pq: requested table does not have a primary key
   863  SELECT * FROM t
   864  
   865  statement ok
   866  ROLLBACK
   867  
   868  # Ensure that DDL statements that don't add a primary key
   869  # as their first operation don't succeed either.
   870  
   871  statement ok
   872  BEGIN
   873  
   874  statement ok
   875  ALTER TABLE t DROP CONSTRAINT "primary"
   876  
   877  statement error pgcode 55C02 pq: requested table does not have a primary key
   878  CREATE INDEX ON t(x)
   879  
   880  statement ok
   881  ROLLBACK
   882  
   883  statement ok
   884  BEGIN
   885  
   886  statement ok
   887  ALTER TABLE t DROP CONSTRAINT "primary"
   888  
   889  statement error pgcode 55C02 pq: requested table does not have a primary key
   890  ALTER TABLE t ADD COLUMN z INT
   891  
   892  statement ok
   893  ROLLBACK
   894  
   895  statement ok
   896  BEGIN
   897  
   898  statement ok
   899  ALTER TABLE t DROP CONSTRAINT "primary"
   900  
   901  statement error pgcode 55C02 pq: requested table does not have a primary key
   902  ALTER TABLE t ADD COLUMN z INT, ADD PRIMARY KEY (x)
   903  
   904  statement ok
   905  ROLLBACK
   906  
   907  # Ensure that other changes in the same transaction
   908  # as a DROP PRIMARY KEY get rolled back on failure.
   909  statement ok
   910  DROP TABLE IF EXISTS t1, t2;
   911  CREATE TABLE t1 (x INT PRIMARY KEY, y INT NOT NULL);
   912  CREATE TABLE t2 (x INT)
   913  
   914  statement ok
   915  BEGIN
   916  
   917  statement ok
   918  ALTER TABLE t1 DROP CONSTRAINT "primary"
   919  
   920  statement ok
   921  INSERT INTO t2 VALUES (1)
   922  
   923  statement error pq: unimplemented: primary key of table t1 dropped without subsequent addition of new primary key
   924  COMMIT
   925  
   926  query I
   927  SELECT * FROM t2
   928  ----
   929  
   930  statement ok
   931  DROP TABLE IF EXISTS t;
   932  CREATE TABLE t (x INT PRIMARY KEY, y INT NOT NULL)
   933  
   934  statement error pq: table "t" does not have a primary key, cannot perform ADD COLUMN z INT8 AS \(x \+ 1\) STORED
   935  ALTER TABLE t DROP CONSTRAINT "primary", ADD COLUMN z INT AS (x + 1) STORED, ADD PRIMARY KEY (y)
   936  
   937  statement ok
   938  DROP TABLE IF EXISTS t, t2 CASCADE;
   939  CREATE TABLE t (x INT PRIMARY KEY);
   940  CREATE TABLE t2 (x INT PRIMARY KEY, y INT NOT NULL, FAMILY (x), FAMILY (y));
   941  ALTER TABLE t2 DROP CONSTRAINT "primary", ADD CONSTRAINT "primary" PRIMARY KEY (x, y) INTERLEAVE IN PARENT t(x)
   942  
   943  query TT
   944  SHOW CREATE t2
   945  ----
   946  t2  CREATE TABLE t2 (
   947      x INT8 NOT NULL,
   948      y INT8 NOT NULL,
   949      CONSTRAINT "primary" PRIMARY KEY (x ASC, y ASC),
   950      FAMILY fam_0_x (x),
   951      FAMILY fam_1_y (y)
   952  ) INTERLEAVE IN PARENT t (x)
   953  
   954  subtest create_table_change_pk
   955  
   956  statement ok
   957  DROP TABLE IF EXISTS t CASCADE
   958  
   959  statement ok
   960  BEGIN
   961  
   962  statement ok
   963  CREATE TABLE t (x INT NOT NULL, y INT, FAMILY (x, y), INDEX (y))
   964  
   965  statement ok
   966  ALTER TABLE t ADD PRIMARY KEY (x)
   967  
   968  statement ok
   969  COMMIT
   970  
   971  query TT
   972  SHOW CREATE t
   973  ----
   974  t  CREATE TABLE t (
   975     x INT8 NOT NULL,
   976     y INT8 NULL,
   977     CONSTRAINT "primary" PRIMARY KEY (x ASC),
   978     INDEX t_y_idx (y ASC),
   979     FAMILY fam_0_x_y_rowid (x, y, rowid)
   980  )
   981  
   982  # Ensure that index y got rewritten. If it was not rewritten,
   983  # it would have an id less than 3.
   984  query IT
   985  SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_name = 't' ORDER BY index_id
   986  ----
   987  3  primary
   988  4  t_y_idx
   989  
   990  # Repeat the above test using ALTER PRIMARY KEY.
   991  
   992  statement ok
   993  DROP TABLE IF EXISTS t
   994  
   995  statement ok
   996  BEGIN
   997  
   998  statement ok
   999  CREATE TABLE t (x INT NOT NULL, y INT, FAMILY (x, y), INDEX (y))
  1000  
  1001  statement ok
  1002  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x)
  1003  
  1004  statement ok
  1005  COMMIT
  1006  
  1007  query TT
  1008  SHOW CREATE t
  1009  ----
  1010  t  CREATE TABLE t (
  1011     x INT8 NOT NULL,
  1012     y INT8 NULL,
  1013     CONSTRAINT "primary" PRIMARY KEY (x ASC),
  1014     INDEX t_y_idx (y ASC),
  1015     FAMILY fam_0_x_y_rowid (x, y, rowid)
  1016  )
  1017  
  1018  # Ensure that index y got rewritten. If it was not rewritten,
  1019  # it would have an id less than 3.
  1020  query IT
  1021  SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_name = 't' ORDER BY index_id
  1022  ----
  1023  3  primary
  1024  4  t_y_idx
  1025  
  1026  # Try interleaving into another table.
  1027  
  1028  statement ok
  1029  DROP TABLE IF EXISTS t1, t2
  1030  
  1031  statement ok
  1032  CREATE TABLE t1 (x INT PRIMARY KEY)
  1033  
  1034  statement ok
  1035  BEGIN
  1036  
  1037  statement ok
  1038  CREATE TABLE t2 (x INT NOT NULL, y INT NOT NULL, FAMILY (x, y))
  1039  
  1040  statement ok
  1041  ALTER TABLE t2 ADD PRIMARY KEY (x, y) INTERLEAVE IN PARENT t1 (x)
  1042  
  1043  statement ok
  1044  COMMIT
  1045  
  1046  query TT
  1047  SHOW CREATE t2
  1048  ----
  1049  t2 CREATE TABLE t2 (
  1050       x INT8 NOT NULL,
  1051       y INT8 NOT NULL,
  1052       CONSTRAINT "primary" PRIMARY KEY (x ASC, y ASC),
  1053       FAMILY fam_0_x_y_rowid (x, y, rowid)
  1054     ) INTERLEAVE IN PARENT t1 (x)
  1055  
  1056  # We should get an error if we try to drop t1.
  1057  statement error pq: unimplemented: "t1" is interleaved by table "t2"
  1058  DROP TABLE t1
  1059  
  1060  # De-interleave t2.
  1061  statement ok
  1062  ALTER TABLE t2 ALTER PRIMARY KEY USING COLUMNS (x, y)
  1063  
  1064  statement ok
  1065  DROP TABLE t1
  1066  
  1067  # Test that we can de-interleave a table in the same txn.
  1068  statement ok
  1069  DROP TABLE IF EXISTS t1, t2
  1070  
  1071  statement ok
  1072  CREATE TABLE t1 (x INT PRIMARY KEY)
  1073  
  1074  statement ok
  1075  BEGIN
  1076  
  1077  statement ok
  1078  CREATE TABLE t2 (x INT NOT NULL, y INT NOT NULL, FAMILY (x, y))
  1079  
  1080  statement ok
  1081  ALTER TABLE t2 ADD PRIMARY KEY (x, y) INTERLEAVE IN PARENT t1 (x)
  1082  
  1083  statement ok
  1084  ALTER TABLE t2 ALTER PRIMARY KEY USING COLUMNS (x, y)
  1085  
  1086  # If we can drop t1, then t2 has been de-interleaved successfully.
  1087  statement ok
  1088  DROP TABLE t1
  1089  
  1090  statement ok
  1091  COMMIT
  1092  
  1093  # Test when multiple indexes get created and destroyed.
  1094  statement ok
  1095  DROP TABLE IF EXISTS t
  1096  
  1097  statement ok
  1098  BEGIN
  1099  
  1100  statement ok
  1101  CREATE TABLE t (
  1102    x INT NOT NULL, y INT, z INT, w INT,
  1103    INDEX i1 (y), UNIQUE INDEX i2 (z),
  1104    INDEX i3 (w) STORING (y, z),
  1105    FAMILY (x, y, z, w)
  1106  )
  1107  
  1108  statement ok
  1109  ALTER TABLE t ADD PRIMARY KEY (x)
  1110  
  1111  statement ok
  1112  COMMIT
  1113  
  1114  query TT
  1115  SHOW CREATE t
  1116  ----
  1117  t  CREATE TABLE t (
  1118     x INT8 NOT NULL,
  1119     y INT8 NULL,
  1120     z INT8 NULL,
  1121     w INT8 NULL,
  1122     CONSTRAINT "primary" PRIMARY KEY (x ASC),
  1123     INDEX i1 (y ASC),
  1124     UNIQUE INDEX i2 (z ASC),
  1125     INDEX i3 (w ASC) STORING (y, z),
  1126     FAMILY fam_0_x_y_z_w_rowid (x, y, z, w, rowid)
  1127  )
  1128  
  1129  # All index id's should be larger than 4.
  1130  query IT
  1131  SELECT index_id, index_name FROM crdb_internal.table_indexes WHERE descriptor_name = 't' ORDER BY index_id
  1132  ----
  1133  5  primary
  1134  6  i1
  1135  7  i2
  1136  8  i3
  1137  
  1138  # Regression for #45889.
  1139  # Primary key changes on a hash sharded index that just change the bucket
  1140  # count shouldn't cause the old primary key to be copied.
  1141  statement ok
  1142  DROP TABLE IF EXISTS t CASCADE;
  1143  CREATE TABLE t (x INT PRIMARY KEY USING HASH WITH BUCKET_COUNT = 2);
  1144  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (x) USING HASH WITH BUCKET_COUNT=3
  1145  
  1146  query TT
  1147  SHOW CREATE t
  1148  ----
  1149  t  CREATE TABLE t (
  1150     x INT8 NOT NULL,
  1151     CONSTRAINT "primary" PRIMARY KEY (x ASC) USING HASH WITH BUCKET_COUNT = 3,
  1152     FAMILY "primary" (crdb_internal_x_shard_2, x, crdb_internal_x_shard_3)
  1153  )
  1154  
  1155  # Changes on a hash sharded index that change the columns will cause the old
  1156  # primary key to be copied.
  1157  statement ok
  1158  DROP TABLE t;
  1159  CREATE TABLE t (x INT PRIMARY KEY USING HASH WITH BUCKET_COUNT = 2, y INT NOT NULL, FAMILY (x, y));
  1160  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y) USING HASH WITH BUCKET_COUNT=2
  1161  
  1162  query TT
  1163  SHOW CREATE t
  1164  ----
  1165  t  CREATE TABLE t (
  1166     x INT8 NOT NULL,
  1167     y INT8 NOT NULL,
  1168     CONSTRAINT "primary" PRIMARY KEY (y ASC) USING HASH WITH BUCKET_COUNT = 2,
  1169     UNIQUE INDEX t_crdb_internal_x_shard_2_x_key (x ASC) USING HASH WITH BUCKET_COUNT = 2,
  1170     FAMILY fam_0_x_y_crdb_internal_x_shard_2 (x, y, crdb_internal_x_shard_2, crdb_internal_y_shard_2)
  1171  )
  1172  
  1173  # Regression for #49079.
  1174  statement ok
  1175  DROP TABLE t;
  1176  CREATE TABLE t (x INT, y INT, z INT, PRIMARY KEY (x, y));
  1177  ALTER TABLE t ALTER PRIMARY KEY USING COLUMNS (y);
  1178  SET sql_safe_updates=false;
  1179  ALTER TABLE t DROP COLUMN z