14dd176eaSdrh# 2017-08-10 24dd176eaSdrh# 34dd176eaSdrh# The author disclaims copyright to this source code. In place of 44dd176eaSdrh# a legal notice, here is a blessing: 54dd176eaSdrh# 64dd176eaSdrh# May you do good and not evil. 74dd176eaSdrh# May you find forgiveness for yourself and forgive others. 84dd176eaSdrh# May you share freely, never taking more than you give. 94dd176eaSdrh# 104dd176eaSdrh#*********************************************************************** 114dd176eaSdrh# This file implements tests of writing to WITHOUT ROWID virtual tables 124dd176eaSdrh# using the tclvar eponymous virtual table. 134dd176eaSdrh# 144dd176eaSdrh 154dd176eaSdrhset testdir [file dirname $argv0] 164dd176eaSdrhsource $testdir/tester.tcl 174dd176eaSdrhset testprefix vtabJ 184dd176eaSdrh 194dd176eaSdrhifcapable !vtab { 204dd176eaSdrh finish_test 214dd176eaSdrh return 224dd176eaSdrh} 234dd176eaSdrh 244dd176eaSdrhregister_tclvar_module db 254dd176eaSdrh 264dd176eaSdrhunset -nocomplain vtabJ 274dd176eaSdrhdo_test 100 { 284dd176eaSdrh set vtabJ(1) this 294dd176eaSdrh set vtabJ(two) is 304dd176eaSdrh set vtabJ(3) {a test} 314dd176eaSdrh db eval { 324dd176eaSdrh SELECT fullname, value FROM tclvar WHERE name='vtabJ' ORDER BY fullname; 334dd176eaSdrh } 344dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(two) is} 354dd176eaSdrh 364dd176eaSdrhdo_execsql_test 110 { 374dd176eaSdrh INSERT INTO tclvar(fullname, value) 384dd176eaSdrh VALUES('vtabJ(4)',4),('vtabJ(five)',555); 394dd176eaSdrh SELECT fullname, value FROM tclvar WHERE name='vtabJ' ORDER BY fullname; 404dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(4) 4 vtabJ(five) 555 vtabJ(two) is} 414dd176eaSdrhdo_test 111 { 424dd176eaSdrh set res {} 434dd176eaSdrh foreach vname [lsort [array names vtabJ]] { 444dd176eaSdrh lappend res vtabJ($vname) $vtabJ($vname) 454dd176eaSdrh } 464dd176eaSdrh set res 474dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(4) 4 vtabJ(five) 555 vtabJ(two) is} 484dd176eaSdrh 494dd176eaSdrhdo_test 120 { 504dd176eaSdrh db eval { 514dd176eaSdrh INSERT INTO tclvar(fullname, value) VALUES('vtabJ(4)',444); 524dd176eaSdrh } 534dd176eaSdrh set vtabJ(4) 544dd176eaSdrh} {444} 554dd176eaSdrh 564dd176eaSdrhdo_test 130 { 574dd176eaSdrh db eval { 584dd176eaSdrh INSERT INTO tclvar(fullname, value) VALUES('vtabJ(4)',NULL); 594dd176eaSdrh } 604dd176eaSdrh info exists vtabJ(4) 614dd176eaSdrh} {0} 624dd176eaSdrh 634dd176eaSdrhdo_test 140 { 644dd176eaSdrh db eval { 654dd176eaSdrh UPDATE tclvar SET value=55 WHERE fullname='vtabJ(five)'; 664dd176eaSdrh } 674dd176eaSdrh set vtabJ(five) 684dd176eaSdrh} {55} 694dd176eaSdrh 704dd176eaSdrhdo_test 150 { 714dd176eaSdrh db eval { 724dd176eaSdrh UPDATE tclvar SET fullname='vtabJ(5)' WHERE fullname='vtabJ(five)'; 734dd176eaSdrh } 744dd176eaSdrh set vtabJ(5) 754dd176eaSdrh} {55} 764dd176eaSdrhdo_test 151 { 774dd176eaSdrh info exists vtabJ(five) 784dd176eaSdrh} {0} 794dd176eaSdrhdo_test 152 { 804dd176eaSdrh set res {} 814dd176eaSdrh foreach vname [lsort [array names vtabJ]] { 824dd176eaSdrh lappend res vtabJ($vname) $vtabJ($vname) 834dd176eaSdrh } 844dd176eaSdrh set res 854dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(5) 55 vtabJ(two) is} 864dd176eaSdrh 874dd176eaSdrhdo_execsql_test 160 { 884dd176eaSdrh SELECT fullname FROM tclvar WHERE arrayname='two' 894dd176eaSdrh} {vtabJ(two)} 904dd176eaSdrhdo_execsql_test 161 { 914dd176eaSdrh DELETE FROM tclvar WHERE arrayname='two'; 924dd176eaSdrh SELECT fullname, value FROM tclvar WHERE name='vtabJ' ORDER BY fullname; 934dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(5) 55} 944dd176eaSdrhdo_test 162 { 954dd176eaSdrh set res {} 964dd176eaSdrh foreach vname [lsort [array names vtabJ]] { 974dd176eaSdrh lappend res vtabJ($vname) $vtabJ($vname) 984dd176eaSdrh } 994dd176eaSdrh set res 1004dd176eaSdrh} {vtabJ(1) this vtabJ(3) {a test} vtabJ(5) 55} 1014dd176eaSdrh 10209fc79bdSdan# Try to trick the module into updating the same variable twice for a 10309fc79bdSdan# single UPDATE statement. 10409fc79bdSdan# 10509fc79bdSdando_execsql_test 171 { 10609fc79bdSdan INSERT INTO tclvar(fullname, value) VALUES('xx', 'a'); 10709fc79bdSdan SELECT name, value FROM tclvar where name = 'xx'; 10809fc79bdSdan} {xx a} 10909fc79bdSdando_execsql_test 172 { 11009fc79bdSdan UPDATE tclvar SET value = value || 't' 11109fc79bdSdan WHERE name = 'xx' OR name = 'x'||'x'; 11209fc79bdSdan SELECT name, value FROM tclvar where name = 'xx'; 11309fc79bdSdan} {xx at} 11409fc79bdSdando_execsql_test 173 { 11509fc79bdSdan UPDATE tclvar SET value = value || 't' 11609fc79bdSdan WHERE name = 'xx' OR name BETWEEN 'xx' AND 'xx'; 11709fc79bdSdan SELECT name, value FROM tclvar where name = 'xx'; 11809fc79bdSdan} {xx att} 11909fc79bdSdan 12009fc79bdSdando_execsql_test 181 { 12109fc79bdSdan DELETE FROM tclvar WHERE name BETWEEN 'xx' AND 'xx' OR name='xx'; 12209fc79bdSdan SELECT name, value FROM tclvar where name = 'xx'; 12309fc79bdSdan} {} 12409fc79bdSdan 125*4d906f1bSdan#------------------------------------------------------------------------- 126*4d906f1bSdan 127*4d906f1bSdando_execsql_test 200 { 128*4d906f1bSdan CREATE TABLE var(k TEXT, v TEXT); 129*4d906f1bSdan INSERT INTO var VALUES('testvar1', 10); 130*4d906f1bSdan INSERT INTO var VALUES('testvar2', 20); 131*4d906f1bSdan INSERT INTO var VALUES('testvar3', 30); 132*4d906f1bSdan} 133*4d906f1bSdan 134*4d906f1bSdando_test 210 { 135*4d906f1bSdan foreach {testvar1 testvar2 testvar3} {1 2 3} {} 136*4d906f1bSdan execsql { 137*4d906f1bSdan UPDATE tclvar SET value = var.v FROM var WHERE name = var.k; 138*4d906f1bSdan } 139*4d906f1bSdan list $testvar1 $testvar2 $testvar3 140*4d906f1bSdan} {10 20 30} 141*4d906f1bSdan 142*4d906f1bSdando_test 220 { 143*4d906f1bSdan execsql { 144*4d906f1bSdan CREATE TABLE nam(k TEXT, v TEXT); 145*4d906f1bSdan INSERT INTO nam VALUES('testvar1', 'tv1'); 146*4d906f1bSdan INSERT INTO nam VALUES('testvar2', 'tv2'); 147*4d906f1bSdan INSERT INTO nam VALUES('testvar3', 'tv3'); 148*4d906f1bSdan UPDATE tclvar SET fullname = nam.v FROM nam WHERE name = nam.k; 149*4d906f1bSdan } 150*4d906f1bSdan list $tv1 $tv2 $tv3 151*4d906f1bSdan} {10 20 30} 152*4d906f1bSdan 15309fc79bdSdan 1544dd176eaSdrhfinish_test 155