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

     1  # 2018-04-12
     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  # Test cases for UPSERT
    13  
    14  set testdir [file dirname $argv0]
    15  source $testdir/tester.tcl
    16  set testprefix zipfile
    17  
    18  do_execsql_test upsert1-100 {
    19    CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c DEFAULT 0);
    20    CREATE UNIQUE INDEX t1x1 ON t1(b);
    21    INSERT INTO t1(a,b) VALUES(1,2) ON CONFLICT DO NOTHING;
    22    INSERT INTO t1(a,b) VALUES(1,99),(99,2) ON CONFLICT DO NOTHING;
    23    SELECT * FROM t1;
    24  } {1 2 0}
    25  do_execsql_test upsert1-101 {
    26    DELETE FROM t1;
    27    INSERT INTO t1(a,b) VALUES(2,3) ON CONFLICT(a) DO NOTHING;
    28    INSERT INTO t1(a,b) VALUES(2,99) ON CONFLICT(a) DO NOTHING;
    29    SELECT * FROM t1;
    30  } {2 3 0}
    31  do_execsql_test upsert1-102 {
    32    DELETE FROM t1;
    33    INSERT INTO t1(a,b) VALUES(3,4) ON CONFLICT(b) DO NOTHING;
    34    INSERT INTO t1(a,b) VALUES(99,4) ON CONFLICT(b) DO NOTHING;
    35    SELECT * FROM t1;
    36  } {3 4 0}
    37  do_catchsql_test upsert1-110 {
    38    INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(x) DO NOTHING;
    39    SELECT * FROM t1;
    40  } {1 {no such column: x}}
    41  do_catchsql_test upsert1-120 {
    42    INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(c) DO NOTHING;
    43    SELECT * FROM t1;
    44  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
    45  breakpoint
    46  do_catchsql_test upsert1-130 {
    47    INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b COLLATE nocase) DO NOTHING;
    48    SELECT * FROM t1;
    49  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
    50  do_execsql_test upsert1-140 {
    51    DELETE FROM t1;
    52    INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b COLLATE binary) DO NOTHING;
    53    SELECT * FROM t1;
    54  } {5 6 0}
    55  
    56  do_catchsql_test upsert1-200 {
    57    DROP TABLE t1;
    58    CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c DEFAULT 0);
    59    CREATE UNIQUE INDEX t1x1 ON t1(a+b);
    60    INSERT INTO t1(a,b) VALUES(7,8) ON CONFLICT(a+b) DO NOTHING;
    61    INSERT INTO t1(a,b) VALUES(8,7),(9,6) ON CONFLICT(a+b) DO NOTHING;
    62    SELECT * FROM t1;
    63  } {0 {7 8 0}}
    64  do_catchsql_test upsert1-201 {
    65    INSERT INTO t1(a,b) VALUES(8,7),(9,6) ON CONFLICT(a) DO NOTHING;
    66  } {1 {UNIQUE constraint failed: index 't1x1'}}
    67  do_catchsql_test upsert1-210 {
    68    DELETE FROM t1;
    69    INSERT INTO t1(a,b) VALUES(9,10) ON CONFLICT(a+(+b)) DO NOTHING;
    70    SELECT * FROM t1;
    71  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
    72  
    73  do_catchsql_test upsert1-300 {
    74    DROP INDEX t1x1;
    75    DELETE FROM t1;
    76    CREATE UNIQUE INDEX t1x1 ON t1(b) WHERE b>10;
    77    INSERT INTO t1(a,b) VALUES(1,2),(3,2) ON CONFLICT(b) DO NOTHING;
    78    SELECT * FROM t1;
    79  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
    80  do_catchsql_test upsert1-310 {
    81    DELETE FROM t1;
    82    INSERT INTO t1(a,b) VALUES(1,2),(3,2) ON CONFLICT(b) WHERE b!=10 DO NOTHING;
    83    SELECT * FROM t1;
    84  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
    85  do_execsql_test upsert1-320 {
    86    DELETE FROM t1;
    87    INSERT INTO t1(a,b) VALUES(1,2),(3,2),(4,20),(5,20)
    88           ON CONFLICT(b) WHERE b>10 DO NOTHING;
    89    SELECT *, 'x' FROM t1 ORDER BY b, a;
    90  } {1 2 0 x 3 2 0 x 4 20 0 x}
    91  
    92  # Upsert works with count_changes=on;
    93  do_execsql_test upsert1-400 {
    94    DROP TABLE IF EXISTS t2;
    95    CREATE TABLE t2(a TEXT UNIQUE, b INT DEFAULT 1);
    96    INSERT INTO t2(a) VALUES('one'),('two'),('three');
    97    PRAGMA count_changes=ON;
    98    INSERT INTO t2(a) VALUES('one'),('one'),('three'),('four')
    99        ON CONFLICT(a) DO UPDATE SET b=b+1;
   100  } {1}
   101  do_execsql_test upsert1-410 {
   102    PRAGMA count_changes=OFF;
   103    SELECT a, b FROM t2 ORDER BY a;
   104  } {four 1 one 3 three 2 two 1}
   105  
   106  # Problem found by AFL prior to any release
   107  do_execsql_test upsert1-500 {
   108    DROP TABLE t1;
   109    CREATE TABLE t1(x INTEGER PRIMARY KEY, y INT UNIQUE);
   110    INSERT INTO t1(x,y) SELECT 1,2 WHERE true
   111      ON CONFLICT(x) DO UPDATE SET y=max(t1.y,excluded.y) AND true;
   112    SELECT * FROM t1;
   113  } {1 2}
   114  
   115  # 2018-07-11
   116  # Ticket https://sqlite.org/src/tktview/79cad5e4b2e219dd197242e9e5f4
   117  # UPSERT leads to a corrupt index.
   118  #
   119  do_execsql_test upsert1-600 {
   120    DROP TABLE t1;
   121    CREATE TABLE t1(b UNIQUE, a INT PRIMARY KEY) WITHOUT ROWID;
   122    INSERT OR IGNORE INTO t1(a) VALUES('1') ON CONFLICT(a) DO NOTHING;
   123    PRAGMA integrity_check;
   124  } {ok}
   125  do_execsql_test upsert1-610 {
   126    DELETE FROM t1;
   127    INSERT OR IGNORE INTO t1(a) VALUES('1'),(1) ON CONFLICT(a) DO NOTHING;
   128    PRAGMA integrity_check;
   129  } {ok}
   130  
   131  # 2018-08-14
   132  # Ticket https://www.sqlite.org/src/info/908f001483982c43
   133  # If there are multiple uniqueness contraints, the UPSERT should fire
   134  # if the one constraint it targets fails, regardless of whether or not
   135  # the other constraints pass or fail.  In other words, the UPSERT constraint
   136  # should be tested first.
   137  #
   138  do_execsql_test upsert1-700 {
   139    DROP TABLE t1;
   140    CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT, d INT, e INT);
   141    CREATE UNIQUE INDEX t1b ON t1(b);
   142    CREATE UNIQUE INDEX t1e ON t1(e);
   143    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   144    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   145      ON CONFLICT(e) DO UPDATE SET c=excluded.c;
   146    SELECT * FROM t1;
   147  } {1 2 33 4 5}
   148  do_execsql_test upsert1-710 {
   149    DELETE FROM t1;
   150    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   151    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   152      ON CONFLICT(a) DO UPDATE SET c=excluded.c;
   153    SELECT * FROM t1;
   154  } {1 2 33 4 5}
   155  do_execsql_test upsert1-720 {
   156    DELETE FROM t1;
   157    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   158    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   159      ON CONFLICT(b) DO UPDATE SET c=excluded.c;
   160    SELECT * FROM t1;
   161  } {1 2 33 4 5}
   162  do_execsql_test upsert1-730 {
   163    DROP TABLE t1;
   164    CREATE TABLE t1(a INT, b INT, c INT, d INT, e INT);
   165    CREATE UNIQUE INDEX t1a ON t1(a);
   166    CREATE UNIQUE INDEX t1b ON t1(b);
   167    CREATE UNIQUE INDEX t1e ON t1(e);
   168    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   169    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   170      ON CONFLICT(e) DO UPDATE SET c=excluded.c;
   171    SELECT * FROM t1;
   172  } {1 2 33 4 5}
   173  do_execsql_test upsert1-740 {
   174    DELETE FROM t1;
   175    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   176    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   177      ON CONFLICT(a) DO UPDATE SET c=excluded.c;
   178    SELECT * FROM t1;
   179  } {1 2 33 4 5}
   180  do_execsql_test upsert1-750 {
   181    DELETE FROM t1;
   182    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   183    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   184      ON CONFLICT(b) DO UPDATE SET c=excluded.c;
   185    SELECT * FROM t1;
   186  } {1 2 33 4 5}
   187  do_execsql_test upsert1-760 {
   188    DROP TABLE t1;
   189    CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT, d INT, e INT) WITHOUT ROWID;
   190    CREATE UNIQUE INDEX t1a ON t1(a);
   191    CREATE UNIQUE INDEX t1b ON t1(b);
   192    CREATE UNIQUE INDEX t1e ON t1(e);
   193    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   194    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   195      ON CONFLICT(e) DO UPDATE SET c=excluded.c;
   196    SELECT * FROM t1;
   197  } {1 2 33 4 5}
   198  do_execsql_test upsert1-770 {
   199    DELETE FROM t1;
   200    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   201    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   202      ON CONFLICT(a) DO UPDATE SET c=excluded.c;
   203    SELECT * FROM t1;
   204  } {1 2 33 4 5}
   205  do_execsql_test upsert1-780 {
   206    DELETE FROM t1;
   207    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,3,4,5);
   208    INSERT INTO t1(a,b,c,d,e) VALUES(1,2,33,44,5)
   209      ON CONFLICT(b) DO UPDATE SET c=excluded.c;
   210    SELECT * FROM t1;
   211  } {1 2 33 4 5}
   212  
   213  # 2019-08-30 ticket https://sqlite.org/src/info/5a3dba8104421320
   214  do_execsql_test upsert1-800 {
   215    DROP TABLE IF EXISTS t0;
   216    CREATE TABLE t0(c0 REAL UNIQUE, c1);
   217    CREATE UNIQUE INDEX test800i0 ON t0(0 || c1);
   218    INSERT INTO t0(c0, c1) VALUES (1, 2),  (2, 1);
   219    INSERT INTO t0(c0) VALUES (1) ON CONFLICT(c0) DO UPDATE SET c1=excluded.c0;
   220    PRAGMA integrity_check;
   221    REINDEX;
   222  } {ok}
   223  
   224  # 2019-12-06 gramfuzz find
   225  sqlite3 db :memory:
   226  do_execsql_test upsert1-900 {
   227    CREATE VIEW t1(a) AS SELECT 1;
   228    CREATE TRIGGER t1r1 INSTEAD OF INSERT ON t1 BEGIN
   229       SELECT 2;
   230    END;
   231  }
   232  do_catchsql_test upsert1-910 {
   233    INSERT INTO t1 VALUES(3) ON CONFLICT(x) DO NOTHING;
   234  } {1 {cannot UPSERT a view}}
   235  
   236  # 2019-12-26 ticket 7c13db5c3bf74001
   237  reset_db
   238  do_catchsql_test upsert1-1000 {
   239    CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 UNIQUE) WITHOUT ROWID;
   240    INSERT OR FAIL INTO t0(c2) VALUES (0), (NULL)
   241      ON CONFLICT(c2) DO UPDATE SET c1 = c0;
   242  } {1 {NOT NULL constraint failed: t0.c0}}
   243  
   244  finish_test