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;