📄 vtab1.test
字号:
}} [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 + -