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