xref: /sqlite-3.40.0/test/vtabJ.test (revision 4d906f1b)
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