@@ -24,7 +24,7 @@ import (
2424 "github.com/dolthub/vitess/go/mysql"
2525)
2626
27- var UpdateTests = []WriteQueryTest {
27+ var UpdateWriteQueryTests = []WriteQueryTest {
2828 {
2929 WriteQuery : "UPDATE mytable SET s = 'updated';" ,
3030 ExpectedWriteResult : []sql.Row {{NewUpdateResult (3 , 3 )}},
@@ -470,6 +470,103 @@ var UpdateTests = []WriteQueryTest{
470470 },
471471}
472472
473+ var UpdateScriptTests = []ScriptTest {
474+ {
475+ Dialect : "mysql" ,
476+ Name : "UPDATE join – single table, with FK constraint" ,
477+ SetUpScript : []string {
478+ "CREATE TABLE customers (id INT PRIMARY KEY, name TEXT);" ,
479+ "CREATE TABLE orders (id INT PRIMARY KEY, customer_id INT, amount INT, FOREIGN KEY (customer_id) REFERENCES customers(id));" ,
480+ "INSERT INTO customers VALUES (1, 'Alice'), (2, 'Bob');" ,
481+ "INSERT INTO orders VALUES (101, 1, 50), (102, 2, 75);" ,
482+ },
483+ Assertions : []ScriptTestAssertion {
484+ {
485+ Query : "UPDATE orders o JOIN customers c ON o.customer_id = c.id SET o.customer_id = 123 where o.customer_id != 1;" ,
486+ ExpectedErr : sql .ErrForeignKeyChildViolation ,
487+ },
488+ {
489+ Query : "SELECT * FROM orders;" ,
490+ Expected : []sql.Row {
491+ {101 , 1 , 50 }, {102 , 2 , 75 },
492+ },
493+ },
494+ },
495+ },
496+ {
497+ Dialect : "mysql" ,
498+ Name : "UPDATE join – multiple tables, with FK constraint" ,
499+ SetUpScript : []string {
500+ "CREATE TABLE parent1 (id INT PRIMARY KEY);" ,
501+ "CREATE TABLE parent2 (id INT PRIMARY KEY);" ,
502+ "CREATE TABLE child1 (id INT PRIMARY KEY, p1_id INT, FOREIGN KEY (p1_id) REFERENCES parent1(id));" ,
503+ "CREATE TABLE child2 (id INT PRIMARY KEY, p2_id INT, FOREIGN KEY (p2_id) REFERENCES parent2(id));" ,
504+ "INSERT INTO parent1 VALUES (1), (3);" ,
505+ "INSERT INTO parent2 VALUES (1), (3);" ,
506+ "INSERT INTO child1 VALUES (10, 1);" ,
507+ "INSERT INTO child2 VALUES (20, 1);" ,
508+ },
509+ Assertions : []ScriptTestAssertion {
510+ {
511+ Query : `UPDATE child1 c1
512+ JOIN child2 c2 ON c1.id = 10 AND c2.id = 20
513+ SET c1.p1_id = 999, c2.p2_id = 3;` ,
514+ ExpectedErr : sql .ErrForeignKeyChildViolation ,
515+ },
516+ {
517+ Query : `UPDATE child1 c1
518+ JOIN child2 c2 ON c1.id = 10 AND c2.id = 20
519+ SET c1.p1_id = 3, c2.p2_id = 999;` ,
520+ ExpectedErr : sql .ErrForeignKeyChildViolation ,
521+ },
522+ {
523+ Query : "SELECT * FROM child1;" ,
524+ Expected : []sql.Row {{10 , 1 }},
525+ },
526+ {
527+ Query : "SELECT * FROM child2;" ,
528+ Expected : []sql.Row {{20 , 1 }},
529+ },
530+ },
531+ },
532+ {
533+ Dialect : "mysql" ,
534+ Name : "UPDATE join – multiple tables, with trigger" ,
535+ SetUpScript : []string {
536+ "CREATE TABLE a (id INT PRIMARY KEY, x INT);" ,
537+ "CREATE TABLE b (id INT PRIMARY KEY, y INT);" ,
538+ "CREATE TABLE logbook (entry TEXT);" ,
539+ `CREATE TRIGGER trig_a AFTER UPDATE ON a FOR EACH ROW
540+ BEGIN
541+ INSERT INTO logbook VALUES ('a updated');
542+ END;` ,
543+ `CREATE TRIGGER trig_b AFTER UPDATE ON b FOR EACH ROW
544+ BEGIN
545+ INSERT INTO logbook VALUES ('b updated');
546+ END;` ,
547+ "INSERT INTO a VALUES (5, 100);" ,
548+ "INSERT INTO b VALUES (6, 200);" ,
549+ },
550+ Assertions : []ScriptTestAssertion {
551+ {
552+ Query : `UPDATE a
553+ JOIN b ON a.id = 5 AND b.id = 6
554+ SET a.x = 101, b.y = 201;` ,
555+ },
556+ {
557+ // TODO: UPDATE ... JOIN does not properly apply triggers when multiple tables are being updated,
558+ // and will currently only apply triggers from one of the tables.
559+ Skip : true ,
560+ Query : "SELECT * FROM logbook ORDER BY entry;" ,
561+ Expected : []sql.Row {
562+ {"a updated" },
563+ {"b updated" },
564+ },
565+ },
566+ },
567+ },
568+ }
569+
473570var SpatialUpdateTests = []WriteQueryTest {
474571 {
475572 WriteQuery : "UPDATE point_table SET p = point(123.456,789);" ,
0 commit comments