1034ca14fSdanielk1977# 2007 June 26 2034ca14fSdanielk1977# 3034ca14fSdanielk1977# The author disclaims copyright to this source code. In place of 4034ca14fSdanielk1977# a legal notice, here is a blessing: 5034ca14fSdanielk1977# 6034ca14fSdanielk1977# May you do good and not evil. 7034ca14fSdanielk1977# May you find forgiveness for yourself and forgive others. 8034ca14fSdanielk1977# May you share freely, never taking more than you give. 9034ca14fSdanielk1977# 10034ca14fSdanielk1977#*********************************************************************** 11034ca14fSdanielk1977# This file implements regression tests for SQLite library. The 12034ca14fSdanielk1977# focus of this file is 'hidden' virtual table columns. 13034ca14fSdanielk1977# 14e8f52c50Sdrh# $Id: vtabA.test,v 1.2 2008/07/12 14:52:21 drh Exp $ 15034ca14fSdanielk1977 16034ca14fSdanielk1977set testdir [file dirname $argv0] 17034ca14fSdanielk1977source $testdir/tester.tcl 18034ca14fSdanielk1977 19034ca14fSdanielk1977ifcapable !vtab { 20034ca14fSdanielk1977 finish_test 21034ca14fSdanielk1977 return 22034ca14fSdanielk1977} 23034ca14fSdanielk1977 24034ca14fSdanielk1977proc get_decltype {table col} { 25034ca14fSdanielk1977 set STMT [sqlite3_prepare $::DB "SELECT $col FROM $table" -1 TAIL] 26034ca14fSdanielk1977 set decltype [sqlite3_column_decltype $STMT 0] 27034ca14fSdanielk1977 sqlite3_finalize $STMT 28034ca14fSdanielk1977 set decltype 29034ca14fSdanielk1977} 30034ca14fSdanielk1977 31034ca14fSdanielk1977proc get_collist {table} { 32034ca14fSdanielk1977 set ret [list] 33034ca14fSdanielk1977 db eval "PRAGMA table_info($table)" { lappend ret $name } 34034ca14fSdanielk1977 set ret 35034ca14fSdanielk1977} 36034ca14fSdanielk1977 37034ca14fSdanielk1977# Register the echo module 38034ca14fSdanielk1977register_echo_module [sqlite3_connection_pointer db] 39034ca14fSdanielk1977 40034ca14fSdanielk1977# Create a virtual table with a 'hidden' column (column b). 41034ca14fSdanielk1977# 42034ca14fSdanielk1977do_test vtabA-1.1 { 43034ca14fSdanielk1977 execsql { CREATE TABLE t1(a, b HIDDEN VARCHAR, c INTEGER) } 44034ca14fSdanielk1977} {} 45034ca14fSdanielk1977do_test vtabA-1.2 { 46034ca14fSdanielk1977 execsql { CREATE VIRTUAL TABLE t1e USING echo(t1) } 47034ca14fSdanielk1977} {} 48034ca14fSdanielk1977 49034ca14fSdanielk1977# Test that the hidden column is not listed by [PRAGMA table_info]. 50034ca14fSdanielk1977# 51034ca14fSdanielk1977do_test vtabA-1.3 { 52034ca14fSdanielk1977 execsql { PRAGMA table_info(t1e) } 53034ca14fSdanielk1977} [list \ 54034ca14fSdanielk1977 0 a {} 0 {} 0 \ 55034ca14fSdanielk1977 1 c INTEGER 0 {} 0 \ 56034ca14fSdanielk1977] 57034ca14fSdanielk1977 58034ca14fSdanielk1977# Test that the hidden column is not require in the default column 59034ca14fSdanielk1977# list for an INSERT statement. 60034ca14fSdanielk1977# 61034ca14fSdanielk1977do_test vtabA-1.4 { 62034ca14fSdanielk1977 catchsql { 63034ca14fSdanielk1977 INSERT INTO t1e VALUES('value a', 'value c'); 64034ca14fSdanielk1977 } 65034ca14fSdanielk1977} {0 {}} 66034ca14fSdanielk1977do_test vtabA-1.5 { 67034ca14fSdanielk1977 execsql { 68034ca14fSdanielk1977 SELECT a, b, c FROM t1e; 69034ca14fSdanielk1977 } 70034ca14fSdanielk1977} {{value a} {} {value c}} 71034ca14fSdanielk1977 72034ca14fSdanielk1977do_test vtabA-1.6 { 73034ca14fSdanielk1977 execsql { 74034ca14fSdanielk1977 SELECT * FROM t1e; 75034ca14fSdanielk1977 } 76034ca14fSdanielk1977} {{value a} {value c}} 77a21f78b9Sdrhdo_execsql_test vtabA-1.7 { 78a21f78b9Sdrh DELETE FROM t1e; 79a21f78b9Sdrh INSERT INTO t1e SELECT 'abc','def'; 80a21f78b9Sdrh} {} 81a21f78b9Sdrhdo_execsql_test vtabA-1.8 { 82a21f78b9Sdrh INSERT INTO t1e VALUES('ghi','jkl'),('mno','pqr'),('stu','vwx'); 83a21f78b9Sdrh} {} 84a21f78b9Sdrhdo_execsql_test vtabA-1.9 { 85a21f78b9Sdrh SELECT a,b,c, '|' FROM t1e ORDER BY 1; 86a21f78b9Sdrh} {abc {} def | ghi {} jkl | mno {} pqr | stu {} vwx |} 87a21f78b9Sdrh 88034ca14fSdanielk1977 89034ca14fSdanielk1977# Test that the expansion of a '*' expression in the result set of 90034ca14fSdanielk1977# a SELECT does not include the hidden column. 91034ca14fSdanielk1977# 92a21f78b9Sdrhdo_test vtabA-1.20 { 93034ca14fSdanielk1977 execsql { 94034ca14fSdanielk1977 INSERT INTO t1e SELECT * FROM t1e; 95034ca14fSdanielk1977 } 96034ca14fSdanielk1977} {} 97a21f78b9Sdrhdo_test vtabA-1.21 { 98034ca14fSdanielk1977 execsql { 99a21f78b9Sdrh SELECT * FROM t1e ORDER BY 1; 100034ca14fSdanielk1977 } 101a21f78b9Sdrh} {abc def abc def ghi jkl ghi jkl mno pqr mno pqr stu vwx stu vwx} 102034ca14fSdanielk1977 103034ca14fSdanielk1977# Test that the declaration type of the hidden column does not include 104034ca14fSdanielk1977# the token "HIDDEN". 105034ca14fSdanielk1977# 106a21f78b9Sdrhdo_test vtabA-1.22 { 107034ca14fSdanielk1977 get_decltype t1e b 108034ca14fSdanielk1977} {VARCHAR} 109a21f78b9Sdrhdo_test vtabA-1.23 { 110034ca14fSdanielk1977 get_collist t1e 111034ca14fSdanielk1977} {a c} 112034ca14fSdanielk1977 113034ca14fSdanielk1977#---------------------------------------------------------------------- 114034ca14fSdanielk1977# These tests vtabA-2.* concentrate on testing that the HIDDEN token 115034ca14fSdanielk1977# is detected and handled correctly in various declarations. 116034ca14fSdanielk1977# 117034ca14fSdanielk1977proc analyse_parse {columns decltype_list} { 118034ca14fSdanielk1977 db eval { DROP TABLE IF EXISTS t1e; } 119034ca14fSdanielk1977 db eval { DROP TABLE IF EXISTS t1; } 120034ca14fSdanielk1977 db eval " CREATE TABLE t1 $columns " 121034ca14fSdanielk1977 db eval { CREATE VIRTUAL TABLE t1e USING echo(t1) } 122034ca14fSdanielk1977 set ret [list [get_collist t1e]] 123034ca14fSdanielk1977 foreach c $decltype_list { 124034ca14fSdanielk1977 lappend ret [get_decltype t1e $c] 125034ca14fSdanielk1977 } 126034ca14fSdanielk1977 set ret 127034ca14fSdanielk1977} 128034ca14fSdanielk1977 129034ca14fSdanielk1977do_test vtabA-2.1 { 130034ca14fSdanielk1977 analyse_parse {(a text, b integer hidden, c hidden)} {a b c} 131*c2df4d6aSdrh} {a TEXT integer {}} 132034ca14fSdanielk1977 133034ca14fSdanielk1977do_test vtabA-2.2 { 134034ca14fSdanielk1977 analyse_parse {(a hidden , b integerhidden, c hidden1)} {a b c} 135034ca14fSdanielk1977} {{b c} {} integerhidden hidden1} 136034ca14fSdanielk1977 137034ca14fSdanielk1977do_test vtabA-2.3 { 138034ca14fSdanielk1977 analyse_parse {(a HiDden, b HIDDEN, c hidden)} {a b c} 139034ca14fSdanielk1977} {{} {} {} {}} 140034ca14fSdanielk1977 141034ca14fSdanielk1977do_test vtabA-2.4 { 142034ca14fSdanielk1977 analyse_parse {(a whatelse can i hidden test, b HIDDEN hidden)} {a b} 143034ca14fSdanielk1977} {{} {whatelse can i test} hidden} 144034ca14fSdanielk1977 1455a29d9cbSdrh 1465a29d9cbSdrh# Ticket [d2f02d37f52bfe23e421f2c60fbb8586ac76ff01]: 1475a29d9cbSdrh# assertion failure on an UPDATE involving two virtual tables. 1485a29d9cbSdrh# 1495a29d9cbSdrhdo_test vtabA-3.1 { 1505a29d9cbSdrh db eval { 1515a29d9cbSdrh DROP TABLE IF EXISTS t1; 1525a29d9cbSdrh DROP TABLE IF EXISTS t2; 1535a29d9cbSdrh CREATE TABLE t1(a,b); 1545a29d9cbSdrh INSERT INTO t1 VALUES(1,2); 1555a29d9cbSdrh CREATE TABLE t2(x,y); 1565a29d9cbSdrh INSERT INTO t2 VALUES(3,4); 1575a29d9cbSdrh CREATE VIRTUAL TABLE vt1 USING echo(t1); 1585a29d9cbSdrh CREATE VIRTUAL TABLE vt2 USING echo(t2); 1595a29d9cbSdrh UPDATE vt2 SET x=(SELECT a FROM vt1 WHERE b=2) WHERE y=4; 1605a29d9cbSdrh SELECT * FROM t2; 1615a29d9cbSdrh } 1625a29d9cbSdrh} {1 4} 1635a29d9cbSdrh 164034ca14fSdanielk1977finish_test 165