github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/logictest/testdata/logic_test/fk (about) 1 # LogicTest: !3node-tenant 2 # The tests in this file target the legacy FK paths. 3 statement ok 4 SET optimizer_foreign_keys = false 5 6 # Disable automatic stats to avoid flakiness. 7 statement ok 8 SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false 9 10 statement ok 11 CREATE TABLE customers (id INT PRIMARY KEY, email STRING UNIQUE, FAMILY (id), FAMILY (email)) 12 13 statement ok 14 INSERT INTO customers VALUES (1, 'a@co.tld'), (2, 'b@co.tld') 15 16 statement ok 17 CREATE TABLE products (sku STRING PRIMARY KEY, upc STRING UNIQUE, vendor STRING, FAMILY (sku), FAMILY (upc, vendor)) 18 19 statement ok 20 INSERT INTO products VALUES ('VP-W9QH-W44L', '867072000006', 'Dave'), ('780', '885155001450', 'iRobot') 21 22 statement error pgcode 42P01 relation "productz" does not exist 23 CREATE TABLE missing (product STRING REFERENCES productz) 24 25 statement error pgcode 42P01 relation "customerz" does not exist 26 CREATE TABLE missing_with_col (customer INT REFERENCES customerz (id)) 27 28 statement error pgcode 42703 column "idz" does not exist 29 CREATE TABLE missing_col (customer INT REFERENCES customers (idz)) 30 31 statement ok 32 CREATE TABLE unindexed (customer INT REFERENCES customers) 33 34 query TTBITTBB colnames 35 SHOW INDEXES FROM unindexed 36 ---- 37 table_name index_name non_unique seq_in_index column_name direction storing implicit 38 unindexed primary false 1 rowid ASC false false 39 unindexed unindexed_auto_index_fk_customer_ref_customers true 1 customer ASC false false 40 unindexed unindexed_auto_index_fk_customer_ref_customers true 2 rowid ASC false true 41 42 statement error there is no unique constraint matching given keys for referenced table products 43 CREATE TABLE non_unique (product STRING REFERENCES products (vendor)) 44 45 statement error type of "customer" \(int\) does not match foreign key "customers"."email" \(string\) 46 CREATE TABLE mismatch (customer INT REFERENCES customers (email)) 47 48 statement ok 49 CREATE TABLE orders ( 50 id INT, 51 shipment INT, 52 product STRING DEFAULT 'sprockets' REFERENCES products, 53 customer INT CONSTRAINT valid_customer REFERENCES customers (id), 54 PRIMARY KEY (id, shipment), 55 INDEX (product), 56 INDEX (customer), 57 FAMILY (id, shipment), FAMILY (product, customer) 58 ) 59 60 statement ok 61 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 62 63 statement ok 64 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE NO ACTION 65 66 statement ok 67 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 68 69 statement ok 70 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON UPDATE NO ACTION 71 72 statement ok 73 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 74 75 statement ok 76 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE CASCADE 77 78 statement ok 79 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 80 81 statement ok 82 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON UPDATE CASCADE 83 84 statement ok 85 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 86 87 statement ok 88 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE SET NULL 89 90 statement ok 91 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 92 93 statement ok 94 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON UPDATE SET NULL 95 96 statement ok 97 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 98 99 statement ok 100 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE SET DEFAULT 101 102 statement ok 103 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 104 105 statement ok 106 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON UPDATE SET DEFAULT 107 108 statement ok 109 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 110 111 statement ok 112 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE RESTRICT ON UPDATE NO ACTION 113 114 statement ok 115 ALTER TABLE orders DROP CONSTRAINT fk_product_ref_products 116 117 statement ok 118 ALTER TABLE orders ADD FOREIGN KEY (product) REFERENCES products ON DELETE RESTRICT ON UPDATE RESTRICT 119 120 statement ok 121 ALTER TABLE orders VALIDATE CONSTRAINT fk_product_ref_products 122 123 statement ok 124 CREATE DATABASE "user content" 125 126 # "reviews" makes "products" have multiple inbound references, as well as making 127 # "orders" have both directions, and makes sure that we're handling escaping and 128 # cross-database references. 129 statement ok 130 CREATE TABLE "user content"."customer reviews" ( 131 id INT PRIMARY KEY, 132 product STRING NOT NULL REFERENCES products, 133 customer INT, 134 "order" INT, 135 shipment int, 136 body STRING, 137 CONSTRAINT customerfk FOREIGN KEY (customer) REFERENCES customers, 138 CONSTRAINT orderfk FOREIGN KEY ("order", shipment) REFERENCES orders (id, shipment), 139 INDEX (product), 140 INDEX (customer), 141 INDEX ("order") 142 ) 143 144 statement ok 145 INSERT INTO orders VALUES (1, 1, '780', 2) 146 147 statement error foreign key violation: value \['fake'\] not found in products@primary 148 SET tracing = on,kv,results; INSERT INTO orders VALUES (2, 2, 'fake', 2) 149 150 statement ok 151 SET tracing = off 152 153 query T rowsort 154 SELECT message FROM [SHOW KV TRACE FOR SESSION] 155 WHERE message LIKE 'FKScan%' 156 ---- 157 FKScan /Table/54/1/"fake"/{0-1} 158 FKScan /Table/53/1/2/{0-1} 159 160 statement error pgcode 23503 foreign key violation: values \['780'\] in columns \[sku\] referenced in table "orders" 161 DELETE FROM products 162 163 statement ok 164 INSERT INTO "user content"."customer reviews" VALUES (1, '780', 2, 1, 1, NULL) 165 166 statement error pgcode 23503 foreign key violation: value \['790'\] not found in products@primary \[sku\] 167 INSERT INTO "user content"."customer reviews" (id, product, body) VALUES (2, '790', 'would not buy again') 168 169 statement ok 170 INSERT INTO "user content"."customer reviews" (id, product, body) VALUES (2, '780', 'would not buy again') 171 172 statement ok 173 CREATE TABLE "user content".review_stats ( 174 id INT PRIMARY KEY, 175 upvotes INT, 176 CONSTRAINT reviewfk FOREIGN KEY (id) REFERENCES "user content"."customer reviews" 177 ) 178 179 query TTTTB 180 SHOW CONSTRAINTS FROM "user content".review_stats 181 ---- 182 review_stats primary PRIMARY KEY PRIMARY KEY (id ASC) true 183 review_stats reviewfk FOREIGN KEY FOREIGN KEY (id) REFERENCES "customer reviews"(id) true 184 185 statement error pgcode 23503 foreign key violation: value \[5\] not found in customer reviews@primary \[id\] 186 INSERT INTO "user content".review_stats (id, upvotes) VALUES (5, 1) 187 188 statement ok 189 INSERT INTO "user content".review_stats (id, upvotes) VALUES (2, 1) 190 191 statement error pgcode 23503 foreign key violation: values \[2\] in columns \[id\] referenced in table "review_stats" 192 DELETE FROM "user content"."customer reviews" WHERE id = 2 193 194 statement ok 195 ALTER TABLE "user content".review_stats DROP CONSTRAINT reviewfk 196 197 query TTTTB 198 SHOW CONSTRAINTS FROM "user content".review_stats 199 ---- 200 review_stats primary PRIMARY KEY PRIMARY KEY (id ASC) true 201 202 statement ok 203 DELETE FROM "user content"."customer reviews" 204 205 statement error pgcode 23503 foreign key violation: value \['790'\] not found in products@primary \[sku\] 206 INSERT INTO orders VALUES (2, 1, '790', 2) 207 208 statement error pgcode 23503 foreign key violation: value \[43\] not found in customers@primary \[id\] 209 INSERT INTO orders VALUES (2, 1, '780', 43) 210 211 statement ok 212 INSERT INTO orders VALUES (2, 1, '780', 1) 213 214 # Try to point to missing FK. 215 statement error pgcode 23503 foreign key violation: value \['790'\] not found in products@primary \[sku\] 216 UPDATE orders SET product = '790' WHERE id = 2 217 218 # Try to point to missing fk *while changing PK*. 219 statement error pgcode 23503 foreign key violation: value \['790'\] not found in products@primary \[sku\] 220 UPDATE orders SET id = 3, product = '790' WHERE id = 2 221 222 # Change PK while leaving everything else is fine though. 223 statement ok 224 UPDATE orders SET id = 3 WHERE id = 2 225 226 # Change PK and point to different product. 227 statement ok 228 UPDATE orders SET id = 2, product = 'VP-W9QH-W44L' WHERE id = 3 229 230 statement ok 231 UPDATE orders SET product = '780' WHERE id = 2 232 233 # "delivery" is interesting since it references a secondary index with different col names. 234 statement ok 235 CREATE TABLE delivery ( 236 ts TIMESTAMP DEFAULT now(), 237 "order" int, 238 shipment int, 239 item STRING REFERENCES products (upc), 240 FOREIGN KEY ("order", shipment) REFERENCES orders (id, shipment), 241 INDEX (item), 242 FAMILY "primary" (ts, "order", shipment, item, rowid) 243 ) 244 245 query TT 246 SHOW CREATE TABLE delivery 247 ---- 248 delivery CREATE TABLE delivery ( 249 ts TIMESTAMP NULL DEFAULT now():::TIMESTAMP, 250 "order" INT8 NULL, 251 shipment INT8 NULL, 252 item STRING NULL, 253 CONSTRAINT fk_order_ref_orders FOREIGN KEY ("order", shipment) REFERENCES orders(id, shipment), 254 CONSTRAINT fk_item_ref_products FOREIGN KEY (item) REFERENCES products(upc), 255 INDEX delivery_item_idx (item ASC), 256 INDEX delivery_auto_index_fk_order_ref_orders ("order" ASC, shipment ASC), 257 FAMILY "primary" (ts, "order", shipment, item, rowid) 258 ) 259 260 statement ok 261 INSERT INTO delivery ("order", shipment, item) VALUES 262 (1, 1, '867072000006'), (1, 1, '867072000006'), (1, 1, '885155001450'), (1, 1, '867072000006') 263 264 statement error pgcode 23503 foreign key violation: value \['missing'\] not found in products@products_upc_key \[upc\] 265 INSERT INTO delivery ("order", shipment, item) VALUES 266 (1, 1, '867072000006'), (1, 1, 'missing'), (1, 1, '885155001450'), (1, 1, '867072000006') 267 268 statement error pgcode 23503 foreign key violation: value \[1 99\] not found in orders@primary \[id shipment\] 269 INSERT INTO delivery ("order", shipment, item) VALUES 270 (1, 1, '867072000006'), (1, 99, '867072000006') 271 272 statement error pgcode 23503 foreign key violation: values \['867072000006'\] in columns \[upc\] referenced in table "delivery" 273 DELETE FROM products WHERE sku = 'VP-W9QH-W44L' 274 275 # Blanking a field nobody cares about is fine. 276 statement ok 277 UPDATE products SET vendor = '' WHERE sku = '780' 278 279 # No-op update should be fine. 280 statement ok 281 UPDATE products SET sku = '770' WHERE sku = '750' 282 283 # Changing referenced PK fails. 284 statement error pgcode 23503 foreign key violation: values \['780'\] in columns \[sku\] referenced in table "orders" 285 UPDATE products SET sku = '770' WHERE sku = '780' 286 287 # No-op change to existing data is fine. 288 statement ok 289 UPDATE products SET upc = '885155001450' WHERE sku = '780' 290 291 # Changing referenced non-pk index fails. 292 statement error pgcode 23503 foreign key violation: values \['885155001450'\] in columns \[upc\] referenced in table "delivery" 293 UPDATE products SET upc = 'blah' WHERE sku = '780' 294 295 statement ok 296 ALTER TABLE delivery DROP CONSTRAINT fk_item_ref_products 297 298 statement ok 299 UPDATE products SET upc = 'blah' WHERE sku = '780' 300 301 statement error pgcode 23503 foreign key violation: "delivery" row item='885155001450', rowid=[0-9]* has no match in "products" 302 ALTER TABLE delivery ADD FOREIGN KEY (item) REFERENCES products (upc) 303 304 query TTTTB 305 SHOW CONSTRAINTS FROM delivery 306 ---- 307 delivery fk_order_ref_orders FOREIGN KEY FOREIGN KEY ("order", shipment) REFERENCES orders(id, shipment) true 308 309 statement ok 310 UPDATE products SET upc = '885155001450' WHERE sku = '780' 311 312 statement ok 313 ALTER TABLE delivery ADD FOREIGN KEY (item) REFERENCES products (upc) 314 315 query TTTTB 316 SHOW CONSTRAINTS FROM delivery 317 ---- 318 delivery fk_item_ref_products FOREIGN KEY FOREIGN KEY (item) REFERENCES products(upc) true 319 delivery fk_order_ref_orders FOREIGN KEY FOREIGN KEY ("order", shipment) REFERENCES orders(id, shipment) true 320 321 statement ok 322 ALTER TABLE "user content"."customer reviews" 323 DROP CONSTRAINT orderfk 324 325 statement ok 326 INSERT INTO "user content"."customer reviews" (id, product, body, "order") VALUES (3, '780', 'i ordered 100 of them', 9) 327 328 statement ok 329 ALTER TABLE "user content"."customer reviews" 330 ADD CONSTRAINT orderfk2 FOREIGN KEY ("order", shipment) REFERENCES orders (id, shipment) 331 332 # This is allowed because we match using MATCH SIMPLE. 333 statement ok 334 ALTER TABLE "user content"."customer reviews" 335 VALIDATE CONSTRAINT orderfk2 336 337 # This is allowed because we match using MATCH SIMPLE. 338 statement ok 339 INSERT INTO "user content"."customer reviews" (id, product, body, "order") VALUES (4, '780', 'i ordered 101 of them', 9) 340 341 statement error pgcode 23503 foreign key violation: value \[9 1\] not found in orders@primary \[id shipment\] 342 INSERT INTO "user content"."customer reviews" (id, product, body, "order", shipment) VALUES (4, '780', 'i ordered 101 of them', 9, 1) 343 344 statement error pgcode 23503 foreign key violation: value \[1 9\] not found in orders@primary \[id shipment\] 345 INSERT INTO "user content"."customer reviews" (id, product, body, shipment, "order") VALUES (4, '780', 'i ordered 101 of them', 9, 1) 346 347 statement ok 348 ALTER TABLE delivery DROP CONSTRAINT fk_order_ref_orders 349 350 statement ok 351 TRUNCATE orders, "user content"."customer reviews" 352 353 # Changing now non-referenced and secondary field is fine. 354 statement ok 355 UPDATE products SET sku = '750', vendor = 'roomba' WHERE sku = '780' 356 357 # Changing PK and referenced secondary index is not ok. 358 statement error pgcode 23503 foreign key violation: values \['885155001450'\] in columns \[upc\] referenced in table "delivery" 359 UPDATE products SET sku = '780', upc = 'blah' WHERE sku = '750' 360 361 statement error pgcode 23503 foreign key violation: values \['885155001450'\] in columns \[upc\] referenced in table "delivery" 362 DELETE FROM products WHERE sku = '750' 363 364 statement error "products" is referenced by foreign key from table "orders" 365 TRUNCATE products 366 367 query I 368 SELECT count(*) FROM delivery 369 ---- 370 4 371 372 statement ok 373 TRUNCATE products CASCADE 374 375 query I 376 SELECT count(*) FROM delivery 377 ---- 378 0 379 380 statement ok 381 TRUNCATE delivery, products, orders, "user content"."customer reviews" 382 383 query TTTTB colnames 384 SHOW CONSTRAINTS FROM orders 385 ---- 386 table_name constraint_name constraint_type details validated 387 orders fk_product_ref_products FOREIGN KEY FOREIGN KEY (product) REFERENCES products(sku) ON DELETE RESTRICT ON UPDATE RESTRICT true 388 orders primary PRIMARY KEY PRIMARY KEY (id ASC, shipment ASC) true 389 orders valid_customer FOREIGN KEY FOREIGN KEY (customer) REFERENCES customers(id) true 390 391 statement error pq: index "products_upc_key" is in use as unique constraint 392 DROP INDEX products@products_upc_key 393 394 statement error pq: index "products_upc_key" is in use as unique constraint 395 DROP INDEX products@products_upc_key RESTRICT 396 397 statement error "products_upc_key" is referenced by foreign key from table "delivery" 398 ALTER TABLE products DROP COLUMN upc 399 400 statement ok 401 ALTER TABLE delivery DROP COLUMN "item" 402 403 statement ok 404 DROP INDEX products@products_upc_key CASCADE 405 406 statement error index "orders_product_idx" is in use as a foreign key constraint 407 DROP INDEX orders@orders_product_idx 408 409 statement error index "orders_product_idx" is in use as a foreign key constraint 410 DROP INDEX orders@orders_product_idx RESTRICT 411 412 statement error "products" is referenced by foreign key from table "orders" 413 DROP TABLE products 414 415 statement error referenced by foreign key from table "orders" 416 DROP TABLE products RESTRICT 417 418 statement error referenced by foreign key from table "customer reviews" 419 DROP TABLE orders 420 421 # reviews has a multi-col FK in which dropping one col is not allowed. 422 statement error column "order" is referenced by existing index "customer reviews_auto_index_orderfk" 423 ALTER TABLE "user content"."customer reviews" DROP COLUMN "order" 424 425 statement ok 426 ALTER TABLE "user content"."customer reviews" DROP COLUMN "order" CASCADE 427 428 statement ok 429 DROP TABLE "user content"."customer reviews" 430 431 statement ok 432 DROP TABLE orders 433 434 statement ok 435 DROP TABLE products 436 437 statement ok 438 CREATE TABLE parent (id int primary key) 439 440 statement ok 441 CREATE TABLE child (id INT PRIMARY KEY, parent_id INT UNIQUE REFERENCES parent) 442 443 statement ok 444 CREATE TABLE grandchild (id INT PRIMARY KEY, parent_id INT REFERENCES child (parent_id), INDEX (parent_id)) 445 446 statement error "parent" is referenced by foreign key from table "child" 447 DROP TABLE parent 448 449 statement error "child" is referenced by foreign key from table "grandchild" 450 DROP TABLE child 451 452 statement error pgcode 23503 foreign key violation 453 INSERT INTO child VALUES (2, 2) 454 455 statement ok 456 DROP TABLE parent CASCADE 457 458 statement ok 459 INSERT INTO child VALUES (2, 2) 460 461 statement error pgcode 23503 foreign key violation 462 INSERT INTO grandchild VALUES (1, 1) 463 464 statement error in use as a foreign key constraint 465 DROP INDEX grandchild@grandchild_parent_id_idx 466 467 statement ok 468 DROP INDEX grandchild@grandchild_parent_id_idx CASCADE 469 470 statement ok 471 INSERT INTO grandchild VALUES (1, 1) 472 473 statement ok 474 DROP TABLE grandchild 475 476 statement ok 477 CREATE TABLE grandchild (id INT PRIMARY KEY, parent_id INT REFERENCES child (parent_id), INDEX (parent_id)) 478 479 statement error pgcode 23503 foreign key violation 480 INSERT INTO grandchild VALUES (1, 1) 481 482 statement error pq: index "child_parent_id_key" is in use as unique constraint 483 DROP INDEX child@child_parent_id_key 484 485 statement ok 486 DROP INDEX child@child_parent_id_key CASCADE 487 488 statement ok 489 INSERT INTO grandchild VALUES (1, 1) 490 491 statement ok 492 CREATE TABLE employees (id INT PRIMARY KEY, manager INT REFERENCES employees, INDEX (manager)) 493 494 statement ok 495 INSERT INTO employees VALUES (1, NULL) 496 497 statement ok 498 INSERT INTO employees VALUES (2, 1), (3, 1) 499 500 statement ok 501 INSERT INTO employees VALUES (4, 2), (5, 3) 502 503 statement error pgcode 23503 foreign key violation 504 DELETE FROM employees WHERE id = 2 505 506 statement error pgcode 23503 foreign key violation 507 DELETE FROM employees WHERE id > 1 508 509 statement ok 510 DROP TABLE employees 511 512 statement ok 513 CREATE TABLE pairs (id INT PRIMARY KEY, src INT, dest STRING, UNIQUE (src, dest)) 514 515 statement ok 516 INSERT INTO pairs VALUES (1, 100, 'one'), (2, 200, 'two') 517 518 statement error type of "b" \(string\) does not match foreign key "pairs"."id" \(int\) 519 CREATE TABLE refpairs (a INT, b STRING, CONSTRAINT fk FOREIGN KEY (b) REFERENCES pairs) 520 521 statement error 2 columns must reference exactly 2 columns in referenced table \(found 1\) 522 CREATE TABLE refpairs (a INT, b STRING, CONSTRAINT fk FOREIGN KEY (a, b) REFERENCES pairs) 523 524 # TODO(dt): remove ordering constraint on matching index 525 statement ok 526 CREATE TABLE refpairs_wrong_order ( 527 a INT, 528 b STRING, 529 FOREIGN KEY (a, b) REFERENCES pairs (src, dest), 530 INDEX (b, a) 531 ) 532 533 query TTBITTBB colnames 534 SHOW INDEXES FROM refpairs_wrong_order 535 ---- 536 table_name index_name non_unique seq_in_index column_name direction storing implicit 537 refpairs_wrong_order primary false 1 rowid ASC false false 538 refpairs_wrong_order refpairs_wrong_order_b_a_idx true 1 b ASC false false 539 refpairs_wrong_order refpairs_wrong_order_b_a_idx true 2 a ASC false false 540 refpairs_wrong_order refpairs_wrong_order_b_a_idx true 3 rowid ASC false true 541 refpairs_wrong_order refpairs_wrong_order_auto_index_fk_a_ref_pairs true 1 a ASC false false 542 refpairs_wrong_order refpairs_wrong_order_auto_index_fk_a_ref_pairs true 2 b ASC false false 543 refpairs_wrong_order refpairs_wrong_order_auto_index_fk_a_ref_pairs true 3 rowid ASC false true 544 545 statement ok 546 CREATE TABLE refpairs_c_between (a INT, b STRING, c INT, FOREIGN KEY (a, b) REFERENCES pairs (src, dest), INDEX (a, c, b)) 547 548 query TTBITTBB colnames 549 SHOW INDEXES FROM refpairs_c_between 550 ---- 551 table_name index_name non_unique seq_in_index column_name direction storing implicit 552 refpairs_c_between primary false 1 rowid ASC false false 553 refpairs_c_between refpairs_c_between_a_c_b_idx true 1 a ASC false false 554 refpairs_c_between refpairs_c_between_a_c_b_idx true 2 c ASC false false 555 refpairs_c_between refpairs_c_between_a_c_b_idx true 3 b ASC false false 556 refpairs_c_between refpairs_c_between_a_c_b_idx true 4 rowid ASC false true 557 refpairs_c_between refpairs_c_between_auto_index_fk_a_ref_pairs true 1 a ASC false false 558 refpairs_c_between refpairs_c_between_auto_index_fk_a_ref_pairs true 2 b ASC false false 559 refpairs_c_between refpairs_c_between_auto_index_fk_a_ref_pairs true 3 rowid ASC false true 560 561 statement ok 562 CREATE TABLE refpairs ( 563 a INT, 564 b STRING, 565 c INT, 566 FOREIGN KEY (a, b) REFERENCES pairs (src, dest) ON UPDATE RESTRICT, 567 INDEX (a, b, c), 568 FAMILY "primary" (a, b, c, rowid) 569 ) 570 571 query TTBITTBB colnames 572 SHOW INDEXES FROM refpairs 573 ---- 574 table_name index_name non_unique seq_in_index column_name direction storing implicit 575 refpairs primary false 1 rowid ASC false false 576 refpairs refpairs_a_b_c_idx true 1 a ASC false false 577 refpairs refpairs_a_b_c_idx true 2 b ASC false false 578 refpairs refpairs_a_b_c_idx true 3 c ASC false false 579 refpairs refpairs_a_b_c_idx true 4 rowid ASC false true 580 581 query TT 582 SHOW CREATE TABLE refpairs 583 ---- 584 refpairs CREATE TABLE refpairs ( 585 a INT8 NULL, 586 b STRING NULL, 587 c INT8 NULL, 588 CONSTRAINT fk_a_ref_pairs FOREIGN KEY (a, b) REFERENCES pairs(src, dest) ON UPDATE RESTRICT, 589 INDEX refpairs_a_b_c_idx (a ASC, b ASC, c ASC), 590 FAMILY "primary" (a, b, c, rowid) 591 ) 592 593 statement error pgcode 23503 foreign key violation: value \[100 'two'\] not found in pairs@pairs_src_dest_key \[src dest\] 594 INSERT INTO refpairs VALUES (100, 'two'), (200, 'two') 595 596 statement ok 597 INSERT INTO refpairs VALUES (100, 'one', 3), (200, 'two', null) 598 599 statement error pgcode 23503 foreign key violation: values \[200 'two'\] in columns \[src dest\] referenced in table "refpairs" 600 UPDATE pairs SET dest = 'too' WHERE id = 2 601 602 statement error pgcode 23503 foreign key violation: values \[200 'two'\] in columns \[src dest\] referenced in table "refpairs" 603 DELETE FROM pairs WHERE id = 2 604 605 statement error pgcode 23503 foreign key violation: values \[100 'one'\] in columns \[src dest\] referenced in table "refpairs" 606 DELETE FROM pairs WHERE id = 1 607 608 statement error foreign key violation: values \[100 'one'\] in columns \[src dest\] referenced in table "refpairs" 609 SET tracing = on,kv; DELETE FROM pairs WHERE id = 1 610 611 statement ok 612 SET tracing=off 613 614 # Test that fk scans on indexes that are longer than the foreign key use 615 # PrefixEnd instead of interleave end. 616 query T rowsort 617 SELECT message FROM [SHOW KV TRACE FOR SESSION] 618 WHERE message LIKE 'FKScan%' 619 ---- 620 FKScan /Table/84/3/100/"one"{-/#} 621 FKScan /Table/85/3/100/"one"{-/#} 622 FKScan /Table/86/2/100/"one"{-/PrefixEnd} 623 624 # since PKs are handled differently than other indexes, check pk<->pk ref with no other indexes in play. 625 statement ok 626 CREATE TABLE foo (id INT PRIMARY KEY) 627 628 statement ok 629 CREATE TABLE bar (id INT PRIMARY KEY REFERENCES foo) 630 631 statement ok 632 INSERT INTO foo VALUES (2) 633 634 statement ok 635 INSERT INTO bar VALUES (2) 636 637 statement error pgcode 23503 foreign key violation: values \[2] in columns \[id\] referenced in table "bar" 638 DELETE FROM foo 639 640 statement ok 641 CREATE DATABASE otherdb 642 643 statement ok 644 CREATE TABLE otherdb.othertable (id INT PRIMARY KEY) 645 646 statement ok 647 CREATE TABLE crossdb (id INT PRIMARY KEY, FOREIGN KEY (id) REFERENCES otherdb.othertable) 648 649 statement error pgcode 23503 foreign key violation: value \[2\] not found in othertable@primary \[id\] 650 INSERT INTO crossdb VALUES (2) 651 652 statement ok 653 INSERT INTO otherdb.othertable VALUES (1), (2) 654 655 statement ok 656 INSERT INTO crossdb VALUES (2) 657 658 statement error pgcode 23503 foreign key violation: values \[2] in columns \[id\] referenced in table "crossdb" 659 DELETE FROM otherdb.othertable WHERE id = 2 660 661 statement error "othertable" is referenced by foreign key from table "crossdb" 662 DROP TABLE otherdb.othertable 663 664 statement ok 665 DROP TABLE otherdb.othertable, crossdb 666 667 statement ok 668 CREATE TABLE modules (id BIGSERIAL NOT NULL PRIMARY KEY) 669 670 statement ok 671 CREATE TABLE domains (id BIGSERIAL NOT NULL PRIMARY KEY) 672 673 # We'll use the unique index for the domain fk (since it is a prefix), but we 674 # we correctly only mark the prefix as used and thus still allow module_id to be 675 # used in another FK. 676 statement ok 677 CREATE TABLE domain_modules ( 678 id BIGSERIAL NOT NULL PRIMARY KEY, 679 domain_id BIGINT NOT NULL, 680 module_id BIGINT NOT NULL, 681 CONSTRAINT domain_modules_domain_id_fk FOREIGN KEY (domain_id) REFERENCES domains (id), 682 CONSTRAINT domain_modules_module_id_fk FOREIGN KEY (module_id) REFERENCES modules (id), 683 CONSTRAINT domain_modules_uq UNIQUE (domain_id, module_id) 684 ) 685 686 query TTTTB 687 SHOW CONSTRAINTS FROM domain_modules 688 ---- 689 domain_modules domain_modules_domain_id_fk FOREIGN KEY FOREIGN KEY (domain_id) REFERENCES domains(id) true 690 domain_modules domain_modules_module_id_fk FOREIGN KEY FOREIGN KEY (module_id) REFERENCES modules(id) true 691 domain_modules domain_modules_uq UNIQUE UNIQUE (domain_id ASC, module_id ASC) true 692 domain_modules primary PRIMARY KEY PRIMARY KEY (id ASC) true 693 694 statement ok 695 INSERT INTO modules VALUES(3) 696 697 statement error foreign key violation: value \[2\] not found in domains@primary 698 SET tracing = on,kv; INSERT INTO domain_modules VALUES (1, 2, 3) 699 700 statement ok 701 SET tracing=off 702 703 query T rowsort 704 SELECT message FROM [SHOW KV TRACE FOR SESSION] 705 WHERE message LIKE 'FKScan%' 706 ---- 707 FKScan /Table/93/1/2{-/#} 708 FKScan /Table/92/1/3{-/#} 709 710 statement ok 711 CREATE TABLE tx ( 712 id INT NOT NULL PRIMARY KEY 713 ) 714 715 statement ok 716 CREATE TABLE tx_leg ( 717 leg_id SERIAL NOT NULL PRIMARY KEY, 718 tx_id INT NOT NULL REFERENCES tx 719 ) 720 721 statement ok 722 BEGIN TRANSACTION 723 724 statement ok 725 INSERT INTO tx VALUES (2) 726 727 statement ok 728 INSERT INTO tx_leg VALUES (201, 2); 729 730 statement ok 731 INSERT INTO tx_leg VALUES (202, 2); 732 733 statement ok 734 COMMIT 735 736 statement ok 737 BEGIN TRANSACTION 738 739 statement error pgcode 23503 foreign key violation: value \[3\] not found in tx@primary \[id\] 740 INSERT INTO tx_leg VALUES (302, 3); 741 742 statement ok 743 COMMIT 744 745 statement ok 746 CREATE TABLE a (id SERIAL NOT NULL, self_id INT, b_id INT NOT NULL, PRIMARY KEY (id)) 747 748 statement ok 749 CREATE TABLE b (id SERIAL NOT NULL, PRIMARY KEY (id)) 750 751 # The index needed for the fk constraint is automatically added because the table is empty 752 statement ok 753 ALTER TABLE a ADD CONSTRAINT fk_self_id FOREIGN KEY (self_id) REFERENCES a; 754 755 # The index needed for the fk constraint is automatically added because the table is empty 756 statement ok 757 ALTER TABLE a ADD CONSTRAINT fk_b FOREIGN KEY (b_id) REFERENCES b; 758 759 statement ok 760 INSERT INTO b VALUES (1), (2), (3); 761 762 statement ok 763 INSERT INTO a VALUES (1, NULL, 1) 764 765 statement ok 766 INSERT INTO a VALUES (2, 1, 1), (3, 1, 2) 767 768 statement ok 769 INSERT INTO a VALUES (4, 2, 2) 770 771 statement ok 772 DELETE FROM b WHERE id = 3 773 774 statement error pgcode 23503 foreign key violation 775 DELETE FROM b WHERE id = 2 776 777 statement error pgcode 23503 foreign key violation 778 DELETE FROM a WHERE id = 1 779 780 statement ok 781 DELETE FROM a WHERE id > 2 782 783 statement ok 784 DELETE FROM b WHERE id = 2 785 786 statement ok 787 DROP TABLE a 788 789 statement ok 790 DROP TABLE b 791 792 # A CREATE TABLE with a FK reference within a transaction. 793 statement ok 794 CREATE TABLE referee (id INT PRIMARY KEY); 795 796 statement ok 797 BEGIN TRANSACTION 798 799 statement ok 800 CREATE TABLE refers ( 801 a INT REFERENCES referee, 802 b INT, 803 INDEX b_idx (b), 804 FAMILY "primary" (a, b, rowid) 805 ) 806 807 # Add some schema changes within the same transaction to verify that a 808 # table that isn't yet public can be modified. 809 statement ok 810 CREATE INDEX foo ON refers (a) 811 812 statement ok 813 ALTER INDEX refers@b_idx RENAME TO another_idx 814 815 query TT 816 SHOW CREATE TABLE refers 817 ---- 818 refers CREATE TABLE refers ( 819 a INT8 NULL, 820 b INT8 NULL, 821 CONSTRAINT fk_a_ref_referee FOREIGN KEY (a) REFERENCES referee(id), 822 INDEX another_idx (b ASC), 823 INDEX refers_auto_index_fk_a_ref_referee (a ASC), 824 INDEX foo (a ASC), 825 FAMILY "primary" (a, b, rowid) 826 ) 827 828 statement ok 829 DROP INDEX refers@another_idx 830 831 # refers is not visible because it is in the ADD state. 832 query TTT 833 SHOW TABLES FROM test 834 ---- 835 public bar table 836 public child table 837 public customers table 838 public delivery table 839 public domain_modules table 840 public domains table 841 public foo table 842 public grandchild table 843 public modules table 844 public pairs table 845 public referee table 846 public refpairs table 847 public refpairs_c_between table 848 public refpairs_wrong_order table 849 public tx table 850 public tx_leg table 851 public unindexed table 852 853 statement ok 854 COMMIT 855 856 # CREATE AND DROP a table with a fk in the same transaction. 857 statement ok 858 BEGIN TRANSACTION 859 860 statement ok 861 CREATE TABLE refers1 (a INT REFERENCES referee); 862 863 statement ok 864 DROP TABLE refers1 865 866 statement ok 867 COMMIT 868 869 # Check that removing self-ref FK correctly removed backref too, #16070. 870 statement ok 871 CREATE TABLE employee ( 872 id INT PRIMARY KEY, 873 manager INT, 874 UNIQUE (manager) 875 ); 876 877 statement ok 878 ALTER TABLE employee 879 ADD CONSTRAINT emp_emp 880 FOREIGN KEY (manager) 881 REFERENCES employee; 882 883 statement ok 884 ALTER TABLE employee 885 DROP CONSTRAINT emp_emp; 886 887 statement ok 888 SHOW CREATE TABLE employee; 889 890 # Ensure that tables with an fk reference from their pk appear correctly in 891 # SHOW CREATE TABLE (#17596). 892 statement ok 893 CREATE TABLE pkref_a (a INT PRIMARY KEY) 894 895 statement ok 896 CREATE TABLE pkref_b (b INT PRIMARY KEY REFERENCES pkref_a ON UPDATE NO ACTION ON DELETE RESTRICT) 897 898 query TT 899 SHOW CREATE TABLE pkref_b 900 ---- 901 pkref_b CREATE TABLE pkref_b ( 902 b INT8 NOT NULL, 903 CONSTRAINT "primary" PRIMARY KEY (b ASC), 904 CONSTRAINT fk_b_ref_pkref_a FOREIGN KEY (b) REFERENCES pkref_a(a) ON DELETE RESTRICT, 905 FAMILY "primary" (b) 906 ) 907 908 subtest 20042 909 910 statement ok 911 CREATE TABLE test20042 ( 912 x STRING PRIMARY KEY 913 ,y STRING UNIQUE 914 ,z STRING REFERENCES test20042(y) 915 ); 916 917 statement ok 918 INSERT INTO test20042 (x, y, z) VALUES ('pk1', 'k1', null); 919 920 statement ok 921 INSERT INTO test20042 (x, y, z) VALUES ('pk2', 'k2 ', 'k1'); 922 923 statement ok 924 DELETE FROM test20042 WHERE x = 'pk2'; 925 926 statement ok 927 DELETE FROM test20042 WHERE x = 'pk1'; 928 929 subtest 20045 930 931 statement ok 932 CREATE TABLE test20045 ( 933 x STRING PRIMARY KEY 934 ,y STRING UNIQUE REFERENCES test20045(x) 935 ,z STRING REFERENCES test20045(y) 936 ); 937 938 statement ok 939 INSERT INTO test20045 (x, y, z) VALUES ('pk1', NULL, NULL); 940 941 statement ok 942 INSERT INTO test20045 (x, y, z) VALUES ('pk2', 'pk1', NULL); 943 944 statement ok 945 INSERT INTO test20045 (x, y, z) VALUES ('pk3', 'pk2', 'pk1'); 946 947 statement ok 948 DELETE FROM test20045 WHERE x = 'pk3'; 949 950 statement ok 951 DELETE FROM test20045 WHERE x = 'pk2'; 952 953 statement ok 954 DELETE FROM test20045 WHERE x = 'pk1'; 955 956 ## Delete cascade without privileges 957 958 statement ok 959 CREATE DATABASE d; 960 961 statement ok 962 CREATE TABLE d.a ( 963 id STRING PRIMARY KEY 964 ); 965 966 statement ok 967 CREATE TABLE d.b ( 968 id STRING PRIMARY KEY 969 ,a_id STRING REFERENCES d.a ON DELETE CASCADE 970 ); 971 972 statement ok 973 INSERT INTO d.a VALUES ('a1'); 974 975 statement ok 976 INSERT INTO d.b VALUES ('b1', 'a1'); 977 978 statement ok 979 GRANT ALL ON DATABASE d TO testuser; 980 981 statement ok 982 GRANT ALL ON d.a TO testuser; 983 984 user testuser 985 986 statement error user testuser does not have SELECT privilege on relation b 987 DELETE FROM d.a WHERE id = 'a1'; 988 989 user root 990 991 statement ok 992 GRANT SELECT ON d.b TO testuser; 993 994 user testuser 995 996 statement error user testuser does not have DELETE privilege on relation b 997 DELETE FROM d.a WHERE id = 'a1'; 998 999 user root 1000 1001 statement ok 1002 GRANT DELETE ON d.b TO testuser; 1003 1004 user testuser 1005 1006 statement ok 1007 DELETE FROM d.a WHERE id = 'a1'; 1008 1009 user root 1010 1011 # Clean up after the test. 1012 statement ok 1013 DROP DATABASE d CASCADE; 1014 1015 subtest setNullWithNotNullConstraint 1016 ### Make sure that one cannot add a set null action on a NOT NULL column. 1017 1018 statement ok 1019 CREATE TABLE a ( 1020 id INT PRIMARY KEY 1021 ); 1022 1023 # Create a table with a NOT NULL column and a SET NULL action. 1024 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.delete_not_nullable" which has a NOT NULL constraint 1025 CREATE TABLE not_null_table ( 1026 id INT PRIMARY KEY 1027 ,delete_not_nullable INT NOT NULL REFERENCES a ON DELETE SET NULL 1028 ); 1029 1030 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.update_not_nullable" which has a NOT NULL constraint 1031 CREATE TABLE not_null_table ( 1032 id INT PRIMARY KEY 1033 ,update_not_nullable INT NOT NULL REFERENCES a ON UPDATE SET NULL 1034 ); 1035 1036 # Create a table where the primary key has a SET NULL action. 1037 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint 1038 CREATE TABLE primary_key_table ( 1039 id INT PRIMARY KEY REFERENCES a ON DELETE SET NULL 1040 ); 1041 1042 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint 1043 CREATE TABLE primary_key_table ( 1044 id INT PRIMARY KEY REFERENCES a ON UPDATE SET NULL 1045 ); 1046 1047 # Add a SET NULL action after the fact with a NOT NULL column. 1048 statement ok 1049 CREATE TABLE not_null_table ( 1050 id INT PRIMARY KEY 1051 ,delete_not_nullable INT NOT NULL 1052 ,update_not_nullable INT NOT NULL 1053 ); 1054 1055 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.delete_not_nullable" which has a NOT NULL constraint 1056 ALTER TABLE not_null_table ADD CONSTRAINT not_null_delete_set_null 1057 FOREIGN KEY (delete_not_nullable) REFERENCES a (id) 1058 ON DELETE SET NULL; 1059 1060 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.update_not_nullable" which has a NOT NULL constraint 1061 ALTER TABLE not_null_table ADD CONSTRAINT not_null_update_set_null 1062 FOREIGN KEY (update_not_nullable) REFERENCES a (id) 1063 ON UPDATE SET NULL; 1064 1065 # Clean up so far, 1066 statement ok 1067 DROP TABLE not_null_table; 1068 1069 # Add a SET NULL action after the fact with a primary key column. 1070 statement ok 1071 CREATE TABLE primary_key_table ( 1072 id INT PRIMARY KEY 1073 ); 1074 1075 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint 1076 ALTER TABLE primary_key_table ADD CONSTRAINT not_null_set_null 1077 FOREIGN KEY (id) REFERENCES a (id) 1078 ON DELETE SET NULL; 1079 1080 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint 1081 ALTER TABLE primary_key_table ADD CONSTRAINT not_null_set_null 1082 FOREIGN KEY (id) REFERENCES a (id) 1083 ON UPDATE SET NULL; 1084 1085 # Clean up the tables used so far. 1086 statement ok 1087 DROP TABLE primary_key_table, a; 1088 1089 # Now test composite foreign keys 1090 statement ok 1091 CREATE TABLE a ( 1092 id1 INT 1093 ,id2 INT 1094 ,PRIMARY KEY (id2, id1) 1095 ); 1096 1097 # Create a table with a NOT NULL column and a SET NULL action. 1098 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref1" which has a NOT NULL constraint 1099 CREATE TABLE not_null_table ( 1100 id INT PRIMARY KEY 1101 ,ref1 INT NOT NULL 1102 ,ref2 INT NOT NULL 1103 ,INDEX (ref1, ref2) 1104 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET NULL 1105 ); 1106 1107 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref1" which has a NOT NULL constraint 1108 CREATE TABLE not_null_table ( 1109 id INT PRIMARY KEY 1110 ,ref1 INT NOT NULL 1111 ,ref2 INT NOT NULL 1112 ,INDEX (ref1, ref2) 1113 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET NULL 1114 ); 1115 1116 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref1" which has a NOT NULL constraint 1117 CREATE TABLE not_null_table ( 1118 id INT PRIMARY KEY 1119 ,ref1 INT NOT NULL 1120 ,ref2 INT 1121 ,INDEX (ref1, ref2) 1122 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET NULL 1123 ); 1124 1125 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref1" which has a NOT NULL constraint 1126 CREATE TABLE not_null_table ( 1127 id INT PRIMARY KEY 1128 ,ref1 INT NOT NULL 1129 ,ref2 INT 1130 ,INDEX (ref1, ref2) 1131 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET NULL 1132 ); 1133 1134 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref2" which has a NOT NULL constraint 1135 CREATE TABLE not_null_table ( 1136 id INT PRIMARY KEY 1137 ,ref1 INT 1138 ,ref2 INT NOT NULL 1139 ,INDEX (ref1, ref2) 1140 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET NULL 1141 ); 1142 1143 statement error pq: cannot add a SET NULL cascading action on column "test.public.not_null_table.ref2" which has a NOT NULL constraint 1144 CREATE TABLE not_null_table ( 1145 id INT PRIMARY KEY 1146 ,ref1 INT 1147 ,ref2 INT NOT NULL 1148 ,INDEX (ref1, ref2) 1149 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET NULL 1150 ); 1151 1152 # Create a table where the primary key has a SET NULL action. 1153 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.ref1" which has a NOT NULL constraint 1154 CREATE TABLE primary_key_table ( 1155 ref1 INT 1156 ,ref2 INT 1157 ,PRIMARY KEY (ref2, ref1) 1158 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET NULL 1159 ); 1160 1161 # Create a table where the primary key has a SET NULL action. 1162 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.ref1" which has a NOT NULL constraint 1163 CREATE TABLE primary_key_table ( 1164 ref1 INT 1165 ,ref2 INT 1166 ,PRIMARY KEY (ref2, ref1) 1167 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET NULL 1168 ); 1169 1170 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.ref2" which has a NOT NULL constraint 1171 CREATE TABLE primary_key_table ( 1172 ref1 INT 1173 ,ref2 INT 1174 ,PRIMARY KEY (ref2, ref1) 1175 ,FOREIGN KEY (ref2, ref1) REFERENCES a (id2, id1) ON DELETE SET NULL 1176 ); 1177 1178 statement error pq: cannot add a SET NULL cascading action on column "test.public.primary_key_table.ref2" which has a NOT NULL constraint 1179 CREATE TABLE primary_key_table ( 1180 ref1 INT 1181 ,ref2 INT 1182 ,PRIMARY KEY (ref2, ref1) 1183 ,FOREIGN KEY (ref2, ref1) REFERENCES a (id2, id1) ON UPDATE SET NULL 1184 ); 1185 1186 # Clean up after the test. 1187 statement ok 1188 DROP TABLE a; 1189 1190 subtest setDefaultWithoutDefault 1191 ### Make sure that one cannot add a SET DEFAULT action with no default values 1192 ### on a column. 1193 1194 statement ok 1195 CREATE TABLE a ( 1196 id INT PRIMARY KEY 1197 ); 1198 1199 # Create a table with no DEFAULT expressions column and a SET DEFAULT action. 1200 statement ok 1201 CREATE TABLE delete_no_default_table ( 1202 id INT PRIMARY KEY 1203 ,delete_no_default INT REFERENCES a ON DELETE SET DEFAULT 1204 ); 1205 1206 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.update_no_default_table.update_no_default" which has a NOT NULL constraint and a NULL default expression 1207 CREATE TABLE update_no_default_table ( 1208 id INT PRIMARY KEY 1209 ,update_no_default INT NOT NULL REFERENCES a ON UPDATE SET DEFAULT 1210 ); 1211 1212 # Create a table where the primary key has a SET DEFAULT action. 1213 # Primary keys are not allowed to be NULL 1214 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.primary_key_table_set_default.id" which has a NOT NULL constraint and a NULL default expression 1215 CREATE TABLE primary_key_table_set_default ( 1216 id INT PRIMARY KEY REFERENCES a ON DELETE SET DEFAULT 1217 ); 1218 1219 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint and a NULL default expression 1220 CREATE TABLE primary_key_table ( 1221 id INT PRIMARY KEY REFERENCES a ON UPDATE SET DEFAULT 1222 ); 1223 1224 # Add a SET DEFAULT action after the to a column with no DEFAULT expression. 1225 statement ok 1226 CREATE TABLE no_default_table ( 1227 id INT PRIMARY KEY 1228 ,delete_no_default INT 1229 ,update_no_default INT 1230 ); 1231 1232 statement ok 1233 ALTER TABLE no_default_table ADD CONSTRAINT no_default_delete_set_default 1234 FOREIGN KEY (delete_no_default) REFERENCES a (id) 1235 ON DELETE SET DEFAULT; 1236 1237 statement ok 1238 ALTER TABLE no_default_table ADD CONSTRAINT no_default_update_set_default 1239 FOREIGN KEY (update_no_default) REFERENCES a (id) 1240 ON UPDATE SET DEFAULT; 1241 1242 # Clean up so far, 1243 statement ok 1244 DROP TABLE no_default_table; 1245 1246 # Add a SET DEFAULT action after the fact with a primary key column that has no 1247 # DEFAULT expression. 1248 statement ok 1249 CREATE TABLE primary_key_table ( 1250 id INT PRIMARY KEY 1251 ); 1252 1253 # id is a primary key and thus cannot be NULL 1254 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint and a NULL default expression 1255 ALTER TABLE primary_key_table ADD CONSTRAINT no_default_delete_set_default 1256 FOREIGN KEY (id) REFERENCES a (id) 1257 ON DELETE SET DEFAULT; 1258 1259 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.primary_key_table.id" which has a NOT NULL constraint and a NULL default expression 1260 ALTER TABLE primary_key_table ADD CONSTRAINT no_default_update_set_default 1261 FOREIGN KEY (id) REFERENCES a (id) 1262 ON UPDATE SET DEFAULT; 1263 1264 # Clean up the tables used so far. 1265 statement ok 1266 DROP TABLE primary_key_table, delete_no_default_table, a; 1267 1268 # Now test composite foreign keys 1269 statement ok 1270 CREATE TABLE a ( 1271 id1 INT 1272 ,id2 INT 1273 ,PRIMARY KEY (id2, id1) 1274 ); 1275 1276 # Create a table with a column without a DEFAULT expression and a SET DEFAULT action. 1277 statement ok 1278 CREATE TABLE no_default_table ( 1279 id INT PRIMARY KEY 1280 ,ref1 INT 1281 ,ref2 INT 1282 ,INDEX (ref1, ref2) 1283 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET DEFAULT 1284 ); 1285 1286 statement ok 1287 INSERT INTO a VALUES (1, 2) 1288 1289 statement ok 1290 INSERT INTO a VALUES (3, 4) 1291 1292 statement ok 1293 INSERT INTO no_default_table VALUES (6, 2, 1) 1294 1295 query III colnames 1296 SELECT * FROM no_default_table 1297 ---- 1298 id ref1 ref2 1299 6 2 1 1300 1301 statement ok 1302 DELETE FROM a WHERE id1=1 1303 1304 query III colnames 1305 SELECT * FROM no_default_table 1306 ---- 1307 id ref1 ref2 1308 6 NULL NULL 1309 1310 statement ok 1311 CREATE TABLE no_default_table_on_update ( 1312 id INT PRIMARY KEY 1313 ,ref1 INT 1314 ,ref2 INT 1315 ,INDEX (ref1, ref2) 1316 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET DEFAULT 1317 ); 1318 1319 statement ok 1320 INSERT INTO no_default_table_on_update VALUES (0, 4, 3) 1321 1322 query III colnames 1323 SELECT * FROM no_default_table_on_update 1324 ---- 1325 id ref1 ref2 1326 0 4 3 1327 1328 statement ok 1329 UPDATE a SET id1=33, id2=44 WHERE id1=3; 1330 1331 query III colnames 1332 SELECT * FROM no_default_table_on_update 1333 ---- 1334 id ref1 ref2 1335 0 NULL NULL 1336 1337 statement ok 1338 CREATE TABLE no_default_table_ref2_default_on_delete ( 1339 id INT PRIMARY KEY 1340 ,ref1 INT 1341 ,ref2 INT DEFAULT 1 1342 ,INDEX (ref1, ref2) 1343 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET DEFAULT 1344 ); 1345 1346 statement ok 1347 CREATE TABLE no_default_table_ref2_default_on_update ( 1348 id INT PRIMARY KEY 1349 ,ref1 INT 1350 ,ref2 INT DEFAULT 1 1351 ,INDEX (ref1, ref2) 1352 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET DEFAULT 1353 ); 1354 1355 statement ok 1356 CREATE TABLE no_default_table_ref1_default_on_delete ( 1357 id INT PRIMARY KEY 1358 ,ref1 INT DEFAULT 1 1359 ,ref2 INT 1360 ,INDEX (ref1, ref2) 1361 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET DEFAULT 1362 ); 1363 1364 statement ok 1365 CREATE TABLE no_default_table_ref1_default_on_update ( 1366 id INT PRIMARY KEY 1367 ,ref1 INT DEFAULT 1 1368 ,ref2 INT 1369 ,INDEX (ref1, ref2) 1370 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON UPDATE SET DEFAULT 1371 ); 1372 1373 # Create a table with a NOT NULL column and a SET NULL action. 1374 statement error pq: cannot add a SET DEFAULT cascading action on column "test.public.not_null_table.ref1" which has a NOT NULL constraint and a NULL default expression 1375 CREATE TABLE not_null_table ( 1376 id INT PRIMARY KEY 1377 ,ref1 INT NOT NULL 1378 ,ref2 INT NOT NULL 1379 ,INDEX (ref1, ref2) 1380 ,FOREIGN KEY (ref1, ref2) REFERENCES a (id2, id1) ON DELETE SET DEFAULT 1381 ); 1382 1383 # Clean up after the test. 1384 statement ok 1385 DROP TABLE a, no_default_table, no_default_table_on_update, no_default_table_ref2_default_on_delete, 1386 no_default_table_ref2_default_on_update, no_default_table_ref1_default_on_delete, 1387 no_default_table_ref1_default_on_update 1388 1389 subtest unvalidated_fk_plan 1390 1391 # To get an unvalidated foreign key for testing, use the loophole that we 1392 # currently don't support adding a validated FK in the same transaction as 1393 # CREATE TABLE 1394 1395 statement ok 1396 CREATE TABLE a ( 1397 x STRING NULL, 1398 y STRING NULL, 1399 z STRING NULL, 1400 CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1401 ) 1402 1403 statement ok 1404 CREATE TABLE b ( 1405 a_y STRING NULL, 1406 a_x STRING NULL, 1407 a_z STRING NULL, 1408 INDEX idx (a_z, a_y, a_x) 1409 ) 1410 1411 statement ok 1412 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y1', 'z1') 1413 1414 statement ok 1415 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) NOT VALID 1416 1417 statement error pq: foreign key violation: "b" row a_z='z1', a_y='y1', a_x='x2', rowid=[0-9]* has no match in "a" 1418 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 1419 1420 # Verify that the optimizer doesn't use an unvalidated constraint to simplify plans. 1421 query TTT 1422 SELECT 1423 s.a_z, s.a_y, s.a_x 1424 FROM 1425 (SELECT * FROM b WHERE a_z IS NOT NULL AND a_y IS NOT NULL AND a_x IS NOT NULL) AS s 1426 LEFT JOIN a AS t ON s.a_z = t.z AND s.a_y = t.y AND s.a_x = t.x 1427 WHERE 1428 t.z IS NULL 1429 ---- 1430 z1 y1 x2 1431 1432 statement ok 1433 DROP TABLE a, b 1434 1435 subtest Composite_Simple 1436 # Originally from 26748. 1437 1438 # Test composite key with two columns. 1439 statement ok 1440 CREATE TABLE a ( 1441 x STRING NULL 1442 ,y STRING NULL 1443 ,CONSTRAINT "primary" PRIMARY KEY (y, x) 1444 ); 1445 1446 statement ok 1447 CREATE TABLE b ( 1448 a_y STRING NULL 1449 ,a_x STRING NULL 1450 ,CONSTRAINT fk_ref FOREIGN KEY (a_y, a_x) REFERENCES a (y, x) 1451 ); 1452 1453 statement ok 1454 INSERT INTO a (x, y) VALUES ('x1', 'y1') 1455 1456 # All of these are allowed because we do composite matching using MATCH SIMPLE. 1457 statement ok 1458 INSERT INTO b (a_x) VALUES ('x1') 1459 1460 statement ok 1461 INSERT INTO b (a_y) VALUES ('y1') 1462 1463 statement ok 1464 INSERT INTO b (a_y, a_x) VALUES ('y1', NULL) 1465 1466 statement ok 1467 INSERT INTO b (a_y, a_x) VALUES (NULL, 'x1') 1468 1469 statement ok 1470 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1471 1472 statement ok 1473 INSERT INTO b (a_x, a_y) VALUES (NULL, NULL) 1474 1475 statement ok 1476 DROP TABLE b, a 1477 1478 # Test composite key with three columns. 1479 statement ok 1480 CREATE TABLE a ( 1481 x STRING NULL 1482 ,y STRING NULL 1483 ,z STRING NULL 1484 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1485 ); 1486 1487 statement ok 1488 CREATE TABLE b ( 1489 a_y STRING NULL 1490 ,a_x STRING NULL 1491 ,a_z STRING NULL 1492 ,CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 1493 ); 1494 1495 statement ok 1496 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 1497 1498 # All of these are allowed because we do composite matching using MATCH SIMPLE. 1499 statement ok 1500 INSERT INTO b (a_x) VALUES ('x1') 1501 1502 statement ok 1503 INSERT INTO b (a_y) VALUES ('y1') 1504 1505 statement ok 1506 INSERT INTO b (a_z) VALUES ('z1') 1507 1508 statement ok 1509 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1510 1511 statement ok 1512 INSERT INTO b (a_x, a_y) VALUES (NULL, 'y1') 1513 1514 statement ok 1515 INSERT INTO b (a_x, a_y) VALUES ('x1', NULL) 1516 1517 statement ok 1518 INSERT INTO b (a_x, a_z) VALUES ('x1', 'z1') 1519 1520 statement ok 1521 INSERT INTO b (a_x, a_z) VALUES (NULL, 'z1') 1522 1523 statement ok 1524 INSERT INTO b (a_x, a_z) VALUES ('x1', NULL) 1525 1526 statement ok 1527 INSERT INTO b (a_y, a_z) VALUES ('y1', 'z1') 1528 1529 statement ok 1530 INSERT INTO b (a_y, a_z) VALUES (NULL, 'z1') 1531 1532 statement ok 1533 INSERT INTO b (a_y, a_z) VALUES ('y1', NULL) 1534 1535 statement ok 1536 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 1537 1538 statement ok 1539 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 1540 1541 statement ok 1542 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 1543 1544 statement ok 1545 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 1546 1547 statement ok 1548 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 1549 1550 statement ok 1551 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 1552 1553 statement ok 1554 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 1555 1556 statement ok 1557 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, NULL) 1558 1559 statement ok 1560 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', NULL) 1561 1562 statement ok 1563 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z2') 1564 1565 statement ok 1566 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', NULL) 1567 1568 statement ok 1569 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, 'z2') 1570 1571 statement ok 1572 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', 'z2') 1573 1574 statement ok 1575 DROP TABLE b, a 1576 1577 subtest Composite_Simple_Add_Constraint_Valid 1578 # Test ADD CONSTRAINT validation by inserting valid rows before the constraint is added. 1579 1580 statement ok 1581 CREATE TABLE a ( 1582 x STRING NULL 1583 ,y STRING NULL 1584 ,z STRING NULL 1585 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1586 ); 1587 1588 statement ok 1589 CREATE TABLE b ( 1590 a_y STRING NULL 1591 ,a_x STRING NULL 1592 ,a_z STRING NULL 1593 ,INDEX idx (a_z, a_y, a_x) 1594 ); 1595 1596 statement ok 1597 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 1598 1599 # All of these are allowed because we do composite matching using MATCH SIMPLE. 1600 statement ok 1601 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 1602 1603 statement ok 1604 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 1605 1606 statement ok 1607 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 1608 1609 statement ok 1610 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 1611 1612 statement ok 1613 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 1614 1615 statement ok 1616 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 1617 1618 statement ok 1619 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 1620 1621 statement ok 1622 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, NULL) 1623 1624 statement ok 1625 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', NULL) 1626 1627 statement ok 1628 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z2') 1629 1630 statement ok 1631 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', NULL) 1632 1633 statement ok 1634 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, 'z2') 1635 1636 statement ok 1637 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', 'z2') 1638 1639 statement ok 1640 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 1641 1642 statement ok 1643 DROP TABLE b, a 1644 1645 subtest Composite_Simple_Add_Constraint_Invalid 1646 # Test ADD CONSTRAINT validation by inserting invalid rows before the constraint is added, one at a time. 1647 1648 statement ok 1649 CREATE TABLE a ( 1650 x STRING NULL 1651 ,y STRING NULL 1652 ,z STRING NULL 1653 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1654 ); 1655 1656 statement ok 1657 CREATE TABLE b ( 1658 a_y STRING NULL 1659 ,a_x STRING NULL 1660 ,a_z STRING NULL 1661 ,INDEX idx (a_z, a_y, a_x) 1662 ); 1663 1664 statement ok 1665 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y1', 'z1') 1666 1667 statement error foreign key violation: "b" row a_z='z1', a_y='y1', a_x='x2', rowid=[0-9]* has no match in "a" 1668 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 1669 1670 statement ok 1671 TRUNCATE b 1672 1673 statement ok 1674 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z1') 1675 1676 statement error foreign key violation: "b" row a_z='z1', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 1677 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 1678 1679 statement ok 1680 TRUNCATE b 1681 1682 statement ok 1683 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z2') 1684 1685 statement error foreign key violation: "b" row a_z='z2', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 1686 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 1687 1688 statement ok 1689 DROP TABLE b, a 1690 1691 subtest Composite_Simple_Unvalidated 1692 # Test inserting into table with an unvalidated constraint, and running VALIDATE CONSTRAINT later 1693 1694 # Test composite key with two columns. 1695 statement ok 1696 CREATE TABLE a ( 1697 x STRING NULL 1698 ,y STRING NULL 1699 ,CONSTRAINT "primary" PRIMARY KEY (y, x) 1700 ); 1701 1702 statement ok 1703 CREATE TABLE b ( 1704 a_y STRING NULL 1705 ,a_x STRING NULL 1706 ); 1707 1708 # Add the constraint separately so that it's unvalidated, so we can test VALIDATE CONSTRAINT. 1709 statement ok 1710 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_y, a_x) REFERENCES a (y, x) NOT VALID 1711 1712 statement ok 1713 INSERT INTO a (x, y) VALUES ('x1', 'y1') 1714 1715 # All of these are allowed because we do composite matching using MATCH SIMPLE. 1716 statement ok 1717 INSERT INTO b (a_x) VALUES ('x1') 1718 1719 statement ok 1720 INSERT INTO b (a_y) VALUES ('y1') 1721 1722 statement ok 1723 INSERT INTO b (a_y, a_x) VALUES ('y1', NULL) 1724 1725 statement ok 1726 INSERT INTO b (a_y, a_x) VALUES (NULL, 'x1') 1727 1728 statement ok 1729 INSERT INTO b (a_y, a_x) VALUES ('y2', NULL) 1730 1731 statement ok 1732 INSERT INTO b (a_y, a_x) VALUES (NULL, 'x2') 1733 1734 statement ok 1735 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1736 1737 statement ok 1738 INSERT INTO b (a_x, a_y) VALUES (NULL, NULL) 1739 1740 statement ok 1741 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 1742 1743 statement ok 1744 DROP TABLE b, a 1745 1746 # Test composite key with three columns. 1747 statement ok 1748 CREATE TABLE a ( 1749 x STRING NULL 1750 ,y STRING NULL 1751 ,z STRING NULL 1752 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1753 ); 1754 1755 statement ok 1756 CREATE TABLE b ( 1757 a_y STRING NULL 1758 ,a_x STRING NULL 1759 ,a_z STRING NULL 1760 ); 1761 1762 # Add the constraint separately so that it's unvalidated, so we can test VALIDATE CONSTRAINT. 1763 statement ok 1764 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) NOT VALID 1765 1766 statement ok 1767 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 1768 1769 # All of these are allowed because we do composite matching using MATCH SIMPLE. 1770 statement ok 1771 INSERT INTO b (a_x) VALUES ('x1') 1772 1773 statement ok 1774 INSERT INTO b (a_y) VALUES ('y1') 1775 1776 statement ok 1777 INSERT INTO b (a_z) VALUES ('z1') 1778 1779 statement ok 1780 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1781 1782 statement ok 1783 INSERT INTO b (a_x, a_y) VALUES (NULL, 'y1') 1784 1785 statement ok 1786 INSERT INTO b (a_x, a_y) VALUES ('x1', NULL) 1787 1788 statement ok 1789 INSERT INTO b (a_x, a_z) VALUES ('x1', 'z1') 1790 1791 statement ok 1792 INSERT INTO b (a_x, a_z) VALUES (NULL, 'z1') 1793 1794 statement ok 1795 INSERT INTO b (a_x, a_z) VALUES ('x1', NULL) 1796 1797 statement ok 1798 INSERT INTO b (a_y, a_z) VALUES ('y1', 'z1') 1799 1800 statement ok 1801 INSERT INTO b (a_y, a_z) VALUES (NULL, 'z1') 1802 1803 statement ok 1804 INSERT INTO b (a_y, a_z) VALUES ('y1', NULL) 1805 1806 statement ok 1807 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 1808 1809 statement ok 1810 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 1811 1812 statement ok 1813 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 1814 1815 statement ok 1816 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 1817 1818 statement ok 1819 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 1820 1821 statement ok 1822 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 1823 1824 statement ok 1825 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, NULL) 1826 1827 statement ok 1828 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', NULL) 1829 1830 statement ok 1831 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z2') 1832 1833 statement ok 1834 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', NULL) 1835 1836 statement ok 1837 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', NULL, 'z2') 1838 1839 statement ok 1840 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y2', 'z2') 1841 1842 statement ok 1843 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 1844 1845 statement ok 1846 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 1847 1848 statement ok 1849 DROP TABLE b, a 1850 1851 #subtest Composite_Simple_Validate_Constraint_Invalid 1852 1853 subtest Composite_Full 1854 # Originally from 26748. 1855 1856 # Test composite key with two columns. 1857 statement ok 1858 CREATE TABLE a ( 1859 x STRING NULL, 1860 y STRING NULL, 1861 CONSTRAINT "primary" PRIMARY KEY (y, x) 1862 ); 1863 1864 statement ok 1865 CREATE TABLE b ( 1866 a_y STRING NULL, 1867 a_x STRING NULL 1868 ); 1869 1870 # Add the constraint separately so that it's unvalidated, so we can test VALIDATE CONSTRAINT. 1871 statement ok 1872 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_y, a_x) REFERENCES a (y, x) MATCH FULL NOT VALID 1873 1874 statement ok 1875 INSERT INTO a (x, y) VALUES ('x1', 'y1') 1876 1877 # These statements should all fail because this uses MATCH FULL. 1878 statement error missing value for column "a_y" in multi-part foreign key 1879 INSERT INTO b (a_x) VALUES ('x1') 1880 1881 statement error missing value for column "a_x" in multi-part foreign key 1882 INSERT INTO b (a_y) VALUES ('y1') 1883 1884 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1885 INSERT INTO b (a_y, a_x) VALUES ('y1', NULL) 1886 1887 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1888 INSERT INTO b (a_y, a_x) VALUES (NULL, 'x1') 1889 1890 # These next two statements should still be allowed. 1891 statement ok 1892 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1893 1894 statement ok 1895 INSERT INTO b (a_x, a_y) VALUES (NULL, NULL) 1896 1897 statement ok 1898 DROP TABLE b, a 1899 1900 # Test composite key with three columns. 1901 statement ok 1902 CREATE TABLE a ( 1903 x STRING NULL, 1904 y STRING NULL, 1905 z STRING NULL, 1906 CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1907 ); 1908 1909 statement ok 1910 CREATE TABLE b ( 1911 a_y STRING NULL, 1912 a_x STRING NULL, 1913 a_z STRING NULL 1914 ); 1915 1916 statement ok 1917 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 1918 1919 statement ok 1920 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 1921 1922 # These statements should all fail because this uses MATCH FULL. 1923 statement error missing values for columns \["a_y" "a_z"\] in multi-part foreign key 1924 INSERT INTO b (a_x) VALUES ('x1') 1925 1926 statement error missing values for columns \["a_x" "a_z"\] in multi-part foreign key 1927 INSERT INTO b (a_y) VALUES ('y1') 1928 1929 statement error missing values for columns \["a_x" "a_y"\] in multi-part foreign key 1930 INSERT INTO b (a_z) VALUES ('z1') 1931 1932 statement error missing value for column "a_z" in multi-part foreign key 1933 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 1934 1935 statement error missing value for column "a_z" in multi-part foreign key 1936 INSERT INTO b (a_x, a_y) VALUES (NULL, 'y1') 1937 1938 statement error missing value for column "a_z" in multi-part foreign key 1939 INSERT INTO b (a_x, a_y) VALUES ('x1', NULL) 1940 1941 statement error missing value for column "a_y" in multi-part foreign key 1942 INSERT INTO b (a_x, a_z) VALUES ('x1', 'z1') 1943 1944 statement error missing value for column "a_y" in multi-part foreign key 1945 INSERT INTO b (a_x, a_z) VALUES (NULL, 'z1') 1946 1947 statement error missing value for column "a_y" in multi-part foreign key 1948 INSERT INTO b (a_x, a_z) VALUES ('x1', NULL) 1949 1950 statement error missing value for column "a_x" in multi-part foreign key 1951 INSERT INTO b (a_y, a_z) VALUES ('y1', 'z1') 1952 1953 statement error missing value for column "a_x" in multi-part foreign key 1954 INSERT INTO b (a_y, a_z) VALUES (NULL, 'z1') 1955 1956 statement error missing value for column "a_x" in multi-part foreign key 1957 INSERT INTO b (a_y, a_z) VALUES ('y1', NULL) 1958 1959 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1960 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 1961 1962 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1963 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 1964 1965 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1966 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 1967 1968 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1969 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 1970 1971 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1972 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 1973 1974 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 1975 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 1976 1977 # This statement should still be allowed. 1978 statement ok 1979 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 1980 1981 statement ok 1982 DROP TABLE b, a 1983 1984 subtest Composite_Full_Add_Constraint_Valid 1985 # Test ADD CONSTRAINT validation by inserting valid rows before the constraint is added. 1986 1987 statement ok 1988 CREATE TABLE a ( 1989 x STRING NULL 1990 ,y STRING NULL 1991 ,z STRING NULL 1992 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 1993 ); 1994 1995 statement ok 1996 CREATE TABLE b ( 1997 a_y STRING NULL 1998 ,a_x STRING NULL 1999 ,a_z STRING NULL 2000 ,INDEX idx (a_z, a_y, a_x) 2001 ); 2002 2003 statement ok 2004 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 2005 2006 # This statement should still be allowed. 2007 statement ok 2008 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 2009 2010 statement ok 2011 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) 2012 2013 statement ok 2014 DROP TABLE b, a 2015 2016 subtest Composite_Full_Validate_Constraint_Invalid 2017 # Test VALIDATE CONSTRAINT by inserting invalid rows before the constraint is added, one at a time. 2018 2019 statement ok 2020 CREATE TABLE a ( 2021 x STRING NULL 2022 ,y STRING NULL 2023 ,z STRING NULL 2024 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 2025 ); 2026 2027 statement ok 2028 CREATE TABLE b ( 2029 a_y STRING NULL 2030 ,a_x STRING NULL 2031 ,a_z STRING NULL 2032 ,INDEX idx (a_z, a_y, a_x) 2033 ); 2034 2035 statement ok 2036 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 2037 2038 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2039 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2040 2041 statement ok 2042 TRUNCATE b 2043 2044 statement ok 2045 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 2046 2047 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2048 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2049 2050 statement ok 2051 TRUNCATE b 2052 2053 statement ok 2054 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 2055 2056 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2057 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2058 2059 statement ok 2060 TRUNCATE b 2061 2062 statement ok 2063 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 2064 2065 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2066 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2067 2068 statement ok 2069 TRUNCATE b 2070 2071 statement ok 2072 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 2073 2074 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2075 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2076 2077 statement ok 2078 TRUNCATE b 2079 2080 statement ok 2081 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 2082 2083 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2084 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2085 2086 statement ok 2087 TRUNCATE b 2088 2089 statement ok 2090 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y1', 'z1') 2091 2092 statement error foreign key violation: "b" row a_z='z1', a_y='y1', a_x='x2', rowid=[0-9]* has no match in "a" 2093 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2094 2095 statement ok 2096 TRUNCATE b 2097 2098 statement ok 2099 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z1') 2100 2101 statement error foreign key violation: "b" row a_z='z1', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 2102 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2103 2104 statement ok 2105 TRUNCATE b 2106 2107 statement ok 2108 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z2') 2109 2110 statement error foreign key violation: "b" row a_z='z2', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 2111 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL 2112 2113 statement ok 2114 DROP TABLE b, a 2115 2116 subtest Composite_Full_Validate_Later 2117 # Test inserting into table with an unvalidated constraint, and running VALIDATE CONSTRAINT later 2118 2119 # Test composite key with two columns. 2120 statement ok 2121 CREATE TABLE a ( 2122 x STRING NULL 2123 ,y STRING NULL 2124 ,CONSTRAINT "primary" PRIMARY KEY (y, x) 2125 ); 2126 2127 statement ok 2128 CREATE TABLE b ( 2129 a_y STRING NULL 2130 ,a_x STRING NULL 2131 ); 2132 2133 # Add the constraint separately so that it's unvalidated, so we can test VALIDATE CONSTRAINT. 2134 statement ok 2135 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_y, a_x) REFERENCES a (y, x) MATCH FULL NOT VALID 2136 2137 statement ok 2138 INSERT INTO a (x, y) VALUES ('x1', 'y1') 2139 2140 # These statements should all fail because this uses MATCH FULL. 2141 statement error missing value for column "a_y" in multi-part foreign key 2142 INSERT INTO b (a_x) VALUES ('x1') 2143 2144 statement error missing value for column "a_x" in multi-part foreign key 2145 INSERT INTO b (a_y) VALUES ('y1') 2146 2147 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2148 INSERT INTO b (a_y, a_x) VALUES ('y1', NULL) 2149 2150 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2151 INSERT INTO b (a_y, a_x) VALUES (NULL, 'x1') 2152 2153 # These next two statements should still be allowed. 2154 statement ok 2155 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 2156 2157 statement ok 2158 INSERT INTO b (a_x, a_y) VALUES (NULL, NULL) 2159 2160 statement ok 2161 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2162 2163 statement ok 2164 DROP TABLE b, a 2165 2166 # Test composite key with three columns. 2167 statement ok 2168 CREATE TABLE a ( 2169 x STRING NULL 2170 ,y STRING NULL 2171 ,z STRING NULL 2172 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 2173 ); 2174 2175 statement ok 2176 CREATE TABLE b ( 2177 a_y STRING NULL 2178 ,a_x STRING NULL 2179 ,a_z STRING NULL 2180 ); 2181 2182 # Add the constraint separately so that it's unvalidated, so we can test VALIDATE CONSTRAINT. 2183 statement ok 2184 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2185 2186 statement ok 2187 INSERT INTO a (x, y, z) VALUES ('x1', 'y1', 'z1') 2188 2189 # These statements should all fail because this uses MATCH FULL. 2190 statement error missing values for columns \["a_y" "a_z"\] in multi-part foreign key 2191 INSERT INTO b (a_x) VALUES ('x1') 2192 2193 statement error missing values for columns \["a_x" "a_z"\] in multi-part foreign key 2194 INSERT INTO b (a_y) VALUES ('y1') 2195 2196 statement error missing values for columns \["a_x" "a_y"\] in multi-part foreign key 2197 INSERT INTO b (a_z) VALUES ('z1') 2198 2199 statement error missing value for column "a_z" in multi-part foreign key 2200 INSERT INTO b (a_x, a_y) VALUES ('x1', 'y1') 2201 2202 statement error missing value for column "a_z" in multi-part foreign key 2203 INSERT INTO b (a_x, a_y) VALUES (NULL, 'y1') 2204 2205 statement error missing value for column "a_z" in multi-part foreign key 2206 INSERT INTO b (a_x, a_y) VALUES ('x1', NULL) 2207 2208 statement error missing value for column "a_y" in multi-part foreign key 2209 INSERT INTO b (a_x, a_z) VALUES ('x1', 'z1') 2210 2211 statement error missing value for column "a_y" in multi-part foreign key 2212 INSERT INTO b (a_x, a_z) VALUES (NULL, 'z1') 2213 2214 statement error missing value for column "a_y" in multi-part foreign key 2215 INSERT INTO b (a_x, a_z) VALUES ('x1', NULL) 2216 2217 statement error missing value for column "a_x" in multi-part foreign key 2218 INSERT INTO b (a_y, a_z) VALUES ('y1', 'z1') 2219 2220 statement error missing value for column "a_x" in multi-part foreign key 2221 INSERT INTO b (a_y, a_z) VALUES (NULL, 'z1') 2222 2223 statement error missing value for column "a_x" in multi-part foreign key 2224 INSERT INTO b (a_y, a_z) VALUES ('y1', NULL) 2225 2226 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2227 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 2228 2229 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2230 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 2231 2232 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2233 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 2234 2235 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2236 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 2237 2238 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2239 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 2240 2241 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2242 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 2243 2244 # This statement should still be allowed. 2245 statement ok 2246 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, NULL) 2247 2248 statement ok 2249 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2250 2251 statement ok 2252 DROP TABLE b, a 2253 2254 subtest Composite_Full_Validate_Constraint_Invalid 2255 # Test VALIDATE CONSTRAINT by inserting invalid rows before the constraint is added, one at a time. 2256 2257 statement ok 2258 CREATE TABLE a ( 2259 x STRING NULL 2260 ,y STRING NULL 2261 ,z STRING NULL 2262 ,CONSTRAINT "primary" PRIMARY KEY (z, y, x) 2263 ); 2264 2265 statement ok 2266 CREATE TABLE b ( 2267 a_y STRING NULL 2268 ,a_x STRING NULL 2269 ,a_z STRING NULL 2270 ,INDEX idx (a_z, a_y, a_x) 2271 ); 2272 2273 statement ok 2274 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, NULL) 2275 2276 statement ok 2277 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2278 2279 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2280 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2281 2282 statement ok 2283 TRUNCATE b 2284 2285 statement ok 2286 ALTER TABLE b DROP CONSTRAINT fk_ref 2287 2288 statement ok 2289 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', NULL) 2290 2291 statement ok 2292 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2293 2294 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2295 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2296 2297 statement ok 2298 TRUNCATE b 2299 2300 statement ok 2301 ALTER TABLE b DROP CONSTRAINT fk_ref 2302 2303 statement ok 2304 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, NULL, 'z1') 2305 2306 statement ok 2307 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2308 2309 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2310 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2311 2312 statement ok 2313 TRUNCATE b 2314 2315 statement ok 2316 ALTER TABLE b DROP CONSTRAINT fk_ref 2317 2318 statement ok 2319 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', 'y1', NULL) 2320 2321 statement ok 2322 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2323 2324 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2325 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2326 2327 statement ok 2328 TRUNCATE b 2329 2330 statement ok 2331 ALTER TABLE b DROP CONSTRAINT fk_ref 2332 2333 statement ok 2334 INSERT INTO b (a_x, a_y, a_z) VALUES ('x1', NULL, 'z1') 2335 2336 statement ok 2337 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2338 2339 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2340 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2341 2342 statement ok 2343 TRUNCATE b 2344 2345 statement ok 2346 ALTER TABLE b DROP CONSTRAINT fk_ref 2347 2348 statement ok 2349 INSERT INTO b (a_x, a_y, a_z) VALUES (NULL, 'y1', 'z1') 2350 2351 statement ok 2352 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2353 2354 statement error foreign key violation: MATCH FULL does not allow mixing of null and nonnull values 2355 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2356 2357 statement ok 2358 TRUNCATE b 2359 2360 statement ok 2361 ALTER TABLE b DROP CONSTRAINT fk_ref 2362 2363 statement ok 2364 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y1', 'z1') 2365 2366 statement ok 2367 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2368 2369 statement error pq: foreign key violation: "b" row a_z='z1', a_y='y1', a_x='x2', rowid=[0-9]* has no match in "a" 2370 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2371 2372 statement ok 2373 TRUNCATE b 2374 2375 statement ok 2376 ALTER TABLE b DROP CONSTRAINT fk_ref 2377 2378 statement ok 2379 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z1') 2380 2381 statement ok 2382 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2383 2384 statement error pq: foreign key violation: "b" row a_z='z1', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 2385 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2386 2387 statement ok 2388 TRUNCATE b 2389 2390 statement ok 2391 ALTER TABLE b DROP CONSTRAINT fk_ref 2392 2393 statement ok 2394 INSERT INTO b (a_x, a_y, a_z) VALUES ('x2', 'y2', 'z2') 2395 2396 statement ok 2397 ALTER TABLE b ADD CONSTRAINT fk_ref FOREIGN KEY (a_z, a_y, a_x) REFERENCES a (z, y, x) MATCH FULL NOT VALID 2398 2399 statement error pq: foreign key violation: "b" row a_z='z2', a_y='y2', a_x='x2', rowid=[0-9]* has no match in "a" 2400 ALTER TABLE b VALIDATE CONSTRAINT fk_ref 2401 2402 statement ok 2403 DROP TABLE b, a 2404 2405 subtest auto_add_fk_with_composite_index_to_empty_table 2406 2407 statement ok 2408 CREATE TABLE parent_composite_index (a_id INT NOT NULL, b_id INT NOT NULL, PRIMARY KEY (a_id, b_id)) 2409 2410 statement ok 2411 CREATE TABLE child_composite_index (id SERIAL NOT NULL, parent_a_id INT, parent_b_id INT, PRIMARY KEY (id)) 2412 2413 # The (composite) index needed for the fk constraint is automatically added because the table is empty 2414 statement ok 2415 ALTER TABLE child_composite_index ADD CONSTRAINT fk_id FOREIGN KEY (parent_a_id, parent_b_id) REFERENCES parent_composite_index; 2416 2417 statement ok 2418 INSERT INTO parent_composite_index VALUES (100, 200) 2419 2420 statement ok 2421 INSERT INTO child_composite_index VALUES (1, 100, 200) 2422 2423 statement error foreign key violation: value \[100 300\] not found in parent_composite_index@primary \[a_id b_id\] 2424 INSERT INTO child_composite_index VALUES (2, 100, 300) 2425 2426 statement ok 2427 DROP TABLE child_composite_index, parent_composite_index 2428 2429 subtest auto_add_fk_to_nonempty_table_error 2430 2431 statement ok 2432 CREATE TABLE nonempty_a (id SERIAL NOT NULL, self_id INT, b_id INT NOT NULL, PRIMARY KEY (id)) 2433 2434 statement ok 2435 CREATE TABLE nonempty_b (id SERIAL NOT NULL, PRIMARY KEY (id)) 2436 2437 statement ok 2438 INSERT INTO nonempty_b VALUES (1), (2), (3); 2439 2440 statement ok 2441 INSERT INTO nonempty_a VALUES (1, NULL, 1) 2442 2443 # Fails because self_id is not indexed, and an index will not be automatically created because the table is nonempty 2444 statement error foreign key requires an existing index on columns \("self_id"\) 2445 ALTER TABLE nonempty_a ADD CONSTRAINT fk_self_id FOREIGN KEY (self_id) REFERENCES nonempty_a; 2446 2447 statement ok 2448 CREATE INDEX ON nonempty_a (self_id) 2449 2450 # This now succeeds with the manually added index 2451 statement ok 2452 ALTER TABLE nonempty_a ADD CONSTRAINT fk_self_id FOREIGN KEY (self_id) REFERENCES nonempty_a; 2453 2454 # Fails because b_id is not indexed, and an index will not be automatically created because the table is nonempty 2455 statement error foreign key requires an existing index on columns \("b_id"\) 2456 ALTER TABLE nonempty_a ADD CONSTRAINT fk_b FOREIGN KEY (b_id) REFERENCES nonempty_b; 2457 2458 statement ok 2459 CREATE INDEX ON nonempty_a (b_id) 2460 2461 # This now succeeds with the manually added index 2462 statement ok 2463 ALTER TABLE nonempty_a ADD CONSTRAINT fk_b FOREIGN KEY (b_id) REFERENCES nonempty_b; 2464 2465 statement ok 2466 DROP TABLE nonempty_a, nonempty_b 2467 2468 subtest auto_add_fk_index_name_collision 2469 2470 statement ok 2471 CREATE TABLE parent_name_collision (id SERIAL NOT NULL, PRIMARY KEY (id)) 2472 2473 statement ok 2474 CREATE TABLE child_name_collision (id SERIAL NOT NULL, parent_id INT, other_col INT) 2475 2476 statement ok 2477 CREATE INDEX child_name_collision_auto_index_fk_id ON child_name_collision (other_col) 2478 2479 # Testing the unusual case where an index already exists that has the same name 2480 # as the index to be auto-generated when adding a fk constraint to an empty 2481 # table (but the existing index is not on the referencing column), in which 2482 # case the ALTER TABLE will choose another unique name for the index. 2483 statement ok 2484 ALTER TABLE child_name_collision ADD CONSTRAINT fk_id FOREIGN KEY (parent_id) references parent_name_collision 2485 2486 subtest auto_add_fk_duplicate_cols_error 2487 2488 statement ok 2489 CREATE TABLE parent (a_id INT, b_id INT, PRIMARY KEY (a_id, b_id)) 2490 2491 statement ok 2492 CREATE TABLE child_duplicate_cols (id INT, parent_id INT, PRIMARY KEY (id)) 2493 2494 # The fk constraint is invalid because it has duplicate columns, so automatically adding the index fails 2495 statement error index \"child_duplicate_cols_auto_index_fk\" contains duplicate column \"parent_id\" 2496 ALTER TABLE child_duplicate_cols ADD CONSTRAINT fk FOREIGN KEY (parent_id, parent_id) references parent 2497 2498 statement ok 2499 DROP TABLE parent, child_duplicate_cols 2500 2501 # Check that a FK cannot be added to a column being backfilled. 2502 # If this behavior is changed you should create a test similar to 2503 # TestCRUDWhileColumnBackfill to test that CRUD operations operating 2504 # with FK relationships work correctly over NON NULL columns that 2505 # are still being backfilled. 2506 subtest cannot_add_fk_on_col_needing_backfill 2507 2508 statement ok 2509 CREATE TABLE parentid ( 2510 k INT NOT NULL PRIMARY KEY, 2511 v INT NOT NULL 2512 ); 2513 2514 statement ok 2515 CREATE TABLE childid ( 2516 id INT NOT NULL PRIMARY KEY 2517 ); 2518 2519 # Make tables non-empty. 2520 statement ok 2521 INSERT INTO parentid (k, v) VALUES (0, 1); INSERT INTO childid (id) VALUES (2); 2522 2523 statement error column \"id\" does not exist 2524 BEGIN; ALTER TABLE parentid ADD id INT NOT NULL AS (k + 2) STORED; ALTER TABLE childid ADD CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES parentid (id); 2525 2526 statement ok 2527 ROLLBACK; 2528 2529 subtest dont_check_nulls 2530 # Make sure that nulls are never checked while executing FK constraints. 2531 2532 statement ok 2533 CREATE TABLE t1(x INT UNIQUE) 2534 2535 statement ok 2536 INSERT INTO t1(x) VALUES (1), (null) 2537 2538 statement ok 2539 CREATE TABLE t2( 2540 x INT REFERENCES t1(x) 2541 ) 2542 2543 statement ok 2544 INSERT INTO t2(x) VALUES (1), (null) 2545 2546 statement ok 2547 DELETE FROM t1 WHERE x IS NULL 2548 2549 statement ok 2550 DROP TABLE t1, t2 CASCADE 2551 2552 subtest test_not_valid_fk 2553 2554 statement ok 2555 CREATE TABLE person (id INT PRIMARY KEY, age INT, name STRING) 2556 2557 statement ok 2558 CREATE TABLE pet (id INT PRIMARY KEY, name STRING) 2559 2560 statement ok 2561 INSERT INTO pet VALUES (0, 'crookshanks') 2562 2563 statement error pq: foreign key violation: "pet" row id=0 has no match in "person" 2564 ALTER TABLE pet ADD CONSTRAINT fk_constraint FOREIGN KEY (id) REFERENCES person (id) 2565 2566 statement ok 2567 ALTER TABLE pet ADD CONSTRAINT fk_constraint FOREIGN KEY (id) REFERENCES person (id) NOT VALID 2568 2569 query TTTTB 2570 SHOW CONSTRAINTS FROM pet 2571 ---- 2572 pet fk_constraint FOREIGN KEY FOREIGN KEY (id) REFERENCES person(id) false 2573 pet primary PRIMARY KEY PRIMARY KEY (id ASC) true 2574 2575 statement error pq: foreign key violation: "pet" row id=0 has no match in "person" 2576 ALTER TABLE pet VALIDATE CONSTRAINT fk_constraint 2577 2578 statement ok 2579 INSERT INTO person VALUES (0, 18, 'Hermione Granger') 2580 2581 statement ok 2582 ALTER TABLE pet VALIDATE CONSTRAINT fk_constraint 2583 2584 query TTTTB 2585 SHOW CONSTRAINTS FROM pet 2586 ---- 2587 pet fk_constraint FOREIGN KEY FOREIGN KEY (id) REFERENCES person(id) true 2588 pet primary PRIMARY KEY PRIMARY KEY (id ASC) true 2589 2590 statement ok 2591 DROP TABLE person, pet 2592 2593 # Ensure FK semantics for temporary and persistent tables work correctly. 2594 # Temporary tables can not create FK references to persistent tables, and 2595 # persistent tables can not create FK references to temporary tables. 2596 2597 statement ok 2598 SET experimental_enable_temp_tables = true 2599 2600 statement ok 2601 CREATE TEMP TABLE a_temp(a INT PRIMARY KEY) 2602 2603 statement ok 2604 CREATE TEMP TABLE b_temp(b INT, FOREIGN KEY(b) REFERENCES a_temp(a)) 2605 2606 statement error pq: constraints on permanent tables may reference only permanent tables 2607 CREATE TABLE a_persistent(a INT, FOREIGN KEY (a) REFERENCES a_temp(a)) 2608 2609 statement ok 2610 CREATE TABLE c_persistent(c INT PRIMARY KEY) 2611 2612 statement error pq: constraints on temporary tables may reference only temporary tables 2613 CREATE TEMP TABLE c_temp(c INT, FOREIGN KEY (c) REFERENCES c_persistent(c)) 2614 2615 # Test that when the foreign key is a primary index we only look up the primary 2616 # family. 2617 subtest families 2618 2619 statement ok 2620 CREATE TABLE fam_parent ( 2621 k INT PRIMARY KEY, 2622 a INT, 2623 b INT NOT NULL, 2624 FAMILY (k, a), 2625 FAMILY (b) 2626 ) 2627 2628 statement ok 2629 CREATE TABLE fam_child ( 2630 k INT PRIMARY KEY, 2631 fk INT REFERENCES fam_parent(k) 2632 ) 2633 2634 statement ok 2635 INSERT INTO fam_parent VALUES (1, 1, 1) 2636 2637 statement ok 2638 GRANT ALL ON fam_parent TO testuser; 2639 GRANT ALL ON fam_child TO testuser; 2640 2641 # Open a transaction that modifies b. 2642 statement ok 2643 BEGIN 2644 2645 statement count 1 2646 UPDATE fam_parent SET b = b+1 WHERE k = 1 2647 2648 user testuser 2649 2650 # Run an INSERT which needs to check existence of the row. If we try to scan 2651 # the entire row, this blocks on the other transaction. We should only be 2652 # scanning the primary column family. A critical reason why this works is 2653 # because column b is NOT NULL, so the UPDATE statement does not read or 2654 # acquire FOR UPDATE locks on the primary column family because a lookup 2655 # on b's column family is enough to determine whether the row exists or not. 2656 statement ok 2657 INSERT INTO fam_child VALUES (1, 1) 2658 2659 user root 2660 2661 statement ok 2662 COMMIT 2663 2664 # Regression test for #42498: MATCH FULL validation should work when columns in 2665 # a composite FK reference have different types. 2666 subtest 42498_match_full_mixed_types 2667 2668 statement ok 2669 CREATE TABLE table1_42498 (col1 REGPROC NOT NULL, col2 DATE NOT NULL) 2670 2671 statement ok 2672 CREATE TABLE table2_42498 (col3 REGPROC NOT NULL, col4 DATE NOT NULL, UNIQUE (col4, col3)) 2673 2674 statement ok 2675 ALTER TABLE table1_42498 ADD FOREIGN KEY (col2, col1) REFERENCES table2_42498 (col4, col3) MATCH FULL 2676 2677 statement ok 2678 DROP TABLE table1_42498, table2_42498 CASCADE 2679 2680 # Regression test for #42680: The unique index used for the referenced columns 2681 # must index only those columns and no others, in order to enforce uniqueness 2682 # for the FK constraint. 2683 subtest 42680_unique_index_must_exactly_match_columns 2684 2685 # The table has a unique index on (a, b) but not (a). 2686 statement ok 2687 CREATE TABLE target (a INT, b INT, UNIQUE INDEX (a, b)); 2688 2689 statement ok 2690 CREATE TABLE source (a INT, INDEX (a)); 2691 2692 statement error there is no unique constraint matching given keys for referenced table target 2693 ALTER TABLE source ADD FOREIGN KEY (a) REFERENCES target (a); 2694 2695 subtest foreign_key_multiple_key_references 2696 2697 # Create a recursive table: messages refs good_users refs users. 2698 # Sometimes, messages refs users directly. 2699 2700 statement ok 2701 CREATE TABLE users ( 2702 id INTEGER PRIMARY KEY 2703 ) 2704 2705 statement ok 2706 CREATE TABLE good_users ( 2707 id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE, 2708 id2 INTEGER UNIQUE 2709 ) 2710 2711 statement ok 2712 CREATE SEQUENCE message_seq START 1 INCREMENT 1 2713 2714 statement ok 2715 CREATE TABLE messages ( 2716 message_id INT PRIMARY KEY DEFAULT nextval('message_seq'), 2717 user_id_1 integer REFERENCES good_users(id) ON DELETE CASCADE ON UPDATE CASCADE, 2718 user_id_2 integer REFERENCES good_users(id) ON DELETE CASCADE ON UPDATE CASCADE, -- this is recursive through good_users 2719 text string 2720 ) 2721 2722 # Add the same foreign key twice onto user. 2723 statement ok 2724 ALTER TABLE messages ADD FOREIGN KEY (user_id_1) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE 2725 2726 statement ok 2727 ALTER TABLE messages ADD FOREIGN KEY (user_id_1) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE 2728 2729 # Insert some rows 2730 statement ok 2731 INSERT INTO users(id) VALUES (1), (2), (3) 2732 2733 statement ok 2734 INSERT INTO good_users(id, id2) VALUES (1, 10), (2, 20), (3, 30) 2735 2736 statement ok 2737 INSERT INTO messages (user_id_1, user_id_2, text) VALUES 2738 (1, 2, 'hi jordan'), 2739 (2, 1, 'hi oliver'), 2740 (1, 2, 'you are a good user jordan'), 2741 (1, 3, 'you are a good user too rohan'), 2742 (3, 1, 'lucy is a good user') 2743 2744 query error 999.*good_users 2745 INSERT INTO messages (user_id_1, user_id_2, text) VALUES 2746 (999, 1, 'you are a bad user') 2747 2748 # Now try and update the user_id. 2749 statement ok 2750 update users set id = id * 10 2751 2752 # See that it propagates. 2753 query I 2754 SELECT * FROM users ORDER BY id ASC 2755 ---- 2756 10 2757 20 2758 30 2759 2760 query II 2761 SELECT * FROM good_users ORDER BY id ASC 2762 ---- 2763 10 10 2764 20 20 2765 30 30 2766 2767 query IIIT 2768 SELECT * FROM messages ORDER BY message_id ASC 2769 ---- 2770 1 10 20 hi jordan 2771 2 20 10 hi oliver 2772 3 10 20 you are a good user jordan 2773 4 10 30 you are a good user too rohan 2774 5 30 10 lucy is a good user 2775 2776 # Delete from users should work as well 2777 statement ok 2778 DELETE FROM users WHERE id = 30 2779 2780 # See that it propagates. 2781 query I 2782 SELECT * FROM users ORDER BY id ASC 2783 ---- 2784 10 2785 20 2786 2787 query II 2788 SELECT * FROM good_users ORDER BY id ASC 2789 ---- 2790 10 10 2791 20 20 2792 2793 query IIIT 2794 SELECT * FROM messages ORDER BY message_id ASC 2795 ---- 2796 1 10 20 hi jordan 2797 2 20 10 hi oliver 2798 3 10 20 you are a good user jordan 2799 2800 # Add a foreign key on id2, which is a different column. 2801 # This one is restrictive on updates and deletes. 2802 statement ok 2803 ALTER TABLE messages ADD FOREIGN KEY (user_id_1) REFERENCES good_users(id2) 2804 2805 statement ok 2806 ALTER TABLE good_users ADD FOREIGN KEY (id2) REFERENCES users(id) 2807 2808 # Updating should no longer work, since we have a restrict. 2809 statement error value \[2000\] not found in good_users@good_users_id2_key \[id2\] 2810 UPDATE users SET id = id * 100 WHERE id = 20 2811 2812 # Insert some more stuff -- make sure it still behaves as expected. 2813 statement ok 2814 INSERT INTO users VALUES (40) 2815 2816 statement ok 2817 INSERT INTO good_users VALUES (40, 40) 2818 2819 statement ok 2820 INSERT INTO messages (user_id_1, user_id_2, text) VALUES 2821 (10, 40, 'oh hi mark'), 2822 (40, 10, 'youre tearing me apart lisa!') 2823 2824 query error 999.*good_users 2825 INSERT INTO messages (user_id_1, user_id_2, text) VALUES 2826 (999, 40, 'johnny is my best friend') 2827 2828 # And sanity check everything. 2829 query IIIT 2830 SELECT * FROM messages ORDER BY message_id ASC 2831 ---- 2832 1 10 20 hi jordan 2833 2 20 10 hi oliver 2834 3 10 20 you are a good user jordan 2835 7 10 40 oh hi mark 2836 8 40 10 youre tearing me apart lisa! 2837 2838 # Delete should still be okay since the cascade from id1 should "win". 2839 statement ok 2840 DELETE FROM users WHERE id = 20 2841 2842 query IIIT 2843 SELECT * FROM messages ORDER BY message_id ASC 2844 ---- 2845 7 10 40 oh hi mark 2846 8 40 10 youre tearing me apart lisa! 2847 2848 # Drop everything. 2849 statement ok 2850 DROP TABLE users CASCADE 2851 2852 statement ok 2853 DROP TABLE good_users CASCADE 2854 2855 statement ok 2856 DROP TABLE messages 2857 2858 # Test conflicting foreign keys ON DELETE and ON UPDATE - some known corner cases. 2859 # SET NULL/SET DEFAULT/CASCADE have priority and are evaluated in order, followed 2860 # by RESTRICT/NO ACTION. 2861 2862 # 2863 # ON DELETE 2864 # 2865 2866 statement ok 2867 CREATE TABLE t1 (a INT PRIMARY KEY); CREATE TABLE t2 (a INT DEFAULT 1) 2868 2869 # 'ON DELETE NO ACTION', followed by 'ON DELETE SET NULL' 2870 statement ok 2871 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE NO ACTION; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET NULL 2872 2873 statement ok 2874 insert into t1 values (123); insert into t2 values (123) 2875 2876 statement ok 2877 DELETE FROM t1 WHERE a = 123 2878 2879 query I 2880 SELECT * FROM t2 2881 ---- 2882 NULL 2883 2884 statement ok 2885 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2886 2887 # 'ON DELETE NO ACTION', followed by 'ON DELETE CASCADE' 2888 statement ok 2889 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE NO ACTION; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE CASCADE 2890 2891 statement ok 2892 insert into t1 values (123); insert into t2 values (123) 2893 2894 statement ok 2895 DELETE FROM t1 WHERE a = 123 2896 2897 query I 2898 SELECT * FROM t2 2899 ---- 2900 2901 statement ok 2902 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2903 2904 # 'ON DELETE RESTRICT', followed by 'ON DELETE SET NULL' 2905 statement ok 2906 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE RESTRICT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET NULL 2907 2908 statement ok 2909 insert into t1 values (123); insert into t2 values (123) 2910 2911 statement ok 2912 DELETE FROM t1 WHERE a = 123 2913 2914 query I 2915 SELECT * FROM t2 2916 ---- 2917 NULL 2918 2919 statement ok 2920 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2921 2922 # 'ON DELETE RESTRICT', followed by 'ON DELETE CASCADE' 2923 statement ok 2924 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE RESTRICT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE CASCADE 2925 2926 statement ok 2927 insert into t1 values (123); insert into t2 values (123) 2928 2929 statement ok 2930 DELETE FROM t1 WHERE a = 123 2931 2932 query I 2933 SELECT * FROM t2 2934 ---- 2935 2936 statement ok 2937 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2938 2939 # 'ON DELETE CASCADE', followed by 'ON DELETE SET DEFAULT' 2940 statement ok 2941 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE CASCADE; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET DEFAULT 2942 2943 statement ok 2944 insert into t1 values (123); insert into t2 values (123) 2945 2946 statement ok 2947 DELETE FROM t1 WHERE a = 123 2948 2949 query I 2950 SELECT * FROM t2 2951 ---- 2952 2953 statement ok 2954 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2955 2956 # 'ON DELETE CASCADE', followed by 'ON DELETE SET NULL' 2957 statement ok 2958 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE CASCADE; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET NULL 2959 2960 statement ok 2961 insert into t1 values (123); insert into t2 values (123) 2962 2963 statement ok 2964 DELETE FROM t1 WHERE a = 123 2965 2966 query I 2967 SELECT * FROM t2 2968 ---- 2969 2970 statement ok 2971 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2972 2973 # 'ON DELETE SET DEFAULT', followed by 'ON DELETE CASCADE' 2974 statement ok 2975 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET DEFAULT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE CASCADE 2976 2977 statement ok 2978 insert into t1 values (123); insert into t2 values (123) 2979 2980 statement error value \[1\] not found in t1@primary \[a\] 2981 DELETE FROM t1 WHERE a = 123 2982 2983 query I 2984 SELECT * FROM t2 2985 ---- 2986 123 2987 2988 statement ok 2989 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 2990 2991 # 'ON DELETE SET DEFAULT', followed by 'ON DELETE SET NULL' 2992 statement ok 2993 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET DEFAULT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET NULL 2994 2995 statement ok 2996 insert into t1 values (123); insert into t2 values (123) 2997 2998 statement error value \[1\] not found in t1@primary \[a\] 2999 DELETE FROM t1 WHERE a = 123 3000 3001 query I 3002 SELECT * FROM t2 3003 ---- 3004 123 3005 3006 statement ok 3007 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3008 3009 # 'ON DELETE SET NULL', followed by 'ON DELETE SET DEFAULT' 3010 statement ok 3011 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET NULL; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON DELETE SET DEFAULT 3012 3013 statement ok 3014 insert into t1 values (123); insert into t2 values (123) 3015 3016 statement ok 3017 DELETE FROM t1 WHERE a = 123 3018 3019 query I 3020 SELECT * FROM t2 3021 ---- 3022 NULL 3023 3024 statement ok 3025 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3026 3027 statement ok 3028 DROP TABLE t2 CASCADE; DROP TABLE t1 CASCADE 3029 3030 # 3031 # ON UPDATE 3032 # 3033 3034 statement ok 3035 CREATE TABLE t1 (a INT PRIMARY KEY); CREATE TABLE t2 (a INT DEFAULT 1) 3036 3037 # 'ON UPDATE NO ACTION', followed by 'ON UPDATE SET NULL' 3038 statement ok 3039 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE NO ACTION; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET NULL 3040 3041 statement ok 3042 insert into t1 values (123); insert into t2 values (123) 3043 3044 statement ok 3045 UPDATE t1 SET a = 2 WHERE a = 123 3046 3047 query I 3048 SELECT * FROM t2 3049 ---- 3050 NULL 3051 3052 statement ok 3053 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3054 3055 # 'ON UPDATE NO ACTION', followed by 'ON UPDATE CASCADE' 3056 statement ok 3057 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE NO ACTION; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE CASCADE 3058 3059 statement ok 3060 insert into t1 values (123); insert into t2 values (123) 3061 3062 statement ok 3063 UPDATE t1 SET a = 2 WHERE a = 123 3064 3065 query I 3066 SELECT * FROM t2 3067 ---- 3068 2 3069 3070 statement ok 3071 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3072 3073 # 'ON UPDATE RESTRICT', followed by 'ON UPDATE SET NULL' 3074 statement ok 3075 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE RESTRICT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET NULL 3076 3077 statement ok 3078 insert into t1 values (123); insert into t2 values (123) 3079 3080 statement ok 3081 UPDATE t1 SET a = 2 WHERE a = 123 3082 3083 query I 3084 SELECT * FROM t2 3085 ---- 3086 NULL 3087 3088 statement ok 3089 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3090 3091 # 'ON UPDATE RESTRICT', followed by 'ON UPDATE CASCADE' 3092 statement ok 3093 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE RESTRICT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE CASCADE 3094 3095 statement ok 3096 insert into t1 values (123); insert into t2 values (123) 3097 3098 statement ok 3099 UPDATE t1 SET a = 2 WHERE a = 123 3100 3101 query I 3102 SELECT * FROM t2 3103 ---- 3104 2 3105 3106 statement ok 3107 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3108 3109 # 'ON UPDATE CASCADE', followed by 'ON UPDATE SET DEFAULT' 3110 statement ok 3111 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE CASCADE; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET DEFAULT 3112 3113 statement ok 3114 insert into t1 values (123); insert into t2 values (123) 3115 3116 statement ok 3117 UPDATE t1 SET a = 2 WHERE a = 123 3118 3119 query I 3120 SELECT * FROM t2 3121 ---- 3122 2 3123 3124 statement ok 3125 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3126 3127 # 'ON UPDATE CASCADE', followed by 'ON UPDATE SET NULL' 3128 statement ok 3129 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE CASCADE; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET NULL 3130 3131 statement ok 3132 insert into t1 values (123); insert into t2 values (123) 3133 3134 statement ok 3135 UPDATE t1 SET a = 2 WHERE a = 123 3136 3137 query I 3138 SELECT * FROM t2 3139 ---- 3140 2 3141 3142 statement ok 3143 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3144 3145 # 'ON UPDATE SET DEFAULT', followed by 'ON UPDATE CASCADE' 3146 statement ok 3147 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET DEFAULT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE CASCADE 3148 3149 statement ok 3150 insert into t1 values (123); insert into t2 values (123) 3151 3152 statement error value \[1\] not found in t1@primary \[a\] 3153 UPDATE t1 SET a = 2 WHERE a = 123 3154 3155 query I 3156 SELECT * FROM t2 3157 ---- 3158 123 3159 3160 statement ok 3161 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3162 3163 # 'ON UPDATE SET DEFAULT', followed by 'ON UPDATE SET NULL' 3164 statement ok 3165 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET DEFAULT; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET NULL 3166 3167 statement ok 3168 insert into t1 values (123); insert into t2 values (123) 3169 3170 statement error value \[1\] not found in t1@primary \[a\] 3171 UPDATE t1 SET a = 2 WHERE a = 123 3172 3173 query I 3174 SELECT * FROM t2 3175 ---- 3176 123 3177 3178 statement ok 3179 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3180 3181 # 'ON UPDATE SET NULL', followed by 'ON UPDATE SET DEFAULT' 3182 statement ok 3183 ALTER TABLE t2 ADD CONSTRAINT fk1 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET NULL; ALTER TABLE t2 ADD CONSTRAINT fk2 FOREIGN KEY (a) REFERENCES t1 ON UPDATE SET DEFAULT 3184 3185 statement ok 3186 insert into t1 values (123); insert into t2 values (123) 3187 3188 statement ok 3189 UPDATE t1 SET a = 2 WHERE a = 123 3190 3191 query I 3192 SELECT * FROM t2 3193 ---- 3194 NULL 3195 3196 statement ok 3197 ALTER TABLE t2 DROP CONSTRAINT fk1; ALTER TABLE t2 DROP CONSTRAINT fk2; TRUNCATE TABLE t2; TRUNCATE TABLE t1 3198 3199 statement ok 3200 DROP TABLE t2 CASCADE; DROP TABLE t1 CASCADE 3201 3202 # Regression test for #49628. 3203 statement ok 3204 CREATE TABLE xyz (x INT, y INT, z INT, PRIMARY KEY (x, y, z)); 3205 CREATE TABLE fk_ref 3206 ( 3207 a INT NOT NULL, 3208 b INT, 3209 c INT NOT NULL, 3210 FOREIGN KEY (a, b, c) REFERENCES xyz (x, y, z) 3211 ); 3212 INSERT INTO fk_ref (VALUES (1, NULL, 1)); 3213 3214 query IIIIII 3215 SELECT * FROM fk_ref LEFT JOIN xyz ON a = x 3216 ---- 3217 1 NULL 1 NULL NULL NULL 3218 3219 statement ok 3220 DROP TABLE fk_ref; 3221 DROP TABLE xyz;