modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/delete4.test (about)

     1  # 2005 August 24
     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  # This file implements regression tests for SQLite library.  The
    12  # focus of this script is a test of the DELETE command.
    13  #
    14  
    15  set testdir [file dirname $argv0]
    16  source $testdir/tester.tcl
    17  set testprefix delete4
    18  
    19  do_execsql_test 1.1 {
    20    CREATE TABLE t1(x INTEGER PRIMARY KEY, y);
    21    INSERT INTO t1 VALUES(1, 0);
    22    INSERT INTO t1 VALUES(2, 1);
    23    INSERT INTO t1 VALUES(3, 0);
    24    INSERT INTO t1 VALUES(4, 1);
    25    INSERT INTO t1 VALUES(5, 0);
    26    INSERT INTO t1 VALUES(6, 1);
    27    INSERT INTO t1 VALUES(7, 0);
    28    INSERT INTO t1 VALUES(8, 1);
    29  }
    30  do_execsql_test 1.2 {
    31    DELETE FROM t1 WHERE y=1;
    32  }
    33  do_execsql_test 1.3 {
    34    SELECT x FROM t1;
    35  } {1 3 5 7}
    36  
    37  #-------------------------------------------------------------------------
    38  #
    39  reset_db
    40  do_execsql_test 2.1 {
    41    CREATE TABLE t1(x INTEGER PRIMARY KEY, y, z);
    42    INSERT INTO t1 VALUES(1, 0, randomblob(200));
    43    INSERT INTO t1 VALUES(2, 1, randomblob(200));
    44    INSERT INTO t1 VALUES(3, 0, randomblob(200));
    45    INSERT INTO t1 VALUES(4, 1, randomblob(200));
    46    INSERT INTO t1 VALUES(5, 0, randomblob(200));
    47    INSERT INTO t1 VALUES(6, 1, randomblob(200));
    48    INSERT INTO t1 VALUES(7, 0, randomblob(200));
    49    INSERT INTO t1 VALUES(8, 1, randomblob(200));
    50  }
    51  do_execsql_test 2.2 {
    52    DELETE FROM t1 WHERE y=1;
    53  }
    54  do_execsql_test 2.3 {
    55    SELECT x FROM t1;
    56  } {1 3 5 7}
    57  
    58  
    59  #-------------------------------------------------------------------------
    60  #
    61  reset_db
    62  do_execsql_test 3.1 {
    63    CREATE TABLE t1(a, b, PRIMARY KEY(a, b)) WITHOUT ROWID;
    64    INSERT INTO t1 VALUES(1, 2);
    65    INSERT INTO t1 VALUES(2, 4);
    66    INSERT INTO t1 VALUES(1, 5);
    67    DELETE FROM t1 WHERE a=1;
    68    SELECT * FROM t1;
    69  } {2 4}
    70  
    71  #-------------------------------------------------------------------------
    72  # DELETE statement that uses the OR optimization
    73  #
    74  reset_db
    75  do_execsql_test 3.1 {
    76    CREATE TABLE t1(i INTEGER PRIMARY KEY, a, b);
    77    CREATE INDEX i1a ON t1(a);
    78    CREATE INDEX i1b ON t1(b);
    79    INSERT INTO t1 VALUES(1, 'one', 'i');
    80    INSERT INTO t1 VALUES(2, 'two', 'ii');
    81    INSERT INTO t1 VALUES(3, 'three', 'iii');
    82    INSERT INTO t1 VALUES(4, 'four', 'iv');
    83    INSERT INTO t1 VALUES(5, 'one', 'i');
    84    INSERT INTO t1 VALUES(6, 'two', 'ii');
    85    INSERT INTO t1 VALUES(7, 'three', 'iii');
    86    INSERT INTO t1 VALUES(8, 'four', 'iv');
    87  } {}
    88  
    89  do_execsql_test 3.2 {
    90    DELETE FROM t1 WHERE a='two' OR b='iv';
    91  }
    92  
    93  do_execsql_test 3.3 {
    94    SELECT i FROM t1 ORDER BY i;
    95  } {1 3 5 7}
    96  
    97  do_execsql_test 3.4 { 
    98    PRAGMA integrity_check; 
    99  } {ok}
   100  
   101  # Between 2015-09-14 and 2015-09-28, the following test cases would result
   102  # in corruption (wrong # of entries in index) due to a bug in the ONEPASS
   103  # optimization.
   104  #
   105  do_execsql_test 4.1 {
   106    DROP TABLE IF EXISTS t4;
   107    CREATE TABLE t4(col0, col1);
   108    INSERT INTO "t4" VALUES(14, 'abcde');
   109    CREATE INDEX idx_t4_0 ON t4 (col1, col0);
   110    CREATE INDEX idx_t4_3 ON t4 (col0);
   111    DELETE FROM t4 WHERE col0=69 OR col0>7;
   112    PRAGMA integrity_check;
   113  } {ok}
   114  do_execsql_test 4.2 {
   115    DROP TABLE IF EXISTS t4;
   116    CREATE TABLE t4(col0, col1);
   117    INSERT INTO "t4" VALUES(14, 'abcde');
   118    CREATE INDEX idx_t4_3 ON t4 (col0);
   119    CREATE INDEX idx_t4_0 ON t4 (col1, col0);
   120    DELETE FROM t4 WHERE col0=69 OR col0>7;
   121    PRAGMA integrity_check;
   122  } {ok}
   123  do_execsql_test 4.11 {
   124    DROP TABLE IF EXISTS t4;
   125    CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID;
   126    INSERT INTO t4 VALUES(14, 'abcde','xyzzy');
   127    CREATE INDEX idx_t4_0 ON t4 (col1, col0);
   128    CREATE INDEX idx_t4_3 ON t4 (col0);
   129    DELETE FROM t4 WHERE col0=69 OR col0>7;
   130    PRAGMA integrity_check;
   131  } {ok}
   132  do_execsql_test 4.12 {
   133    DROP TABLE IF EXISTS t4;
   134    CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID;
   135    INSERT INTO t4 VALUES(14, 'abcde','xyzzy');
   136    CREATE INDEX idx_t4_3 ON t4 (col0);
   137    CREATE INDEX idx_t4_0 ON t4 (col1, col0);
   138    DELETE FROM t4 WHERE col0=69 OR col0>7;
   139    PRAGMA integrity_check;
   140  } {ok}
   141  
   142  # 2016-04-09
   143  # Ticket https://sqlite.org/src/info/a306e56ff68b8fa5
   144  # Failure to completely delete when reverse_unordered_selects is
   145  # engaged.
   146  #
   147  db close
   148  forcedelete test.db
   149  sqlite3 db test.db
   150  do_execsql_test 5.0 {
   151    PRAGMA page_size=1024;
   152    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
   153    CREATE INDEX x1 ON t1(b, c);
   154    INSERT INTO t1(a,b,c) VALUES(1, 1, zeroblob(80));
   155    INSERT INTO t1(a,b,c) SELECT a+1, 1, c FROM t1;
   156    INSERT INTO t1(a,b,c) SELECT a+2, 1, c FROM t1;
   157    INSERT INTO t1(a,b,c) SELECT a+10, 2, c FROM t1 WHERE b=1;
   158    INSERT INTO t1(a,b,c) SELECT a+20, 3, c FROM t1 WHERE b=1;
   159    PRAGMA reverse_unordered_selects = ON;
   160    DELETE FROM t1 WHERE b=2;
   161    SELECT a FROM t1 WHERE b=2;
   162  } {}
   163  
   164  # 2016-05-02
   165  # Ticket https://www.sqlite.org/src/tktview/dc6ebeda93960877
   166  # A subquery in the WHERE clause of a one-pass DELETE can cause an
   167  # incorrect answer.
   168  #
   169  db close
   170  forcedelete test.db
   171  sqlite3 db test.db
   172  do_execsql_test 6.0 {
   173    CREATE TABLE t2(x INT);
   174    INSERT INTO t2(x) VALUES(1),(2),(3),(4),(5);
   175    DELETE FROM t2 WHERE EXISTS(SELECT 1 FROM t2 AS v WHERE v.x=t2.x-1);
   176    SELECT x FROM t2;
   177  } {1}
   178  do_execsql_test 6.1 {
   179    DROP TABLE IF EXISTS t2;
   180    CREATE TABLE t2(x INT);
   181    INSERT INTO t2(x) VALUES(1),(2),(3),(4),(5);
   182    DELETE FROM t2 WHERE EXISTS(SELECT 1 FROM t2 AS v WHERE v.x=t2.x+1);
   183    SELECT x FROM t2;
   184  } {5}
   185  
   186  
   187  finish_test