⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtab1.test

📁 最新的sqlite3.6.2源代码
💻 TEST
📖 第 1 页 / 共 2 页
字号:
  }} [list \  1 red green 2 hearts diamonds  \  2 blue black 2 hearts diamonds \]do_test vtab1-5-7 {  filter $::echo_module} [list \  xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \  xFilter {SELECT rowid, * FROM 't1'}             \]execsql {  DROP TABLE t1;  DROP TABLE t2;  DROP TABLE et1;  DROP TABLE et2;}#----------------------------------------------------------------------# Test cases vtab1-6 test INSERT, UPDATE and DELETE operations # on virtual tables.do_test vtab1-6-1 {  execsql { SELECT sql FROM sqlite_master }} {}do_test vtab1-6-2 {  execsql {    CREATE TABLE treal(a PRIMARY KEY, b, c);    CREATE VIRTUAL TABLE techo USING echo(treal);    SELECT name FROM sqlite_master WHERE type = 'table';  }} {treal techo}do_test vtab1-6-3.1.1 {  execsql {    PRAGMA count_changes=ON;    INSERT INTO techo VALUES(1, 2, 3);  }} {1}do_test vtab1-6-3.1.2 {  db changes} {1}do_test vtab1-6-3.2 {  execsql {    SELECT * FROM techo;  }} {1 2 3}do_test vtab1-6-4.1 {  execsql {    UPDATE techo SET a = 5;  }  db changes} {1}do_test vtab1-6-4.2 {  execsql {    SELECT * FROM techo;  }} {5 2 3}do_test vtab1-6-4.3 {  execsql {    UPDATE techo SET a=6 WHERE a<0;  }  db changes} {0}do_test vtab1-6-4.4 {  execsql {    SELECT * FROM techo;  }} {5 2 3}do_test vtab1-6-5.1 { execsql {   UPDATE techo set a = a||b||c; } db changes} {1}do_test vtab1-6-5.2 { execsql {   SELECT * FROM techo; }} {523 2 3}do_test vtab1-6-6.1 {  execsql {    UPDATE techo set rowid = 10;  }  db changes} {1}do_test vtab1-6-6.2 {  execsql {    SELECT rowid FROM techo;  }} {10}do_test vtab1-6-7.1.1 {  execsql {    INSERT INTO techo VALUES(11,12,13);  }} {1}do_test vtab1-6-7.1.2 {  db changes} {1}do_test vtab1-6-7.2 {  execsql {    SELECT * FROM techo ORDER BY a;  }} {11 12 13 523 2 3}do_test vtab1-6-7.3 {  execsql {    UPDATE techo SET b=b+1000  }  db changes} {2}do_test vtab1-6-7.4 {  execsql {    SELECT * FROM techo ORDER BY a;  }} {11 1012 13 523 1002 3}do_test vtab1-6-8.1 {  execsql {    DELETE FROM techo WHERE a=5;  }  db changes} {0}do_test vtab1-6-8.2 {  execsql {    SELECT * FROM techo ORDER BY a;  }} {11 1012 13 523 1002 3}do_test vtab1-6-8.3 {  execsql {    DELETE FROM techo;  }  db changes} {2}do_test vtab1-6-8.4 {  execsql {    SELECT * FROM techo ORDER BY a;  }} {}execsql {PRAGMA count_changes=OFF}file delete -force test2.dbfile delete -force test2.db-journalsqlite3 db2 test2.dbexecsql {  CREATE TABLE techo(a PRIMARY KEY, b, c);} db2proc check_echo_table {tn} {  set ::data1 [execsql {SELECT rowid, * FROM techo}]  set ::data2 [execsql {SELECT rowid, * FROM techo} db2]  do_test $tn {    string equal $::data1 $::data2  } 1}set tn 0foreach stmt [list \  {INSERT INTO techo VALUES('abc', 'def', 'ghi')}                        \  {INSERT INTO techo SELECT a||'.'||rowid, b, c FROM techo}              \  {INSERT INTO techo SELECT a||'x'||rowid, b, c FROM techo}              \  {INSERT INTO techo SELECT a||'y'||rowid, b, c FROM techo}              \  {DELETE FROM techo WHERE (oid % 3) = 0}                                \  {UPDATE techo set rowid = 100 WHERE rowid = 1}                         \  {INSERT INTO techo(a, b) VALUES('hello', 'world')}                     \  {DELETE FROM techo}                                                    \] {  execsql $stmt  execsql $stmt db2  check_echo_table vtab1-6.8.[incr tn]}db2 close#----------------------------------------------------------------------# Test cases vtab1-7 tests that the value returned by # sqlite3_last_insert_rowid() is set correctly when rows are inserted# into virtual tables.do_test vtab1.7-1 {  execsql {    CREATE TABLE real_abc(a PRIMARY KEY, b, c);    CREATE VIRTUAL TABLE echo_abc USING echo(real_abc);  }} {}do_test vtab1.7-2 {  execsql {    INSERT INTO echo_abc VALUES(1, 2, 3);    SELECT last_insert_rowid();  }} {1}do_test vtab1.7-3 {  execsql {    INSERT INTO echo_abc(rowid) VALUES(31427);    SELECT last_insert_rowid();  }} {31427}do_test vtab1.7-4 {  execsql {    INSERT INTO echo_abc SELECT a||'.v2', b, c FROM echo_abc;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-5 {  execsql {    SELECT rowid, a, b, c FROM echo_abc  }} [list 1     1    2  3  \        31427 {}   {} {} \        31428 1.v2 2  3  \        31429 {}  {} {}  \]# Now test that DELETE and UPDATE operations do not modify the value.do_test vtab1.7-6 {  execsql {    UPDATE echo_abc SET c = 5 WHERE b = 2;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-7 {  execsql {    UPDATE echo_abc SET rowid = 5 WHERE rowid = 1;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-8 {  execsql {    DELETE FROM echo_abc WHERE b = 2;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-9 {  execsql {    SELECT rowid, a, b, c FROM echo_abc  }} [list 31427 {} {} {} \        31429 {} {} {} \]do_test vtab1.7-10 {  execsql {    DELETE FROM echo_abc WHERE b = 2;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-11 {  execsql {    SELECT rowid, a, b, c FROM real_abc  }} [list 31427 {} {} {} \        31429 {} {} {} \]do_test vtab1.7-12 {  execsql {    DELETE FROM echo_abc;    SELECT last_insert_rowid();  }} {31429}do_test vtab1.7-13 {  execsql {    SELECT rowid, a, b, c FROM real_abc  }} {}ifcapable attach {  do_test vtab1.8-1 {    set echo_module ""    execsql {      ATTACH 'test2.db' AS aux;      CREATE VIRTUAL TABLE aux.e2 USING echo(real_abc);    }    set echo_module  } [list xCreate echo aux e2 real_abc   \          xSync   echo(real_abc)         \          xCommit echo(real_abc)         \  ]}do_test vtab1.8-2 {  catchsql {    DROP TABLE aux.e2;  }  execsql {    DROP TABLE treal;    DROP TABLE techo;    DROP TABLE echo_abc;    DROP TABLE real_abc;  }} {}do_test vtab1.9-1 {  set echo_module ""  execsql {    CREATE TABLE r(a, b, c);    CREATE VIRTUAL TABLE e USING echo(r, e_log);    SELECT name FROM sqlite_master;  }} {r e e_log}do_test vtab1.9-2 {  execsql {    DROP TABLE e;    SELECT name FROM sqlite_master;  }} {r}do_test vtab1.9-3 {  set echo_module ""  execsql {    CREATE VIRTUAL TABLE e USING echo(r, e_log, virtual 1 2 3 varchar(32));  }  set echo_module} [list                                                        \  xCreate echo main e r e_log {virtual 1 2 3 varchar(32)}      \  xSync echo(r)                                                \  xCommit echo(r)                                              \]do_test vtab1.10-1 {  execsql {    CREATE TABLE del(d);    CREATE VIRTUAL TABLE e2 USING echo(del);  }  db close  sqlite3 db test.db  register_echo_module [sqlite3_connection_pointer db]  execsql {    DROP TABLE del;  }  catchsql {    SELECT * FROM e2;  }} {1 {vtable constructor failed: e2}}do_test vtab1.10-2 {  set rc [catch {    set ptr [sqlite3_connection_pointer db]    sqlite3_declare_vtab $ptr {CREATE TABLE abc(a, b, c)}  } msg]  list $rc $msg} {1 {library routine called out of sequence}}do_test vtab1.10-3 {  set ::echo_module_begin_fail r  catchsql {    INSERT INTO e VALUES(1, 2, 3);  }} {1 {SQL logic error or missing database}}do_test vtab1.10-4 {  catch {execsql {    EXPLAIN SELECT * FROM e WHERE rowid = 2;    EXPLAIN QUERY PLAN SELECT * FROM e WHERE rowid = 2 ORDER BY rowid;  }}} {0}do_test vtab1.10-5 {  set echo_module ""  execsql {    SELECT * FROM e WHERE rowid||'' MATCH 'pattern';  }  set echo_module} [list \  xBestIndex {SELECT rowid, * FROM 'r'} \  xFilter {SELECT rowid, * FROM 'r'}    \]proc match_func {args} {return ""}do_test vtab1.10-6 {  set echo_module ""  db function match match_func  execsql {    SELECT * FROM e WHERE match('pattern', rowid, 'pattern2');  }  set echo_module} [list \  xBestIndex {SELECT rowid, * FROM 'r'} \  xFilter {SELECT rowid, * FROM 'r'}    \]# Testing the xFindFunction interface#catch {rename ::echo_glob_overload {}}do_test vtab1.11-1 {  execsql {    INSERT INTO r(a,b,c) VALUES(1,'?',99);    INSERT INTO r(a,b,c) VALUES(2,3,99);    SELECT a GLOB b FROM e  }} {1 0}proc ::echo_glob_overload {a b} { return [list $b $a]}do_test vtab1.11-2 {  execsql {    SELECT a like 'b' FROM e  }} {0 0}do_test vtab1.11-3 {  execsql {    SELECT a glob '2' FROM e  }} {{1 2} {2 2}}do_test vtab1.11-4 {  execsql {    SELECT  glob('2',a) FROM e  }} {0 1}do_test vtab1.11-5 {  execsql {    SELECT  glob(a,'2') FROM e  }} {{2 1} {2 2}} #----------------------------------------------------------------------# Test the outcome if a constraint is encountered half-way through# a multi-row INSERT that is inside a transaction#do_test vtab1.12-1 {  execsql {    CREATE TABLE b(a, b, c);    CREATE TABLE c(a UNIQUE, b, c);    INSERT INTO b VALUES(1, 'A', 'B');    INSERT INTO b VALUES(2, 'C', 'D');    INSERT INTO b VALUES(3, 'E', 'F');    INSERT INTO c VALUES(3, 'G', 'H');    CREATE VIRTUAL TABLE echo_c USING echo(c);  }} {}# First test outside of a transaction.do_test vtab1.12-2 {  catchsql { INSERT INTO echo_c SELECT * FROM b; }} {1 {echo-vtab-error: column a is not unique}}do_test vtab1.12-2.1 {  sqlite3_errmsg db} {echo-vtab-error: column a is not unique}do_test vtab1.12-3 {  execsql { SELECT * FROM c }} {3 G H}# Now the real test - wrapped in a transaction.do_test vtab1.12-4 {  execsql  {BEGIN}  catchsql { INSERT INTO echo_c SELECT * FROM b; }} {1 {echo-vtab-error: column a is not unique}}do_test vtab1.12-5 {  execsql { SELECT * FROM c }} {3 G H}do_test vtab1.12-6 {  execsql { COMMIT }  execsql { SELECT * FROM c }} {3 G H}# At one point (ticket #2759), a WHERE clause of the form "<column> IS NULL"# on a virtual table was causing an assert() to fail in the compiler.## "IS NULL" clauses should not be passed through to the virtual table# implementation. They are handled by SQLite after the vtab returns its# data.#do_test vtab1.13-1 {  execsql {     SELECT * FROM echo_c WHERE a IS NULL   }} {}do_test vtab1.13-2 {  execsql {     INSERT INTO c VALUES(NULL, 15, 16);    SELECT * FROM echo_c WHERE a IS NULL   }} {{} 15 16}do_test vtab1.13-3 {  execsql {     INSERT INTO c VALUES(15, NULL, 16);    SELECT * FROM echo_c WHERE b IS NULL   }} {15 {} 16}do_test vtab1.13-3 {  execsql {     SELECT * FROM echo_c WHERE b IS NULL AND a = 15;  }} {15 {} 16}do_test vtab1-14.1 {  execsql { DELETE FROM c }  set echo_module ""  execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) }  set echo_module} [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'}]do_test vtab1-14.2 {  set echo_module ""  execsql { SELECT * FROM echo_c WHERE rowid = 1 }  set echo_module} [list xBestIndex {SELECT rowid, * FROM 'c' WHERE rowid = ?} xFilter {SELECT rowid, * FROM 'c' WHERE rowid = ?} 1]do_test vtab1-14.3 {  set echo_module ""  execsql { SELECT * FROM echo_c WHERE a = 1 }  set echo_module} [list xBestIndex {SELECT rowid, * FROM 'c' WHERE a = ?} xFilter {SELECT rowid, * FROM 'c' WHERE a = ?} 1]do_test vtab1-14.4 {  set echo_module ""  execsql { SELECT * FROM echo_c WHERE a IN (1, 2) }  set echo_module} [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'}]do_test vtab1-15.1 {  execsql {    CREATE TABLE t1(a, b, c);    CREATE VIRTUAL TABLE echo_t1 USING echo(t1);  }} {}do_test vtab1-15.2 {  execsql {    INSERT INTO echo_t1(rowid) VALUES(45);    SELECT rowid, * FROM echo_t1;  }} {45 {} {} {}}do_test vtab1-15.3 {  execsql {    INSERT INTO echo_t1(rowid) VALUES(NULL);    SELECT rowid, * FROM echo_t1;  }} {45 {} {} {} 46 {} {} {}}do_test vtab1-15.4 {  catchsql {    INSERT INTO echo_t1(rowid) VALUES('new rowid');  }} {1 {datatype mismatch}}# The following tests - vtab1-16.* - are designed to test that setting # sqlite3_vtab.zErrMsg variable can be used by the vtab interface to # return an error message to the user.# do_test vtab1-16.1 {  execsql {    CREATE TABLE t2(a PRIMARY KEY, b, c);    INSERT INTO t2 VALUES(1, 2, 3);    INSERT INTO t2 VALUES(4, 5, 6);    CREATE VIRTUAL TABLE echo_t2 USING echo(t2);  }} {}set tn 2foreach method [list \    xBestIndex       \    xOpen            \    xFilter          \    xNext            \    xColumn          \    xRowid           \] {  do_test vtab1-16.$tn {    set echo_module_fail($method,t2) "the $method method has failed"    catchsql { SELECT rowid, * FROM echo_t2 WHERE a >= 1 }  } "1 {echo-vtab-error: the $method method has failed}"  unset echo_module_fail($method,t2)  incr tn}foreach method [list \  xUpdate            \  xBegin             \  xSync              \] {  do_test vtab1-16.$tn {    set echo_module_fail($method,t2) "the $method method has failed"    catchsql { INSERT INTO echo_t2 VALUES(7, 8, 9) }  } "1 {echo-vtab-error: the $method method has failed}"  unset echo_module_fail($method,t2)  incr tn}do_test vtab1-16.$tn {  set echo_module_fail(xRename,t2) "the xRename method has failed"  catchsql { ALTER TABLE echo_t2 RENAME TO another_name }} "1 {echo-vtab-error: the xRename method has failed}"unset echo_module_fail(xRename,t2)incr tnunset -nocomplain echo_module_begin_failfinish_test

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -