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

     1  # 2014-12-19
     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.
    12  #
    13  # This file implements tests for PRAGMA data_version command.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  do_not_use_codec
    19  
    20  do_execsql_test pragma3-100 {
    21    PRAGMA data_version;
    22  } {1}
    23  do_execsql_test pragma3-101 {
    24    PRAGMA temp.data_version;
    25  } {1}
    26  
    27  # Writing to the pragma is a no-op 
    28  do_execsql_test pragma3-102 {
    29    PRAGMA main.data_version=1234;
    30    PRAGMA main.data_version;
    31  } {1 1}
    32  
    33  # EVIDENCE-OF: R-27726-60934 The "PRAGMA data_version" command provides
    34  # an indication that the database file has been modified.
    35  #
    36  # EVIDENCE-OF: R-47505-58569 The "PRAGMA data_version" value is
    37  # unchanged for commits made on the same database connection.
    38  #
    39  do_execsql_test pragma3-110 {
    40    PRAGMA data_version;
    41    BEGIN IMMEDIATE;
    42    PRAGMA data_version;
    43    CREATE TABLE t1(a);
    44    INSERT INTO t1 VALUES(100),(200),(300);
    45    PRAGMA data_version;
    46    COMMIT;
    47    SELECT * FROM t1;
    48    PRAGMA data_version;
    49  } {1 1 1 100 200 300 1}
    50  
    51  sqlite3 db2 test.db
    52  do_test pragma3-120 {
    53    db2 eval {
    54      SELECT * FROM t1;
    55      PRAGMA data_version;
    56    }
    57  } {100 200 300 1}
    58  
    59  do_execsql_test pragma3-130 {
    60    PRAGMA data_version;
    61    BEGIN IMMEDIATE;
    62    PRAGMA data_version;
    63    INSERT INTO t1 VALUES(400),(500);
    64    PRAGMA data_version;
    65    COMMIT;
    66    SELECT * FROM t1;
    67    PRAGMA data_version;
    68    PRAGMA shrink_memory;
    69  } {1 1 1 100 200 300 400 500 1}
    70  
    71  # EVIDENCE-OF: R-63005-41812 The integer values returned by two
    72  # invocations of "PRAGMA data_version" from the same connection will be
    73  # different if changes were committed to the database by any other
    74  # connection in the interim.
    75  #
    76  # Value went from 1 in pragma3-120 to 2 here.
    77  #
    78  do_test pragma3-140 {
    79    db2 eval {
    80      SELECT * FROM t1;
    81      PRAGMA data_version;
    82      BEGIN IMMEDIATE;
    83      PRAGMA data_version;
    84      UPDATE t1 SET a=a+1;
    85      COMMIT;
    86      SELECT * FROM t1;
    87      PRAGMA data_version;
    88    }
    89  } {100 200 300 400 500 2 2 101 201 301 401 501 2}
    90  do_execsql_test pragma3-150 {
    91    SELECT * FROM t1;
    92    PRAGMA data_version;
    93  } {101 201 301 401 501 2}
    94  
    95  #
    96  do_test pragma3-160 {
    97    db eval {
    98      BEGIN;
    99      PRAGMA data_version;
   100      UPDATE t1 SET a=555 WHERE a=501;
   101      PRAGMA data_version;
   102      SELECT * FROM t1 ORDER BY a;
   103      PRAGMA data_version;
   104    }
   105  } {2 2 101 201 301 401 555 2}
   106  do_test pragma3-170 {
   107    db2 eval {
   108      PRAGMA data_version;
   109    }
   110  } {2}
   111  do_test pragma3-180 {
   112    db eval {
   113      COMMIT;
   114      PRAGMA data_version;
   115    }
   116  } {2}
   117  do_test pragma3-190 {
   118    db2 eval {
   119      PRAGMA data_version;
   120    }
   121  } {3}
   122  
   123  # EVIDENCE-OF: R-19326-44825 The "PRAGMA data_version" value is a local
   124  # property of each database connection and so values returned by two
   125  # concurrent invocations of "PRAGMA data_version" on separate database
   126  # connections are often different even though the underlying database is
   127  # identical.
   128  #
   129  do_test pragma3-195 {
   130    expr {[db eval {PRAGMA data_version}]!=[db2 eval {PRAGMA data_version}]}
   131  } {1}
   132  
   133  # EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
   134  # the same for all database connections, including database connections
   135  # in separate processes and shared cache database connections.
   136  #
   137  # The next block checks the behavior for separate processes.
   138  #
   139  do_test pragma3-200 {
   140    db eval {PRAGMA data_version; SELECT * FROM t1;}
   141  } {2 101 201 301 401 555}
   142  do_test pragma3-201 {
   143    set fd [open pragma3.txt wb]
   144    puts $fd {
   145       sqlite3 db test.db;
   146       db eval {DELETE FROM t1 WHERE a>300};
   147       db close;
   148       exit;
   149    }
   150    close $fd
   151    exec [info nameofexec] pragma3.txt
   152    forcedelete pragma3.txt
   153    db eval {
   154      PRAGMA data_version;
   155      SELECT * FROM t1;
   156    }
   157  } {3 101 201}
   158  db2 close
   159  db close
   160  
   161  # EVIDENCE-OF: R-54562-06892 The behavior of "PRAGMA data_version" is
   162  # the same for all database connections, including database connections
   163  # in separate processes and shared cache database connections.
   164  #
   165  # The next block checks that behavior is the same for shared-cache.
   166  #
   167  ifcapable shared_cache {
   168    set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
   169    sqlite3 db test.db
   170    sqlite3 db2 test.db
   171    do_test pragma3-300 {
   172      db eval {
   173        PRAGMA data_version;
   174        BEGIN;
   175        CREATE TABLE t3(a,b,c);
   176        CREATE TABLE t4(x,y,z);
   177        INSERT INTO t4 VALUES(123,456,789);
   178        PRAGMA data_version;
   179        COMMIT;
   180        PRAGMA data_version;
   181      }
   182    } {1 1 1}
   183    do_test pragma3-310 {
   184      db2 eval {
   185        PRAGMA data_version;
   186        BEGIN;
   187        INSERT INTO t3(a,b,c) VALUES('abc','def','ghi');
   188        SELECT * FROM t3;
   189        PRAGMA data_version;
   190      }
   191    } {2 abc def ghi 2}
   192    # The transaction in db2 has not yet committed, so the data_version in
   193    # db is unchanged.
   194    do_test pragma3-320 {
   195      db eval {
   196        PRAGMA data_version;
   197        SELECT * FROM t4;
   198      }
   199    } {1 123 456 789}
   200    do_test pragma3-330 {
   201      db2 eval {
   202        COMMIT;
   203        PRAGMA data_version;
   204        SELECT * FROM t4;
   205      }
   206    } {2 123 456 789}
   207    do_test pragma3-340 {
   208      db eval {
   209        PRAGMA data_version;
   210        SELECT * FROM t3;
   211        SELECT * FROM t4;
   212      }
   213    } {2 abc def ghi 123 456 789}
   214    db2 close
   215    db close
   216    sqlite3_enable_shared_cache $::enable_shared_cache
   217  }
   218  
   219  # Make sure this also works in WAL mode
   220  #
   221  # This will not work with the in-memory journal permutation, as opening
   222  # [db2] switches the journal mode back to "memory"
   223  #
   224  if {[wal_is_capable]} {
   225  if {[permutation]!="inmemory_journal"} {
   226  
   227    sqlite3 db test.db
   228    db eval {PRAGMA journal_mode=WAL}
   229    sqlite3 db2 test.db
   230    do_test pragma3-400 {
   231      db eval {
   232        PRAGMA data_version;
   233        PRAGMA journal_mode;
   234        SELECT * FROM t1;
   235      }
   236    } {2 wal 101 201}
   237    do_test pragma3-410 {
   238      db2 eval {
   239        PRAGMA data_version;
   240        PRAGMA journal_mode;
   241        SELECT * FROM t1;
   242      }
   243    } {2 wal 101 201}
   244    do_test pragma3-420 {
   245      db eval {UPDATE t1 SET a=111*(a/100); PRAGMA data_version; SELECT * FROM t1}
   246    } {2 111 222}
   247    do_test pragma3-430 {
   248      db2 eval {PRAGMA data_version; SELECT * FROM t1;}
   249    } {3 111 222}
   250    db2 close
   251  }
   252  }
   253  
   254  finish_test