1b3d24bf8Sdanielk1977# 2006 June 10 2b3d24bf8Sdanielk1977# 3b3d24bf8Sdanielk1977# The author disclaims copyright to this source code. In place of 4b3d24bf8Sdanielk1977# a legal notice, here is a blessing: 5b3d24bf8Sdanielk1977# 6b3d24bf8Sdanielk1977# May you do good and not evil. 7b3d24bf8Sdanielk1977# May you find forgiveness for yourself and forgive others. 8b3d24bf8Sdanielk1977# May you share freely, never taking more than you give. 9b3d24bf8Sdanielk1977# 10b3d24bf8Sdanielk1977#*********************************************************************** 11b3d24bf8Sdanielk1977# This file implements regression tests for SQLite library. 12b3d24bf8Sdanielk1977# 13e8f52c50Sdrh# $Id: vtab5.test,v 1.8 2008/07/12 14:52:21 drh Exp $ 14b3d24bf8Sdanielk1977 15b3d24bf8Sdanielk1977set testdir [file dirname $argv0] 16b3d24bf8Sdanielk1977source $testdir/tester.tcl 17b3d24bf8Sdanielk1977 18b3d24bf8Sdanielk1977ifcapable !vtab { 19b3d24bf8Sdanielk1977 finish_test 20b3d24bf8Sdanielk1977 return 21b3d24bf8Sdanielk1977} 22b3d24bf8Sdanielk1977 23b3d24bf8Sdanielk1977# The following tests - vtab5-1.* - ensure that an INSERT, DELETE or UPDATE 24b3d24bf8Sdanielk1977# statement can be executed immediately after a CREATE or schema reload. The 25b3d24bf8Sdanielk1977# point here is testing that the parser always calls xConnect() before the 26b3d24bf8Sdanielk1977# schema of a virtual table is used. 27b8cbb872Sdanielk1977# 28b3d24bf8Sdanielk1977register_echo_module [sqlite3_connection_pointer db] 29b3d24bf8Sdanielk1977do_test vtab5-1.1 { 30b3d24bf8Sdanielk1977 execsql { 31b3d24bf8Sdanielk1977 CREATE TABLE treal(a VARCHAR(16), b INTEGER, c FLOAT); 32b3d24bf8Sdanielk1977 INSERT INTO treal VALUES('a', 'b', 'c'); 33b3d24bf8Sdanielk1977 CREATE VIRTUAL TABLE techo USING echo(treal); 34b3d24bf8Sdanielk1977 } 35b3d24bf8Sdanielk1977} {} 36b3d24bf8Sdanielk1977do_test vtab5.1.2 { 37b3d24bf8Sdanielk1977 execsql { 3870b6d573Sdanielk1977 SELECT * FROM techo; 39b3d24bf8Sdanielk1977 } 40b3d24bf8Sdanielk1977} {a b c} 41b3d24bf8Sdanielk1977do_test vtab5.1.3 { 42b3d24bf8Sdanielk1977 db close 43b3d24bf8Sdanielk1977 sqlite3 db test.db 44b3d24bf8Sdanielk1977 register_echo_module [sqlite3_connection_pointer db] 45b3d24bf8Sdanielk1977 execsql { 46b3d24bf8Sdanielk1977 INSERT INTO techo VALUES('c', 'd', 'e'); 47b3d24bf8Sdanielk1977 SELECT * FROM techo; 48b3d24bf8Sdanielk1977 } 49b3d24bf8Sdanielk1977} {a b c c d e} 50b3d24bf8Sdanielk1977do_test vtab5.1.4 { 51b3d24bf8Sdanielk1977 db close 52b3d24bf8Sdanielk1977 sqlite3 db test.db 53b3d24bf8Sdanielk1977 register_echo_module [sqlite3_connection_pointer db] 54b3d24bf8Sdanielk1977 execsql { 55b3d24bf8Sdanielk1977 UPDATE techo SET a = 10; 56b3d24bf8Sdanielk1977 SELECT * FROM techo; 57b3d24bf8Sdanielk1977 } 58b3d24bf8Sdanielk1977} {10 b c 10 d e} 59b3d24bf8Sdanielk1977do_test vtab5.1.5 { 60b3d24bf8Sdanielk1977 db close 61b3d24bf8Sdanielk1977 sqlite3 db test.db 62b3d24bf8Sdanielk1977 register_echo_module [sqlite3_connection_pointer db] 63b3d24bf8Sdanielk1977 execsql { 64b3d24bf8Sdanielk1977 DELETE FROM techo WHERE b > 'c'; 65b3d24bf8Sdanielk1977 SELECT * FROM techo; 66b3d24bf8Sdanielk1977 } 67b3d24bf8Sdanielk1977} {10 b c} 68b8cbb872Sdanielk1977do_test vtab5.1.X { 69b8cbb872Sdanielk1977 execsql { 70b8cbb872Sdanielk1977 DROP TABLE techo; 71b8cbb872Sdanielk1977 DROP TABLE treal; 72b8cbb872Sdanielk1977 } 73b8cbb872Sdanielk1977} {} 74b8cbb872Sdanielk1977 75b8cbb872Sdanielk1977# The following tests - vtab5-2.* - ensure that collation sequences 76b8cbb872Sdanielk1977# assigned to virtual table columns via the "CREATE TABLE" statement 77b8cbb872Sdanielk1977# passed to sqlite3_declare_vtab() are used correctly. 78b8cbb872Sdanielk1977# 79b8cbb872Sdanielk1977do_test vtab5.2.1 { 80b8cbb872Sdanielk1977 execsql { 81b8cbb872Sdanielk1977 CREATE TABLE strings(str COLLATE NOCASE); 82b8cbb872Sdanielk1977 INSERT INTO strings VALUES('abc1'); 83b8cbb872Sdanielk1977 INSERT INTO strings VALUES('Abc3'); 84b8cbb872Sdanielk1977 INSERT INTO strings VALUES('ABc2'); 85b8cbb872Sdanielk1977 INSERT INTO strings VALUES('aBc4'); 86b8cbb872Sdanielk1977 SELECT str FROM strings ORDER BY 1; 87b8cbb872Sdanielk1977 } 88b8cbb872Sdanielk1977} {abc1 ABc2 Abc3 aBc4} 89b8cbb872Sdanielk1977do_test vtab5.2.2 { 90b8cbb872Sdanielk1977 execsql { 91b8cbb872Sdanielk1977 CREATE VIRTUAL TABLE echo_strings USING echo(strings); 92b8cbb872Sdanielk1977 SELECT str FROM echo_strings ORDER BY 1; 93b8cbb872Sdanielk1977 } 94b8cbb872Sdanielk1977} {abc1 ABc2 Abc3 aBc4} 95b8cbb872Sdanielk1977do_test vtab5.2.3 { 96b8cbb872Sdanielk1977 execsql { 97b8cbb872Sdanielk1977 SELECT str||'' FROM echo_strings ORDER BY 1; 98b8cbb872Sdanielk1977 } 99b8cbb872Sdanielk1977} {ABc2 Abc3 aBc4 abc1} 100b3d24bf8Sdanielk1977 1013d5ff1c2Sdanielk1977# Test that it is impossible to create a triggger on a virtual table. 1023d5ff1c2Sdanielk1977# 1034b2688abSdanielk1977ifcapable trigger { 1043d5ff1c2Sdanielk1977 do_test vtab5.3.1 { 1053d5ff1c2Sdanielk1977 catchsql { 1063d5ff1c2Sdanielk1977 CREATE TRIGGER trig INSTEAD OF INSERT ON echo_strings BEGIN 1073d5ff1c2Sdanielk1977 SELECT 1, 2, 3; 1083d5ff1c2Sdanielk1977 END; 1093d5ff1c2Sdanielk1977 } 1103d5ff1c2Sdanielk1977 } {1 {cannot create triggers on virtual tables}} 1113d5ff1c2Sdanielk1977 do_test vtab5.3.2 { 1123d5ff1c2Sdanielk1977 catchsql { 1133d5ff1c2Sdanielk1977 CREATE TRIGGER trig AFTER INSERT ON echo_strings BEGIN 1143d5ff1c2Sdanielk1977 SELECT 1, 2, 3; 1153d5ff1c2Sdanielk1977 END; 1163d5ff1c2Sdanielk1977 } 1173d5ff1c2Sdanielk1977 } {1 {cannot create triggers on virtual tables}} 1183d5ff1c2Sdanielk1977 do_test vtab5.3.2 { 1193d5ff1c2Sdanielk1977 catchsql { 1203d5ff1c2Sdanielk1977 CREATE TRIGGER trig BEFORE INSERT ON echo_strings BEGIN 1213d5ff1c2Sdanielk1977 SELECT 1, 2, 3; 1223d5ff1c2Sdanielk1977 END; 1233d5ff1c2Sdanielk1977 } 1243d5ff1c2Sdanielk1977 } {1 {cannot create triggers on virtual tables}} 1254b2688abSdanielk1977} 1263d5ff1c2Sdanielk1977 1275ee9d697Sdanielk1977# Test that it is impossible to create an index on a virtual table. 1285ee9d697Sdanielk1977# 1295ee9d697Sdanielk1977do_test vtab5.4.1 { 1305ee9d697Sdanielk1977 catchsql { 1315ee9d697Sdanielk1977 CREATE INDEX echo_strings_i ON echo_strings(str); 1325ee9d697Sdanielk1977 } 1335ee9d697Sdanielk1977} {1 {virtual tables may not be indexed}} 1345ee9d697Sdanielk1977 1355ee9d697Sdanielk1977# Test that it is impossible to add a column to a virtual table. 1365ee9d697Sdanielk1977# 137*856ef1a5Sdanifcapable altertable { 1385ee9d697Sdanielk1977 do_test vtab5.4.2 { 1395ee9d697Sdanielk1977 catchsql { 1405ee9d697Sdanielk1977 ALTER TABLE echo_strings ADD COLUMN col2; 1415ee9d697Sdanielk1977 } 1425ee9d697Sdanielk1977 } {1 {virtual tables may not be altered}} 143*856ef1a5Sdan} 1445ee9d697Sdanielk1977 145182c4ba9Sdanielk1977# Test that it is impossible to rename a virtual table. 146182c4ba9Sdanielk1977# UPDATE: It is now possible. 1475ee9d697Sdanielk1977# 148182c4ba9Sdanielk1977# do_test vtab5.4.3 { 149182c4ba9Sdanielk1977# catchsql { 150182c4ba9Sdanielk1977# ALTER TABLE echo_strings RENAME TO echo_strings2; 151182c4ba9Sdanielk1977# } 152182c4ba9Sdanielk1977# } {1 {virtual tables may not be altered}} 1535ee9d697Sdanielk1977 154b3d24bf8Sdanielk1977finish_test 155