modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/session/sessionC.test (about)

     1  # 2014 August 16
     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  
    14  if {![info exists testdir]} {
    15    set testdir [file join [file dirname [info script]] .. .. test]
    16  } 
    17  source [file join [file dirname [info script]] session_common.tcl]
    18  source $testdir/tester.tcl
    19  ifcapable !session {finish_test; return}
    20  
    21  set testprefix sessionC
    22  
    23  #-------------------------------------------------------------------------
    24  # Test the outcome of a DELETE operation made as part of applying a
    25  # changeset failing with SQLITE_CONSTRAINT. This may happen if an
    26  # ON DELETE RESTRICT foreign key action is triggered, or if a trigger
    27  # program raises a constraint somehow.
    28  #
    29  # UPDATE: The above is no longer true, as "PRAGMA defer_foreign_keys"
    30  # now disables "RESTRICT" processing. The test below has been rewritten 
    31  # to use a trigger instead of a foreign key to test this case.
    32  #
    33  do_execsql_test 1.0 {
    34    PRAGMA foreign_keys = 1;
    35  
    36    CREATE TABLE p(a PRIMARY KEY, b, c);
    37    CREATE TABLE c(d PRIMARY KEY, e /* REFERENCES p ON DELETE RESTRICT */);
    38  
    39    CREATE TRIGGER restrict_trig BEFORE DELETE ON p BEGIN
    40      SELECT raise(ABORT, 'error!') FROM c WHERE e=old.a;
    41    END;
    42  
    43    INSERT INTO p VALUES('one', 1, 1);
    44    INSERT INTO p VALUES('two', 2, 2);
    45    INSERT INTO p VALUES('three', 3, 3);
    46  
    47    INSERT INTO c VALUES(1, 'one');
    48    INSERT INTO c VALUES(3, 'three');
    49  }
    50  
    51  do_test 1.1 {
    52    execsql BEGIN
    53    set C [changeset_from_sql {
    54      INSERT INTO c VALUES(4, 'one');
    55      DELETE FROM p WHERE a='two';
    56    }]
    57    execsql ROLLBACK
    58    execsql {
    59      INSERT INTO c VALUES(2, 'two');
    60    }
    61  } {}
    62  
    63  do_test 1.2.1 {
    64    proc xConflict {args} { return "ABORT" }
    65    catch { sqlite3changeset_apply db $C xConflict } msg
    66    set msg
    67  } {SQLITE_ABORT}
    68  do_execsql_test 1.2.2 { SELECT * FROM c } {1 one 3 three 2 two}
    69  
    70  do_test 1.3.1 {
    71    proc xConflict {args} { return "OMIT" }
    72    catch { sqlite3changeset_apply db $C xConflict } msg
    73    set msg
    74  } {}
    75  do_execsql_test 1.3.2 { SELECT * FROM c } {1 one 3 three 2 two 4 one}
    76  do_execsql_test 1.3.3 { 
    77    SELECT * FROM p;
    78  } {one 1 1 two 2 2 three 3 3}
    79  
    80  
    81  #-------------------------------------------------------------------------
    82  # Test that concatenating a changeset with a patchset does not work.
    83  # Any attempt to do so returns SQLITE_ERROR.
    84  #
    85  reset_db
    86  do_execsql_test 2.0 {
    87    CREATE TABLE x1(t, v PRIMARY KEY);
    88    INSERT INTO x1 VALUES(12, 55);
    89    INSERT INTO x1 VALUES(55, 14);
    90  }
    91  
    92  do_test 2.1 {
    93    execsql BEGIN
    94  
    95    sqlite3session S1 db main
    96    S1 attach *
    97    execsql {
    98      UPDATE x1 SET t=13 WHERE v=55;
    99      INSERT INTO x1 VALUES(99, 123);
   100    }
   101    set patchset [S1 patchset]
   102    S1 delete
   103  
   104    sqlite3session S1 db main
   105    S1 attach *
   106    execsql {
   107      UPDATE x1 SET t=56 WHERE v=14;
   108      INSERT INTO x1 VALUES(22, 998);
   109    }
   110    set changeset [S1 changeset]
   111    S1 delete
   112  
   113    execsql ROLLBACK
   114  } {}
   115  
   116  do_test 2.2 {
   117    set rc [catch { sqlite3changeset_concat $patchset $changeset } msg]
   118    list $rc $msg
   119  } {1 SQLITE_ERROR}
   120  
   121  do_test 2.3 {
   122    set rc [catch { sqlite3changeset_concat $changeset $patchset } msg]
   123    list $rc $msg
   124  } {1 SQLITE_ERROR}
   125  
   126  do_test 2.4 {
   127    set rc [catch { sqlite3changeset_concat {} $patchset } msg]
   128    list $rc $msg
   129  } [list 0 $patchset]
   130  
   131  do_test 2.5 {
   132    set rc [catch { sqlite3changeset_concat $patchset {} } msg]
   133    list $rc $msg
   134  } [list 0 $patchset]
   135  
   136  do_test 2.6 {
   137    set rc [catch { sqlite3changeset_concat {} $changeset } msg]
   138    list $rc $msg
   139  } [list 0 $changeset]
   140  
   141  do_test 2.7 {
   142    set rc [catch { sqlite3changeset_concat $changeset {} } msg]
   143    list $rc $msg
   144  } [list 0 $changeset]
   145  
   146  do_test 2.8 {
   147    set rc [catch { sqlite3changeset_concat {} {} } msg]
   148    list $rc $msg
   149  } [list 0 {}]
   150  
   151  
   152  #-------------------------------------------------------------------------
   153  # Test that the xFilter argument to sqlite3changeset_apply() works.
   154  #
   155  reset_db
   156  do_execsql_test 3.0 {
   157    CREATE TABLE t1(a PRIMARY KEY, b);
   158    CREATE TABLE t2(a PRIMARY KEY, b);
   159    CREATE TABLE t3(a PRIMARY KEY, b);
   160  }
   161  do_test 3.1 {
   162    execsql BEGIN
   163    set changeset [changeset_from_sql {
   164      INSERT INTO t1 VALUES(1, 1);
   165      INSERT INTO t2 VALUES(2, 2);
   166      INSERT INTO t3 VALUES(3, 3);
   167    }]
   168    execsql ROLLBACK
   169  } {}
   170  do_test 3.2 {
   171    proc xFilter {zName} {
   172      if {$zName == "t1"} { return 1 }
   173      return 0
   174    }
   175    sqlite3changeset_apply db $changeset noop xFilter
   176    execsql {
   177      SELECT * FROM t1;
   178      SELECT * FROM t2;
   179      SELECT * FROM t3;
   180    }
   181  } {1 1}
   182  do_test 3.3 {
   183    proc xFilter {zName} {
   184      if {$zName == "t3"} { return 1 }
   185      return 0
   186    }
   187    sqlite3changeset_apply db $changeset noop xFilter
   188    execsql {
   189      SELECT * FROM t1;
   190      SELECT * FROM t2;
   191      SELECT * FROM t3;
   192    }
   193  } {1 1 3 3}
   194  
   195  
   196  
   197  finish_test
   198