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

     1  # 200 July 1
     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 attaching many database files to a single
    13  # connection.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  
    19  set testprefix attach4
    20  
    21  ifcapable !attach {
    22    finish_test
    23    return
    24  }
    25  
    26  puts "Testing with SQLITE_MAX_ATTACHED=$SQLITE_MAX_ATTACHED"
    27  
    28  set files {main test.db}
    29  for {set ii 0} {$ii < $SQLITE_MAX_ATTACHED} {incr ii} {
    30    lappend files aux$ii "test.db$ii"
    31  }
    32  
    33  do_test 1.1 {
    34    sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
    35  } $SQLITE_MAX_ATTACHED
    36  
    37  do_test 1.2.1 {
    38    db close
    39    foreach {name f} $files { forcedelete $f }
    40    sqlite3 db test.db
    41    
    42    foreach {name f} $files {
    43      if {$name == "main"} continue
    44      execsql "ATTACH '$f' AS $name"
    45    }
    46  
    47    db eval {PRAGMA database_list} {
    48      lappend L $name [file tail $file]
    49    }
    50    set L
    51  } $files
    52  
    53  do_catchsql_test 1.2.2 {
    54    ATTACH 'x.db' AS next;
    55  } [list 1 "too many attached databases - max $SQLITE_MAX_ATTACHED"]
    56  
    57  do_test 1.3 {
    58    execsql BEGIN;
    59    foreach {name f} $files {
    60      execsql "CREATE TABLE $name.tbl(x)"
    61      execsql "INSERT INTO $name.tbl VALUES('$f')"
    62    }
    63    execsql COMMIT;
    64  } {}
    65  
    66  do_test 1.4 {
    67    set L [list]
    68    foreach {name f} $files {
    69      lappend L $name [execsql "SELECT x FROM $name.tbl"]
    70    }
    71    set L
    72  } $files
    73  
    74  set L [list]
    75  set S ""
    76  foreach {name f} $files {
    77    if {[permutation] == "journaltest"} {
    78      set mode delete
    79    } else {
    80      set mode wal
    81    }
    82    ifcapable !wal { set mode delete }
    83    lappend L $mode
    84    append S "
    85      PRAGMA $name.journal_mode = WAL;
    86      UPDATE $name.tbl SET x = '$name';
    87    "
    88  }
    89  do_execsql_test 1.5 $S $L
    90  
    91  do_test 1.6 {
    92    set L [list]
    93    foreach {name f} $files {
    94      lappend L [execsql "SELECT x FROM $name.tbl"] $f
    95    }
    96    set L
    97  } $files
    98  
    99  do_test 1.7 {
   100    execsql BEGIN;
   101    foreach {name f} $files {
   102      execsql "UPDATE $name.tbl SET x = '$f'"
   103    }
   104    execsql COMMIT;
   105  } {}
   106  
   107  do_test 1.8 {
   108    set L [list]
   109    foreach {name f} $files {
   110      lappend L $name [execsql "SELECT x FROM $name.tbl"]
   111    }
   112    set L
   113  } $files
   114  
   115  db close
   116  foreach {name f} $files { forcedelete $f }
   117  
   118  #-------------------------------------------------------------------------
   119  reset_db
   120  do_execsql_test 2.0 {
   121    ATTACH DATABASE '' AS aux;
   122    CREATE TABLE IF NOT EXISTS aux.t1(a, b);
   123    CREATE TEMPORARY TRIGGER tr1 DELETE ON t1 BEGIN 
   124      DELETE FROM t1; 
   125    END;
   126    CREATE TABLE temp.t1(a, b);
   127  }
   128  
   129  do_execsql_test 2.1 {
   130    DETACH DATABASE aux;
   131  }
   132  
   133  do_execsql_test 2.2 {
   134    DROP TRIGGER tr1;
   135  }
   136  
   137  finish_test