gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/attach3.test (about)

     1  # 2003 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 testing the ATTACH and DETACH commands
    13  # and schema changes to attached databases.
    14  #
    15  # $Id: attach3.test,v 1.18 2007/10/09 08:29:32 danielk1977 Exp $
    16  #
    17  
    18  set testdir [file dirname $argv0]
    19  source $testdir/tester.tcl
    20  
    21  ifcapable !attach {
    22    finish_test
    23    return
    24  }
    25  
    26  # The tests in this file were written before SQLite supported recursive
    27  # trigger invocation, and some tests depend on that to pass. So disable
    28  # recursive triggers for this file.
    29  catchsql { pragma recursive_triggers = off } 
    30  
    31  # Create tables t1 and t2 in the main database
    32  execsql {
    33    CREATE TABLE t1(a, b);
    34    CREATE TABLE t2(c, d);
    35  }
    36  
    37  # Create tables t1 and t2 in database file test2.db
    38  forcedelete test2.db
    39  forcedelete test2.db-journal
    40  sqlite3 db2 test2.db
    41  execsql {
    42    CREATE TABLE t1(a, b);
    43    CREATE TABLE t2(c, d);
    44  } db2
    45  db2 close
    46  
    47  # Create a table in the auxilary database.
    48  do_test attach3-1.1 {
    49    execsql {
    50      ATTACH 'test2.db' AS aux;
    51    }
    52  } {}
    53  do_test attach3-1.2 {
    54    execsql {
    55      CREATE TABLE aux.t3(e, f);
    56    }
    57  } {}
    58  do_test attach3-1.3 {
    59    execsql {
    60      SELECT * FROM sqlite_master WHERE name = 't3';
    61    }
    62  } {}
    63  do_test attach3-1.4 {
    64    execsql {
    65      SELECT * FROM aux.sqlite_master WHERE name = 't3';
    66    }
    67  } "table t3 t3 [expr $AUTOVACUUM?5:4] {CREATE TABLE t3(e, f)}"
    68  do_test attach3-1.5 {
    69    execsql {
    70      INSERT INTO t3 VALUES(1, 2);
    71      SELECT * FROM t3;
    72    }
    73  } {1 2}
    74  
    75  # Create an index on the auxilary database table.
    76  do_test attach3-2.1 {
    77    execsql {
    78      CREATE INDEX aux.i1 on t3(e);
    79    }
    80  } {}
    81  do_test attach3-2.2 {
    82    execsql {
    83      SELECT * FROM sqlite_master WHERE name = 'i1';
    84    }
    85  } {}
    86  do_test attach3-2.3 {
    87    execsql {
    88      SELECT * FROM aux.sqlite_master WHERE name = 'i1';
    89    }
    90  } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
    91  
    92  # Drop the index on the aux database table.
    93  do_test attach3-3.1 {
    94    execsql {
    95      DROP INDEX aux.i1;
    96      SELECT * FROM aux.sqlite_master WHERE name = 'i1';
    97    }
    98  } {}
    99  do_test attach3-3.2 {
   100    execsql {
   101      CREATE INDEX aux.i1 on t3(e);
   102      SELECT * FROM aux.sqlite_master WHERE name = 'i1';
   103    }
   104  } "index i1 t3 [expr $AUTOVACUUM?6:5] {CREATE INDEX i1 on t3(e)}"
   105  do_test attach3-3.3 {
   106    execsql {
   107      DROP INDEX i1;
   108      SELECT * FROM aux.sqlite_master WHERE name = 'i1';
   109    }
   110  } {}
   111  
   112  # Drop tables t1 and t2 in the auxilary database.
   113  do_test attach3-4.1 {
   114    execsql {
   115      DROP TABLE aux.t1;
   116      SELECT name FROM aux.sqlite_master;
   117    }
   118  } {t2 t3}
   119  do_test attach3-4.2 {
   120    # This will drop main.t2
   121    execsql {
   122      DROP TABLE t2;
   123      SELECT name FROM aux.sqlite_master;
   124    }
   125  } {t2 t3}
   126  do_test attach3-4.3 {
   127    execsql {
   128      DROP TABLE t2;
   129      SELECT name FROM aux.sqlite_master;
   130    }
   131  } {t3}
   132  
   133  # Create a view in the auxilary database.
   134  ifcapable view {
   135  do_test attach3-5.1 {
   136    execsql {
   137      CREATE VIEW aux.v1 AS SELECT * FROM t3;
   138    }
   139  } {}
   140  do_test attach3-5.2 {
   141    execsql {
   142      SELECT * FROM aux.sqlite_master WHERE name = 'v1';
   143    }
   144  } {view v1 v1 0 {CREATE VIEW v1 AS SELECT * FROM t3}}
   145  do_test attach3-5.3 {
   146    execsql {
   147      INSERT INTO aux.t3 VALUES('hello', 'world');
   148      SELECT * FROM v1;
   149    }
   150  } {1 2 hello world}
   151  
   152  # Drop the view 
   153  do_test attach3-6.1 {
   154    execsql {
   155      DROP VIEW aux.v1;
   156    }
   157  } {}
   158  do_test attach3-6.2 {
   159    execsql {
   160      SELECT * FROM aux.sqlite_master WHERE name = 'v1';
   161    }
   162  } {}
   163  } ;# ifcapable view
   164  
   165  ifcapable {trigger} {
   166  # Create a trigger in the auxilary database.
   167  do_test attach3-7.1 {
   168    execsql {
   169      CREATE TRIGGER aux.tr1 AFTER INSERT ON t3 BEGIN
   170        INSERT INTO t3 VALUES(new.e*2, new.f*2);
   171      END;
   172    }
   173  } {}
   174  do_test attach3-7.2 {
   175    execsql {
   176      DELETE FROM t3;
   177      INSERT INTO t3 VALUES(10, 20);
   178      SELECT * FROM t3;
   179    }
   180  } {10 20 20 40}
   181  do_test attach3-5.3 {
   182    execsql {
   183      SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
   184    }
   185  } {trigger tr1 t3 0 {CREATE TRIGGER tr1 AFTER INSERT ON t3 BEGIN
   186        INSERT INTO t3 VALUES(new.e*2, new.f*2);
   187      END}}
   188  
   189  # Drop the trigger 
   190  do_test attach3-8.1 {
   191    execsql {
   192      DROP TRIGGER aux.tr1;
   193    }
   194  } {}
   195  do_test attach3-8.2 {
   196    execsql {
   197      SELECT * FROM aux.sqlite_master WHERE name = 'tr1';
   198    }
   199  } {}
   200  
   201  ifcapable tempdb {
   202    # Try to trick SQLite into dropping the wrong temp trigger.
   203    do_test attach3-9.0 {
   204      execsql {
   205        CREATE TABLE main.t4(a, b, c);
   206        CREATE TABLE aux.t4(a, b, c);
   207        CREATE TEMP TRIGGER tst_trigger BEFORE INSERT ON aux.t4 BEGIN 
   208          SELECT 'hello world';
   209        END;
   210        SELECT count(*) FROM temp.sqlite_master;
   211      }
   212    } {1}
   213    do_test attach3-9.1 {
   214      execsql {
   215        DROP TABLE main.t4;
   216        SELECT count(*) FROM sqlite_temp_master;
   217      }
   218    } {1}
   219    do_test attach3-9.2 {
   220      execsql {
   221        DROP TABLE aux.t4;
   222        SELECT count(*) FROM temp.sqlite_master;
   223      }
   224    } {0}
   225  }
   226  } ;# endif trigger
   227  
   228  # Make sure the aux.sqlite_master table is read-only
   229  do_test attach3-10.0 {
   230    catchsql {
   231      INSERT INTO aux.sqlite_master VALUES(1, 2, 3, 4, 5);
   232    }
   233  } {1 {table sqlite_master may not be modified}}
   234  
   235  # Failure to attach leaves us in a workable state.
   236  # Ticket #811
   237  #
   238  do_test attach3-11.0 {
   239    catchsql {
   240      ATTACH DATABASE '/nodir/nofile.x' AS notadb;
   241    }
   242  } {1 {unable to open database: /nodir/nofile.x}}
   243  do_test attach3-11.1 {
   244    catchsql {
   245      ATTACH DATABASE ':memory:' AS notadb;
   246    }
   247  } {0 {}}
   248  do_test attach3-11.2 {
   249    catchsql {
   250      DETACH DATABASE notadb;
   251    }
   252  } {0 {}}
   253  
   254  # Return a list of attached databases
   255  #
   256  proc db_list {} {
   257    set x [execsql {
   258      PRAGMA database_list;
   259    }]
   260    set y {}
   261    foreach {n id file} $x {lappend y $id}
   262    return $y
   263  }
   264  
   265  ifcapable schema_pragmas&&tempdb {
   266  
   267  ifcapable !trigger {
   268    execsql {create temp table dummy(dummy)}
   269  }
   270  
   271  # Ticket #1825
   272  #
   273  do_test attach3-12.1 {
   274    db_list
   275  } {main temp aux}
   276  do_test attach3-12.2 {
   277    execsql {
   278      ATTACH DATABASE ? AS ?
   279    }
   280    db_list
   281  } {main temp aux {}}
   282  do_test attach3-12.3 {
   283    execsql {
   284      DETACH aux
   285    }
   286    db_list
   287  } {main temp {}}
   288  do_test attach3-12.4 {
   289    execsql {
   290      DETACH ?
   291    }
   292    db_list
   293  } {main temp}
   294  do_test attach3-12.5 {
   295    execsql {
   296      ATTACH DATABASE '' AS ''
   297    }
   298    db_list
   299  } {main temp {}}
   300  do_test attach3-12.6 {
   301    execsql {
   302      DETACH ''
   303    }
   304    db_list
   305  } {main temp}
   306  do_test attach3-12.7 {
   307    execsql {
   308      ATTACH DATABASE '' AS ?
   309    }
   310    db_list
   311  } {main temp {}}
   312  do_test attach3-12.8 {
   313    execsql {
   314      DETACH ''
   315    }
   316    db_list
   317  } {main temp}
   318  do_test attach3-12.9 {
   319    execsql {
   320      ATTACH DATABASE '' AS NULL
   321    }
   322    db_list
   323  } {main temp {}}
   324  do_test attach3-12.10 {
   325    execsql {
   326      DETACH ?
   327    }
   328    db_list
   329  } {main temp}
   330  do_test attach3-12.11 {
   331    catchsql {
   332      DETACH NULL
   333    }
   334  } {1 {no such database: }}
   335  do_test attach3-12.12 {
   336    catchsql {
   337      ATTACH null AS null;
   338      ATTACH '' AS '';
   339    }
   340  } {1 {database  is already in use}}
   341  do_test attach3-12.13 {
   342    db_list
   343  } {main temp {}}
   344  do_test attach3-12.14 {
   345    execsql {
   346      DETACH '';
   347    }
   348    db_list
   349  } {main temp}
   350  
   351  } ;# ifcapable pragma
   352  
   353  finish_test