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

     1  # 2002 March 6
     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 the PRAGMA command.
    14  #
    15  # $Id: pragma2.test,v 1.4 2007/10/09 08:29:33 danielk1977 Exp $
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  # Test organization:
    21  #
    22  # pragma2-1.*: Test freelist_count pragma on the main database.
    23  # pragma2-2.*: Test freelist_count pragma on an attached database.
    24  # pragma2-3.*: Test trying to write to the freelist_count is a no-op.
    25  # pragma2-4.*: Tests for PRAGMA cache_spill
    26  #
    27  
    28  ifcapable !pragma||!schema_pragmas {
    29    finish_test
    30    return
    31  }
    32  
    33  test_set_config_pagecache 0 0
    34  
    35  # Delete the preexisting database to avoid the special setup
    36  # that the "all.test" script does.
    37  #
    38  db close
    39  delete_file test.db test.db-journal
    40  delete_file test3.db test3.db-journal
    41  sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
    42  db eval {PRAGMA auto_vacuum=0}
    43  
    44  
    45  # EVIDENCE-OF: R-11211-21323 PRAGMA schema.freelist_count; Return the
    46  # number of unused pages in the database file.
    47  #
    48  do_test pragma2-1.1 {
    49    execsql {
    50      PRAGMA freelist_count;
    51    }
    52  } {0}
    53  do_test pragma2-1.2 {
    54    execsql {
    55      CREATE TABLE abc(a, b, c);
    56      PRAGMA freelist_count;
    57    }
    58  } {0}
    59  do_test pragma2-1.3 {
    60    execsql {
    61      DROP TABLE abc;
    62      PRAGMA freelist_count;
    63    }
    64  } {1}
    65  do_test pragma2-1.4 {
    66    execsql {
    67      PRAGMA main.freelist_count;
    68    }
    69  } {1}
    70  
    71  forcedelete test2.db
    72  forcedelete test2.db-journal
    73  
    74  ifcapable attach {
    75    do_test pragma2-2.1 {
    76      execsql {
    77        ATTACH 'test2.db' AS aux;
    78        PRAGMA aux.auto_vacuum=OFF;
    79        PRAGMA aux.freelist_count;
    80      }
    81    } {0}
    82    do_test pragma2-2.2 {
    83      execsql {
    84        CREATE TABLE aux.abc(a, b, c);
    85        PRAGMA aux.freelist_count;
    86      }
    87    } {0}
    88    do_test pragma2-2.3 {
    89      set ::val [string repeat 0123456789 1000]
    90      execsql {
    91        INSERT INTO aux.abc VALUES(1, 2, $::val);
    92        PRAGMA aux.freelist_count;
    93      }
    94    } {0}
    95    do_test pragma2-2.4 {
    96      expr {[file size test2.db] / 1024}
    97    } {11}
    98    do_test pragma2-2.5 {
    99      execsql {
   100        DELETE FROM aux.abc;
   101        PRAGMA aux.freelist_count;
   102      }
   103    } {9}
   104    
   105    do_test pragma2-3.1 {
   106      execsql {
   107        PRAGMA aux.freelist_count;
   108        PRAGMA main.freelist_count;
   109        PRAGMA freelist_count;
   110      }
   111    } {9 1 1}
   112    do_test pragma2-3.2 {
   113      execsql {
   114        PRAGMA freelist_count = 500;
   115        PRAGMA freelist_count;
   116      }
   117    } {1 1}
   118    do_test pragma2-3.3 {
   119      execsql {
   120        PRAGMA aux.freelist_count = 500;
   121        PRAGMA aux.freelist_count;
   122      }
   123    } {9 9}
   124  }
   125  
   126  # Default setting of PRAGMA cache_spill is always ON
   127  #
   128  # EVIDENCE-OF: R-63549-59887 PRAGMA cache_spill; PRAGMA
   129  # cache_spill=boolean; PRAGMA schema.cache_spill=N;
   130  #
   131  # EVIDENCE-OF: R-23955-02765 Cache_spill is enabled by default
   132  #
   133  db close
   134  delete_file test.db test.db-journal
   135  delete_file test2.db test2.db-journal
   136  sqlite3 db test.db
   137  do_execsql_test pragma2-4.1 {
   138    PRAGMA main.cache_size=2000;
   139    PRAGMA temp.cache_size=2000;
   140    PRAGMA cache_spill;
   141    PRAGMA main.cache_spill;
   142    PRAGMA temp.cache_spill;
   143  } {2000 2000 2000}
   144  do_execsql_test pragma2-4.2 {
   145    PRAGMA cache_spill=OFF;
   146    PRAGMA cache_spill;
   147    PRAGMA main.cache_spill;
   148    PRAGMA temp.cache_spill;
   149  } {0 0 0}
   150  do_execsql_test pragma2-4.3 {
   151    PRAGMA page_size=1024;
   152    PRAGMA cache_size=50;
   153    BEGIN;
   154    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d);
   155    INSERT INTO t1 VALUES(1, randomblob(400), 1, randomblob(400));
   156    INSERT INTO t1 SELECT a+1, randomblob(400), a+1, randomblob(400) FROM t1;
   157    INSERT INTO t1 SELECT a+2, randomblob(400), a+2, randomblob(400) FROM t1;
   158    INSERT INTO t1 SELECT a+4, randomblob(400), a+4, randomblob(400) FROM t1;
   159    INSERT INTO t1 SELECT a+8, randomblob(400), a+8, randomblob(400) FROM t1;
   160    INSERT INTO t1 SELECT a+16, randomblob(400), a+16, randomblob(400) FROM t1;
   161    INSERT INTO t1 SELECT a+32, randomblob(400), a+32, randomblob(400) FROM t1;
   162    INSERT INTO t1 SELECT a+64, randomblob(400), a+64, randomblob(400) FROM t1;
   163    COMMIT;
   164    ATTACH 'test2.db' AS aux1;
   165    CREATE TABLE aux1.t2(a INTEGER PRIMARY KEY, b, c, d);
   166    INSERT INTO t2 SELECT * FROM t1;
   167    DETACH aux1;
   168    PRAGMA cache_spill=ON;
   169  } {}
   170  sqlite3_release_memory
   171  #
   172  # EVIDENCE-OF: R-07634-40532 The cache_spill pragma enables or disables
   173  # the ability of the pager to spill dirty cache pages to the database
   174  # file in the middle of a transaction.
   175  #
   176  do_test pragma2-4.4 {
   177    db eval {
   178      BEGIN;
   179      UPDATE t1 SET c=c+1;
   180      PRAGMA lock_status;
   181    }
   182  } {main exclusive temp unknown}  ;# EXCLUSIVE lock due to cache spill
   183  do_test pragma2-4.5.1 {
   184    db eval {
   185      ROLLBACK;
   186      PRAGMA cache_spill=OFF;
   187      PRAGMA Cache_Spill;
   188      BEGIN;
   189      UPDATE t1 SET c=c+1;
   190      PRAGMA lock_status;
   191    }
   192  } {0 main reserved temp unknown}   ;# No cache spill, so no exclusive lock
   193  
   194  
   195  # EVIDENCE-OF: R-34657-61226 The "PRAGMA cache_spill=N" form of this
   196  # pragma sets a minimum cache size threshold required for spilling to
   197  # occur.
   198  do_test pragma2-4.5.2 {
   199    db eval {
   200      ROLLBACK;
   201      PRAGMA cache_spill=100000;
   202      PRAGMA cache_spill;
   203      BEGIN;
   204      UPDATE t1 SET c=c+1;
   205      PRAGMA lock_status;
   206    }
   207  } {100000 main reserved temp unknown}   ;# Big spill threshold -> no excl lock
   208  ifcapable !memorymanage {
   209    do_test pragma2-4.5.3 {
   210      db eval {
   211        ROLLBACK;
   212        PRAGMA cache_spill=25;
   213        PRAGMA main.cache_spill;
   214        BEGIN;
   215        UPDATE t1 SET c=c+1;
   216        PRAGMA lock_status;
   217      }
   218    } {50 main exclusive temp unknown}   ;# Small cache spill -> exclusive lock
   219    do_test pragma2-4.5.4 {
   220      db eval {
   221        ROLLBACK;
   222        PRAGMA cache_spill(-25);
   223        PRAGMA main.cache_spill;
   224        BEGIN;
   225        UPDATE t1 SET c=c+1;
   226        PRAGMA lock_status;
   227      }
   228    } {50 main exclusive temp unknown}   ;# Small cache spill -> exclusive lock
   229  }
   230  
   231  
   232  # Verify that newly attached databases inherit the cache_spill=OFF
   233  # setting.
   234  #
   235  do_execsql_test pragma2-4.6 {
   236    ROLLBACK;
   237    PRAGMA cache_spill=OFF;
   238    ATTACH 'test2.db' AS aux1;
   239    PRAGMA aux1.cache_size=50;
   240    BEGIN;
   241    UPDATE t2 SET c=c+1;
   242    PRAGMA lock_status;
   243  } {main unlocked temp unknown aux1 reserved}
   244  do_execsql_test pragma2-4.7 {
   245    COMMIT;
   246  }
   247  sqlite3_release_memory
   248  do_execsql_test pragma2-4.8 {
   249    PRAGMA cache_spill=ON; -- Applies to all databases
   250    BEGIN;
   251    UPDATE t2 SET c=c-1;
   252    PRAGMA lock_status;
   253  } {main unlocked temp unknown aux1 exclusive}
   254  db close
   255  forcedelete test.db
   256  sqlite3 db test.db
   257  
   258  do_execsql_test pragma2-5.1 {
   259    PRAGMA page_size=16384;
   260    CREATE TABLE t1(x);
   261    PRAGMA cache_size=2;
   262    PRAGMA cache_spill=YES;
   263    PRAGMA cache_spill;
   264  } {2}
   265  do_execsql_test pragma2-5.2 {
   266    PRAGMA cache_spill=NO;
   267    PRAGMA cache_spill;
   268  } {0}
   269  do_execsql_test pragma2-5.3 {
   270    PRAGMA cache_spill(-51);
   271    PRAGMA cache_spill;
   272  } {3}
   273     
   274  test_restore_config_pagecache
   275  finish_test