github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/upfrom3.test (about)

     1  # 2020 July 14
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  set testprefix upfrom3
    16  
    17  # Test plan:
    18  #
    19  #   1.*: Test UPDATE ... FROM statements that modify IPK fields. And that
    20  #        modify "INTEGER PRIMARY KEY" fields on WITHOUT ROWID tables.
    21  #
    22  #   2.*: Test UPDATE ... FROM statements that modify PK fields of WITHOUT
    23  #        ROWID tables.
    24  #
    25  #   3.*: Test that UPDATE ... FROM statements are not confused if there
    26  #        are multiple tables of the same name in attached databases.
    27  #
    28  #   4.*: Tests for UPDATE ... FROM statements and foreign keys.
    29  #
    30  
    31  foreach {tn wo} {
    32    1 ""
    33    2 "WITHOUT ROWID"
    34  } {
    35    reset_db
    36    eval [string map [list %WO% $wo %TN% $tn] {
    37  
    38    do_execsql_test 1.%TN%.0 {
    39      CREATE TABLE log(t TEXT);
    40      CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z UNIQUE) %WO%;
    41      CREATE INDEX t1y ON t1(y);
    42  
    43      INSERT INTO t1 VALUES(1, 'i',   'one');
    44      INSERT INTO t1 VALUES(2, 'ii',  'two');
    45      INSERT INTO t1 VALUES(3, 'iii', 'three');
    46      INSERT INTO t1 VALUES(4, 'iv',  'four');
    47    }
    48  
    49    do_execsql_test 1.%TN%.1 {
    50      CREATE TABLE x1(o, n);
    51      INSERT INTO x1 VALUES(1, 11);
    52      INSERT INTO x1 VALUES(2, 12);
    53      INSERT INTO x1 VALUES(3, 13);
    54      INSERT INTO x1 VALUES(4, 14);
    55      UPDATE t1 SET x=n FROM x1 WHERE x=o;
    56      SELECT x, y, z FROM t1 ORDER BY 1;
    57    } {
    58      11 i one
    59      12 ii two
    60      13 iii three
    61      14 iv four
    62    }
    63  
    64    do_test 1.%TN%.2 { db changes } 4
    65  
    66    do_execsql_test 1.%TN%.3 {
    67      INSERT INTO x1 VALUES(11, 21);
    68      INSERT INTO x1 VALUES(12, 22);
    69      INSERT INTO x1 VALUES(13, 23);
    70      INSERT INTO x1 VALUES(14, 24);
    71  
    72      INSERT INTO x1 VALUES(21, 31);
    73      INSERT INTO x1 VALUES(22, 32);
    74      INSERT INTO x1 VALUES(23, 33);
    75      INSERT INTO x1 VALUES(24, 34);
    76      UPDATE t1 SET x=n FROM x1 WHERE x=o;
    77      SELECT x, y, z FROM t1 ORDER BY 1;
    78    } {
    79      21 i one
    80      22 ii two
    81      23 iii three
    82      24 iv four
    83    }
    84  
    85    do_execsql_test 1.%TN%.4 {
    86      UPDATE t1 SET x=n FROM x1 WHERE x=o;
    87      SELECT x, y, z FROM t1 ORDER BY 1;
    88    } {
    89      31 i one
    90      32 ii two
    91      33 iii three
    92      34 iv four
    93    }
    94  
    95    do_execsql_test 1.%TN%.5 {
    96      INSERT INTO x1 VALUES(31, 32);
    97      INSERT INTO x1 VALUES(33, 34);
    98      UPDATE OR REPLACE t1 SET x=n FROM x1 WHERE x=o;
    99      SELECT x, y, z FROM t1 ORDER BY 1;
   100    } {
   101      32 i one
   102      34 iii three
   103    }
   104  
   105    do_execsql_test 1.%TN%.6 {
   106      INSERT INTO t1 VALUES(33, 'ii', 'two');
   107      INSERT INTO t1 VALUES(35, 'iv', 'four');
   108    }
   109  
   110    do_execsql_test 1.%TN%.7 {
   111      CREATE TABLE x2(o, n, zz);
   112      INSERT INTO x2 VALUES(32, 41, 'four');
   113      INSERT INTO x2 VALUES(33, 42, 'three');
   114      UPDATE OR IGNORE t1 SET x=n, z=zz FROM x2 WHERE x=o;
   115      SELECT x, y, z FROM t1 ORDER BY 1;
   116    } {
   117      32 i one 
   118      33 ii two 
   119      34 iii three 
   120      35 iv four
   121    }
   122  
   123    do_execsql_test 1.%TN%.8 {
   124      UPDATE OR REPLACE t1 SET x=n, z=zz FROM x2 WHERE x=o;
   125      SELECT x, y, z FROM t1 ORDER BY 1;
   126    } {
   127      41 i four
   128      42 ii three
   129    }
   130  
   131    }]
   132  }
   133  
   134  do_execsql_test 2.1.1 {
   135    CREATE TABLE u1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID;
   136    INSERT INTO u1 VALUES(0, 0, 0);
   137    INSERT INTO u1 VALUES(1, 0, 1);
   138    INSERT INTO u1 VALUES(2, 1, 0);
   139    INSERT INTO u1 VALUES(3, 1, 1);
   140  }
   141  
   142  do_execsql_test 2.1.2 {
   143    CREATE TABLE map(f, t);
   144    INSERT INTO map VALUES(0, 10);
   145    INSERT INTO map VALUES(1, 11);
   146    UPDATE u1 SET c=t FROM map WHERE c=f;
   147    SELECT * FROM u1 ORDER BY a;
   148  } {
   149    0 0 10
   150    1 0 11
   151    2 1 10
   152    3 1 11
   153  }
   154  
   155  do_execsql_test 2.1.3 {
   156    UPDATE u1 SET b=t FROM map WHERE b=f;
   157    SELECT * FROM u1 ORDER BY a;
   158  } {
   159    0 10 10
   160    1 10 11
   161    2 11 10
   162    3 11 11
   163  }
   164  
   165  do_execsql_test 2.1.4 {
   166    CREATE TABLE map2(o1, o2, n1, n2);
   167    INSERT INTO map2 VALUES
   168      (10, 10, 50, 50), (10, 11, 50, 60), 
   169      (11, 10, 60, 50), (11, 11, 60, 60);
   170    UPDATE u1 SET b=n1, c=n2 FROM map2 WHERE b=o1 AND c=o2;
   171    SELECT * FROM u1 ORDER BY a;
   172  } {
   173    0 50 50
   174    1 50 60
   175    2 60 50
   176    3 60 60
   177  }
   178  
   179  #-------------------------------------------------------------------------
   180  foreach {tn wo} {
   181    1 ""
   182    2 "WITHOUT ROWID"
   183  } {
   184    reset_db
   185    forcedelete test.db2
   186    eval [string map [list %WO% $wo %TN% $tn] {
   187      do_execsql_test 3.$tn.1 {
   188        CREATE TABLE g1(a, b, c, PRIMARY KEY(a, b)) %WO%;
   189        INSERT INTO g1 VALUES(1, 1, 1);
   190  
   191        ATTACH 'test.db2' AS aux;
   192        CREATE TABLE aux.g1(a, b, c, PRIMARY KEY(a, b)) %WO%;
   193        INSERT INTO aux.g1 VALUES(10, 1, 10);
   194        INSERT INTO aux.g1 VALUES(20, 2, 20);
   195        INSERT INTO aux.g1 VALUES(30, 3, 30);
   196      }
   197  
   198      do_execsql_test 3.$tn.2 {
   199        UPDATE aux.g1 SET c=101 FROM main.g1;
   200      }
   201      do_execsql_test 3.$tn.3 {
   202        SELECT * FROM aux.g1;
   203      } {10 1 101  20 2 101  30 3 101}
   204  
   205      do_execsql_test 3.$tn.4 {
   206        UPDATE g1 SET c=101 FROM g1 AS g2;
   207      }
   208      do_execsql_test 3.$tn.5 {
   209        SELECT * FROM g1;
   210      } {1 1 101}
   211    }]
   212  }
   213  
   214  #-------------------------------------------------------------------------
   215  reset_db
   216  foreach {tn wo} {
   217    1 ""
   218    2 "WITHOUT ROWID"
   219  } {
   220    reset_db
   221    forcedelete test.db2
   222    eval [string map [list %WO% $wo %TN% $tn] {
   223  
   224      do_execsql_test 4.$tn.1 {
   225        CREATE TABLE p1(a INTEGER PRIMARY KEY, b) %WO%;
   226        CREATE TABLE c1(x PRIMARY KEY, y REFERENCES p1 ON UPDATE CASCADE) %WO%;
   227        PRAGMA foreign_keys = 1;
   228  
   229        INSERT INTO p1 VALUES(1, 'one');
   230        INSERT INTO p1 VALUES(11, 'eleven');
   231        INSERT INTO p1 VALUES(111, 'eleventyone');
   232  
   233        INSERT INTO c1 VALUES('a', 1);
   234        INSERT INTO c1 VALUES('b', 11);
   235        INSERT INTO c1 VALUES('c', 111);
   236      }
   237  
   238      do_execsql_test 4.$tn.2 {
   239        CREATE TABLE map(f, t);
   240        INSERT INTO map VALUES('a', 111);
   241        INSERT INTO map VALUES('c', 112);
   242      }
   243  
   244      do_catchsql_test 4.$tn.3 {
   245        UPDATE c1 SET y=t FROM map WHERE x=f;
   246      } {1 {FOREIGN KEY constraint failed}}
   247  
   248      do_execsql_test 4.$tn.4 {
   249        INSERT INTO map VALUES('eleven', 12);
   250        INSERT INTO map VALUES('eleventyone', 112);
   251        UPDATE p1 SET a=t FROM map WHERE b=f;
   252      }
   253  
   254      do_execsql_test 4.$tn.5 {
   255        SELECT * FROM c1
   256      } {a 1  b 12  c 112}
   257  
   258    }]
   259  }
   260  
   261  finish_test