1c69cdfd4Sdanielk1977# 2006 June 10 2c69cdfd4Sdanielk1977# 3c69cdfd4Sdanielk1977# The author disclaims copyright to this source code. In place of 4c69cdfd4Sdanielk1977# a legal notice, here is a blessing: 5c69cdfd4Sdanielk1977# 6c69cdfd4Sdanielk1977# May you do good and not evil. 7c69cdfd4Sdanielk1977# May you find forgiveness for yourself and forgive others. 8c69cdfd4Sdanielk1977# May you share freely, never taking more than you give. 9c69cdfd4Sdanielk1977# 10c69cdfd4Sdanielk1977#*********************************************************************** 11c69cdfd4Sdanielk1977# This file implements regression tests for SQLite library. The 12c69cdfd4Sdanielk1977# focus is on testing the following virtual table methods: 13c69cdfd4Sdanielk1977# 14c69cdfd4Sdanielk1977# xBegin 15c69cdfd4Sdanielk1977# xSync 16c69cdfd4Sdanielk1977# xCommit 17c69cdfd4Sdanielk1977# xRollback 18c69cdfd4Sdanielk1977# 19e8f52c50Sdrh# $Id: vtab4.test,v 1.3 2008/07/12 14:52:21 drh Exp $ 20c69cdfd4Sdanielk1977 21c69cdfd4Sdanielk1977set testdir [file dirname $argv0] 22c69cdfd4Sdanielk1977source $testdir/tester.tcl 23c69cdfd4Sdanielk1977 24f80ad49fSdrhunset -nocomplain echo_module 25f80ad49fSdrhunset -nocomplain echo_module_sync_fail 26f80ad49fSdrh 27c69cdfd4Sdanielk1977ifcapable !vtab { 28c69cdfd4Sdanielk1977 finish_test 29c69cdfd4Sdanielk1977 return 30c69cdfd4Sdanielk1977} 31c69cdfd4Sdanielk1977 32c69cdfd4Sdanielk1977# Register the echo module 33c69cdfd4Sdanielk1977db cache size 0 34c69cdfd4Sdanielk1977register_echo_module [sqlite3_connection_pointer db] 35c69cdfd4Sdanielk1977 36c69cdfd4Sdanielk1977do_test vtab4-1.1 { 37c69cdfd4Sdanielk1977 execsql { 38c69cdfd4Sdanielk1977 CREATE TABLE treal(a PRIMARY KEY, b, c); 39c69cdfd4Sdanielk1977 CREATE VIRTUAL TABLE techo USING echo(treal); 40c69cdfd4Sdanielk1977 } 41c69cdfd4Sdanielk1977} {} 42c69cdfd4Sdanielk1977 43c69cdfd4Sdanielk1977# Test an INSERT, UPDATE and DELETE statement on the virtual table 44c69cdfd4Sdanielk1977# in an implicit transaction. Each should result in a single call 45c69cdfd4Sdanielk1977# to xBegin, xSync and xCommit. 46c69cdfd4Sdanielk1977# 47c69cdfd4Sdanielk1977do_test vtab4-1.2 { 48c69cdfd4Sdanielk1977 set echo_module [list] 49c69cdfd4Sdanielk1977 execsql { 50c69cdfd4Sdanielk1977 INSERT INTO techo VALUES(1, 2, 3); 51c69cdfd4Sdanielk1977 } 52c69cdfd4Sdanielk1977 set echo_module 53c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)} 54c69cdfd4Sdanielk1977do_test vtab4-1.3 { 55c69cdfd4Sdanielk1977 set echo_module [list] 56c69cdfd4Sdanielk1977 execsql { 57c69cdfd4Sdanielk1977 UPDATE techo SET a = 2; 58c69cdfd4Sdanielk1977 } 59c69cdfd4Sdanielk1977 set echo_module 60*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \ 61c69cdfd4Sdanielk1977 xBegin echo(treal) \ 62*1acb539fSdan xFilter {SELECT rowid, a, b, c FROM 'treal'} \ 63c69cdfd4Sdanielk1977 xSync echo(treal) \ 64c69cdfd4Sdanielk1977 xCommit echo(treal) \ 65c69cdfd4Sdanielk1977] 66c69cdfd4Sdanielk1977do_test vtab4-1.4 { 67c69cdfd4Sdanielk1977 set echo_module [list] 68c69cdfd4Sdanielk1977 execsql { 69c69cdfd4Sdanielk1977 DELETE FROM techo; 70c69cdfd4Sdanielk1977 } 71c69cdfd4Sdanielk1977 set echo_module 72*1acb539fSdan} [list xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \ 73c69cdfd4Sdanielk1977 xBegin echo(treal) \ 74*1acb539fSdan xFilter {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \ 75c69cdfd4Sdanielk1977 xSync echo(treal) \ 76c69cdfd4Sdanielk1977 xCommit echo(treal) \ 77c69cdfd4Sdanielk1977] 78c69cdfd4Sdanielk1977 79c69cdfd4Sdanielk1977# Ensure xBegin is not called more than once in a single transaction. 80c69cdfd4Sdanielk1977# 81c69cdfd4Sdanielk1977do_test vtab4-2.1 { 82c69cdfd4Sdanielk1977 set echo_module [list] 83c69cdfd4Sdanielk1977 execsql { 84c69cdfd4Sdanielk1977 BEGIN; 85c69cdfd4Sdanielk1977 INSERT INTO techo VALUES(1, 2, 3); 86c69cdfd4Sdanielk1977 INSERT INTO techo VALUES(4, 5, 6); 87c69cdfd4Sdanielk1977 INSERT INTO techo VALUES(7, 8, 9); 88c69cdfd4Sdanielk1977 COMMIT; 89c69cdfd4Sdanielk1977 } 90c69cdfd4Sdanielk1977 set echo_module 91c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)} 92c69cdfd4Sdanielk1977 93c69cdfd4Sdanielk1977# Try a transaction with two virtual tables. 94c69cdfd4Sdanielk1977# 95c69cdfd4Sdanielk1977do_test vtab4-2.2 { 96c69cdfd4Sdanielk1977 execsql { 97c69cdfd4Sdanielk1977 CREATE TABLE sreal(a, b, c UNIQUE); 98c69cdfd4Sdanielk1977 CREATE VIRTUAL TABLE secho USING echo(sreal); 99c69cdfd4Sdanielk1977 } 100c69cdfd4Sdanielk1977 set echo_module [list] 101c69cdfd4Sdanielk1977 execsql { 102c69cdfd4Sdanielk1977 BEGIN; 103c69cdfd4Sdanielk1977 INSERT INTO secho SELECT * FROM techo; 104c69cdfd4Sdanielk1977 DELETE FROM techo; 105c69cdfd4Sdanielk1977 COMMIT; 106c69cdfd4Sdanielk1977 } 107c69cdfd4Sdanielk1977 set echo_module 108*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \ 109c69cdfd4Sdanielk1977 xBegin echo(sreal) \ 110*1acb539fSdan xFilter {SELECT rowid, a, b, c FROM 'treal'} \ 111*1acb539fSdan xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \ 112c69cdfd4Sdanielk1977 xBegin echo(treal) \ 113*1acb539fSdan xFilter {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \ 114c69cdfd4Sdanielk1977 xSync echo(sreal) \ 115c69cdfd4Sdanielk1977 xSync echo(treal) \ 116c69cdfd4Sdanielk1977 xCommit echo(sreal) \ 117c69cdfd4Sdanielk1977 xCommit echo(treal) \ 118c69cdfd4Sdanielk1977] 119c69cdfd4Sdanielk1977do_test vtab4-2.3 { 120c69cdfd4Sdanielk1977 execsql { 121c69cdfd4Sdanielk1977 SELECT * FROM secho; 122c69cdfd4Sdanielk1977 } 123c69cdfd4Sdanielk1977} {1 2 3 4 5 6 7 8 9} 124c69cdfd4Sdanielk1977do_test vtab4-2.4 { 125c69cdfd4Sdanielk1977 execsql { 126c69cdfd4Sdanielk1977 SELECT * FROM techo; 127c69cdfd4Sdanielk1977 } 128c69cdfd4Sdanielk1977} {} 129c69cdfd4Sdanielk1977 130c69cdfd4Sdanielk1977# Try an explicit ROLLBACK on a transaction with two open virtual tables. 131c69cdfd4Sdanielk1977do_test vtab4-2.5 { 132c69cdfd4Sdanielk1977 set echo_module [list] 133c69cdfd4Sdanielk1977 execsql { 134c69cdfd4Sdanielk1977 BEGIN; 135c69cdfd4Sdanielk1977 INSERT INTO techo SELECT * FROM secho; 136c69cdfd4Sdanielk1977 DELETE FROM secho; 137c69cdfd4Sdanielk1977 ROLLBACK; 138c69cdfd4Sdanielk1977 } 139c69cdfd4Sdanielk1977 set echo_module 140*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'sreal'} \ 141c69cdfd4Sdanielk1977 xBegin echo(treal) \ 142*1acb539fSdan xFilter {SELECT rowid, a, b, c FROM 'sreal'} \ 143*1acb539fSdan xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \ 144c69cdfd4Sdanielk1977 xBegin echo(sreal) \ 145*1acb539fSdan xFilter {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \ 146c69cdfd4Sdanielk1977 xRollback echo(treal) \ 147c69cdfd4Sdanielk1977 xRollback echo(sreal) \ 148c69cdfd4Sdanielk1977] 149c69cdfd4Sdanielk1977do_test vtab4-2.6 { 150c69cdfd4Sdanielk1977 execsql { 151c69cdfd4Sdanielk1977 SELECT * FROM secho; 152c69cdfd4Sdanielk1977 } 153c69cdfd4Sdanielk1977} {1 2 3 4 5 6 7 8 9} 154c69cdfd4Sdanielk1977do_test vtab4-2.7 { 155c69cdfd4Sdanielk1977 execsql { 156c69cdfd4Sdanielk1977 SELECT * FROM techo; 157c69cdfd4Sdanielk1977 } 158c69cdfd4Sdanielk1977} {} 159c69cdfd4Sdanielk1977 160c69cdfd4Sdanielk1977do_test vtab4-3.1 { 161c69cdfd4Sdanielk1977 set echo_module [list] 162c69cdfd4Sdanielk1977 set echo_module_sync_fail treal 163c69cdfd4Sdanielk1977 catchsql { 164c69cdfd4Sdanielk1977 INSERT INTO techo VALUES(1, 2, 3); 165c69cdfd4Sdanielk1977 } 166c69cdfd4Sdanielk1977} {1 {unknown error}} 167c69cdfd4Sdanielk1977do_test vtab4-3.2 { 168c69cdfd4Sdanielk1977 set echo_module 169c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xRollback echo(treal)} 170c69cdfd4Sdanielk1977 171c69cdfd4Sdanielk1977do_test vtab4-3.3 { 172c69cdfd4Sdanielk1977 set echo_module [list] 173c69cdfd4Sdanielk1977 set echo_module_sync_fail sreal 174c69cdfd4Sdanielk1977 catchsql { 175c69cdfd4Sdanielk1977 BEGIN; 176c69cdfd4Sdanielk1977 INSERT INTO techo SELECT * FROM secho; 177c69cdfd4Sdanielk1977 DELETE FROM secho; 178c69cdfd4Sdanielk1977 COMMIT; 179c69cdfd4Sdanielk1977 } 180c69cdfd4Sdanielk1977 set echo_module 181*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'sreal'} \ 182c69cdfd4Sdanielk1977 xBegin echo(treal) \ 183*1acb539fSdan xFilter {SELECT rowid, a, b, c FROM 'sreal'} \ 184*1acb539fSdan xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \ 185c69cdfd4Sdanielk1977 xBegin echo(sreal) \ 186*1acb539fSdan xFilter {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \ 187c69cdfd4Sdanielk1977 xSync echo(treal) \ 188c69cdfd4Sdanielk1977 xSync echo(sreal) \ 189c69cdfd4Sdanielk1977 xRollback echo(treal) \ 190c69cdfd4Sdanielk1977 xRollback echo(sreal) \ 191c69cdfd4Sdanielk1977] 192c69cdfd4Sdanielk1977 193c69cdfd4Sdanielk1977finish_test 194