From 7bb481fda9ecb134804b49c2ce77ca28f7eea583 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 30 Mar 2012 20:42:12 -0400 Subject: Imported Upstream version 2.0.3 --- test/vtabA.test | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 test/vtabA.test (limited to 'test/vtabA.test') diff --git a/test/vtabA.test b/test/vtabA.test new file mode 100644 index 0000000..928cc2b --- /dev/null +++ b/test/vtabA.test @@ -0,0 +1,153 @@ +# 2007 June 26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is 'hidden' virtual table columns. +# +# $Id: vtabA.test,v 1.2 2008/07/12 14:52:21 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !vtab { + finish_test + return +} + +proc get_decltype {table col} { + set STMT [sqlite3_prepare $::DB "SELECT $col FROM $table" -1 TAIL] + set decltype [sqlite3_column_decltype $STMT 0] + sqlite3_finalize $STMT + set decltype +} + +proc get_collist {table} { + set ret [list] + db eval "PRAGMA table_info($table)" { lappend ret $name } + set ret +} + +# Register the echo module +register_echo_module [sqlite3_connection_pointer db] + +# Create a virtual table with a 'hidden' column (column b). +# +do_test vtabA-1.1 { + execsql { CREATE TABLE t1(a, b HIDDEN VARCHAR, c INTEGER) } +} {} +do_test vtabA-1.2 { + execsql { CREATE VIRTUAL TABLE t1e USING echo(t1) } +} {} + +# Test that the hidden column is not listed by [PRAGMA table_info]. +# +do_test vtabA-1.3 { + execsql { PRAGMA table_info(t1e) } +} [list \ + 0 a {} 0 {} 0 \ + 1 c INTEGER 0 {} 0 \ +] + +# Test that the hidden column is not require in the default column +# list for an INSERT statement. +# +do_test vtabA-1.4 { + catchsql { + INSERT INTO t1e VALUES('value a', 'value c'); + } +} {0 {}} +do_test vtabA-1.5 { + execsql { + SELECT a, b, c FROM t1e; + } +} {{value a} {} {value c}} + +do_test vtabA-1.6 { + execsql { + SELECT * FROM t1e; + } +} {{value a} {value c}} + +# Test that the expansion of a '*' expression in the result set of +# a SELECT does not include the hidden column. +# +do_test vtabA-1.7 { + execsql { + INSERT INTO t1e SELECT * FROM t1e; + } +} {} +do_test vtabA-1.8 { + execsql { + SELECT * FROM t1e; + } +} {{value a} {value c} {value a} {value c}} + +# Test that the declaration type of the hidden column does not include +# the token "HIDDEN". +# +do_test vtabA-1.9 { + get_decltype t1e b +} {VARCHAR} +do_test vtabA-1.10 { + get_collist t1e +} {a c} + +#---------------------------------------------------------------------- +# These tests vtabA-2.* concentrate on testing that the HIDDEN token +# is detected and handled correctly in various declarations. +# +proc analyse_parse {columns decltype_list} { + db eval { DROP TABLE IF EXISTS t1e; } + db eval { DROP TABLE IF EXISTS t1; } + db eval " CREATE TABLE t1 $columns " + db eval { CREATE VIRTUAL TABLE t1e USING echo(t1) } + set ret [list [get_collist t1e]] + foreach c $decltype_list { + lappend ret [get_decltype t1e $c] + } + set ret +} + +do_test vtabA-2.1 { + analyse_parse {(a text, b integer hidden, c hidden)} {a b c} +} {a text integer {}} + +do_test vtabA-2.2 { + analyse_parse {(a hidden , b integerhidden, c hidden1)} {a b c} +} {{b c} {} integerhidden hidden1} + +do_test vtabA-2.3 { + analyse_parse {(a HiDden, b HIDDEN, c hidden)} {a b c} +} {{} {} {} {}} + +do_test vtabA-2.4 { + analyse_parse {(a whatelse can i hidden test, b HIDDEN hidden)} {a b} +} {{} {whatelse can i test} hidden} + + +# Ticket [d2f02d37f52bfe23e421f2c60fbb8586ac76ff01]: +# assertion failure on an UPDATE involving two virtual tables. +# +do_test vtabA-3.1 { + db eval { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,2); + CREATE TABLE t2(x,y); + INSERT INTO t2 VALUES(3,4); + CREATE VIRTUAL TABLE vt1 USING echo(t1); + CREATE VIRTUAL TABLE vt2 USING echo(t2); + UPDATE vt2 SET x=(SELECT a FROM vt1 WHERE b=2) WHERE y=4; + SELECT * FROM t2; + } +} {1 4} + +finish_test -- cgit v1.2.3