CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
attach3.test354 linesDownload Raw Back to test
1# 2003 July 12#3# The author disclaims copyright to this source code.  In place of4# 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.  The12# focus of this script is testing the ATTACH and DETACH commands13# and schema changes to attached databases.14#15# $Id: attach3.test,v 1.18 2007/10/09 08:29:32 danielk1977 Exp $16#17 18set testdir [file dirname $argv0]19source $testdir/tester.tcl20 21ifcapable !attach {22  finish_test23  return24}25 26# The tests in this file were written before SQLite supported recursive27# trigger invocation, and some tests depend on that to pass. So disable28# recursive triggers for this file.29catchsql { pragma recursive_triggers = off } 30 31# Create tables t1 and t2 in the main database32execsql {33  CREATE TABLE t1(a, b);34  CREATE TABLE t2(c, d);35}36 37# Create tables t1 and t2 in database file test2.db38forcedelete test2.db39forcedelete test2.db-journal40sqlite3 db2 test2.db41execsql {42  CREATE TABLE t1(a, b);43  CREATE TABLE t2(c, d);44} db245db2 close46 47# Create a table in the auxilary database.48do_test attach3-1.1 {49  execsql {50    ATTACH 'test2.db' AS aux;51  }52} {}53do_test attach3-1.2 {54  execsql {55    CREATE TABLE aux.t3(e, f);56  }57} {}58do_test attach3-1.3 {59  execsql {60    SELECT * FROM sqlite_master WHERE name = 't3';61  }62} {}63do_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)}"68do_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.76do_test attach3-2.1 {77  execsql {78    CREATE INDEX aux.i1 on t3(e);79  }80} {}81do_test attach3-2.2 {82  execsql {83    SELECT * FROM sqlite_master WHERE name = 'i1';84  }85} {}86do_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.93do_test attach3-3.1 {94  execsql {95    DROP INDEX aux.i1;96    SELECT * FROM aux.sqlite_master WHERE name = 'i1';97  }98} {}99do_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)}"105do_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.113do_test attach3-4.1 {114  execsql {115    DROP TABLE aux.t1;116    SELECT name FROM aux.sqlite_master;117  }118} {t2 t3}119do_test attach3-4.2 {120  # This will drop main.t2121  execsql {122    DROP TABLE t2;123    SELECT name FROM aux.sqlite_master;124  }125} {t2 t3}126do_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.134ifcapable view {135do_test attach3-5.1 {136  execsql {137    CREATE VIEW aux.v1 AS SELECT * FROM t3;138  }139} {}140do_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}}145do_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 153do_test attach3-6.1 {154  execsql {155    DROP VIEW aux.v1;156  }157} {}158do_test attach3-6.2 {159  execsql {160    SELECT * FROM aux.sqlite_master WHERE name = 'v1';161  }162} {}163} ;# ifcapable view164 165ifcapable {trigger} {166# Create a trigger in the auxilary database.167do_test attach3-7.1 {168  execsql {169    CREATE TRIGGER aux.tr1 AFTER INSERT ON t3 BEGIN170      INSERT INTO t3 VALUES(new.e*2, new.f*2);171    END;172  }173} {}174do_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}181do_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 BEGIN186      INSERT INTO t3 VALUES(new.e*2, new.f*2);187    END}}188 189# Drop the trigger 190do_test attach3-8.1 {191  execsql {192    DROP TRIGGER aux.tr1;193  }194} {}195do_test attach3-8.2 {196  execsql {197    SELECT * FROM aux.sqlite_master WHERE name = 'tr1';198  }199} {}200 201ifcapable 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 trigger227 228# Make sure the aux.sqlite_master table is read-only229do_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 #811237#238do_test attach3-11.0 {239  catchsql {240    ATTACH DATABASE '/nodir/nofile.x' AS notadb;241  }242} {1 {unable to open database: /nodir/nofile.x}}243do_test attach3-11.1 {244  catchsql {245    ATTACH DATABASE ':memory:' AS notadb;246  }247} {0 {}}248do_test attach3-11.2 {249  catchsql {250    DETACH DATABASE notadb;251  }252} {0 {}}253 254# Return a list of attached databases255#256proc 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 $y263}264 265ifcapable schema_pragmas&&tempdb {266 267ifcapable !trigger {268  execsql {create temp table dummy(dummy)}269}270 271# Ticket #1825272#273do_test attach3-12.1 {274  db_list275} {main temp aux}276do_test attach3-12.2 {277  execsql {278    ATTACH DATABASE ? AS ?279  }280  db_list281} {main temp aux {}}282do_test attach3-12.3 {283  execsql {284    DETACH aux285  }286  db_list287} {main temp {}}288do_test attach3-12.4 {289  execsql {290    DETACH ?291  }292  db_list293} {main temp}294do_test attach3-12.5 {295  execsql {296    ATTACH DATABASE '' AS ''297  }298  db_list299} {main temp {}}300do_test attach3-12.6 {301  execsql {302    DETACH ''303  }304  db_list305} {main temp}306do_test attach3-12.7 {307  execsql {308    ATTACH DATABASE '' AS ?309  }310  db_list311} {main temp {}}312do_test attach3-12.8 {313  execsql {314    DETACH ''315  }316  db_list317} {main temp}318do_test attach3-12.9 {319  execsql {320    ATTACH DATABASE '' AS NULL321  }322  db_list323} {main temp {}}324do_test attach3-12.10 {325  execsql {326    DETACH ?327  }328  db_list329} {main temp}330do_test attach3-12.11 {331  catchsql {332    DETACH NULL333  }334} {1 {no such database: }}335do_test attach3-12.12 {336  catchsql {337    ATTACH null AS null;338    ATTACH '' AS '';339  }340} {1 {database  is already in use}}341do_test attach3-12.13 {342  db_list343} {main temp {}}344do_test attach3-12.14 {345  execsql {346    DETACH '';347  }348  db_list349} {main temp}350 351} ;# ifcapable pragma352 353finish_test354