| # 2020 February 24 | |
| # | |
| # 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 script is testing UPDATE statements with FROM clauses | |
| # against FTS4 tables. | |
| # | |
| # | |
| set testdir [file dirname $argv0] | |
| source $testdir/tester.tcl | |
| set testprefix fts4upfrom | |
| # If SQLITE_ENABLE_FTS3 is defined, omit this file. | |
| ifcapable !fts3 { | |
| finish_test | |
| return | |
| } | |
| foreach {tn create_table} { | |
| 0 { CREATE VIRTUAL TABLE ft USING fts5(a, b, c) } | |
| 1 { CREATE VIRTUAL TABLE ft USING fts3(a, b, c) } | |
| 2 { CREATE TABLE ft(a, b, c) } | |
| 3 { | |
| CREATE TABLE real(a, b, c); | |
| CREATE INDEX i1 ON real(a); | |
| CREATE VIEW ft AS SELECT rowid, a, b, c FROM real; | |
| CREATE TRIGGER tr1 INSTEAD OF INSERT ON ft BEGIN | |
| INSERT INTO real(rowid, a, b, c) VALUES(new.rowid, new.a, new.b, new.c); | |
| END; | |
| CREATE TRIGGER tr2 INSTEAD OF UPDATE ON ft BEGIN | |
| UPDATE real SET rowid=new.rowid, a=new.a, b=new.b, c=new.c | |
| WHERE rowid=old.rowid; | |
| END; | |
| } | |
| } { | |
| if {$tn==0} { ifcapable !fts5 { continue } } | |
| catchsql { DROP VIEW IF EXISTS changes } | |
| catchsql { DROP TABLE IF EXISTS ft } | |
| catchsql { DROP VIEW IF EXISTS ft } | |
| execsql $create_table | |
| do_execsql_test 1.$tn.0 { | |
| INSERT INTO ft(a, b, c) VALUES('a', NULL, 'apple'); | |
| INSERT INTO ft(a, b, c) VALUES('b', NULL, 'banana'); | |
| INSERT INTO ft(a, b, c) VALUES('c', NULL, 'cherry'); | |
| INSERT INTO ft(a, b, c) VALUES('d', NULL, 'damson plum'); | |
| } | |
| do_execsql_test 1.$tn.1 { | |
| SELECT a, b, c FROM ft ORDER BY rowid; | |
| } { | |
| a {} apple | |
| b {} banana | |
| c {} cherry | |
| d {} {damson plum} | |
| } | |
| do_execsql_test 1.$tn.2 { | |
| UPDATE ft SET b=o.c FROM ft AS o WHERE (ft.a == char(unicode(o.a)+1)) | |
| } | |
| do_execsql_test 1.$tn.3 { | |
| SELECT a, b, c FROM ft ORDER BY rowid; | |
| } { | |
| a {} apple | |
| b apple banana | |
| c banana cherry | |
| d cherry {damson plum} | |
| } | |
| do_catchsql_test 1.$tn.4 { | |
| UPDATE ft SET c=v FROM changes WHERE a=k; | |
| } {1 {no such table: changes}} | |
| do_execsql_test 1.$tn.5 { | |
| create view changes(k, v) AS | |
| VALUES( 'd', 'dewberry' ) UNION ALL | |
| VALUES( 'c', 'clementine' ) UNION ALL | |
| VALUES( 'b', 'blueberry' ) UNION ALL | |
| VALUES( 'a', 'apricot' ) | |
| ; | |
| } | |
| do_execsql_test 1.$tn.6 { | |
| UPDATE ft SET c=v FROM changes WHERE a=k; | |
| } | |
| do_execsql_test 1.$tn.7 { | |
| SELECT rowid, a, b, c FROM ft ORDER BY rowid; | |
| } { | |
| 1 a {} apricot | |
| 2 b apple blueberry | |
| 3 c banana clementine | |
| 4 d cherry dewberry | |
| } | |
| do_execsql_test 1.$tn.8 " | |
| WITH x1(o, n) AS ( | |
| VALUES(1, 11) UNION ALL | |
| VALUES(2, 12) UNION ALL | |
| VALUES(3, 13) UNION ALL | |
| VALUES(4, 14) | |
| ) | |
| SELECT ft.rowid, a, b, c, o, n FROM ft, x1 WHERE ft.rowid = o; | |
| " { | |
| 1 a {} apricot 1 11 | |
| 2 b apple blueberry 2 12 | |
| 3 c banana clementine 3 13 | |
| 4 d cherry dewberry 4 14 | |
| } | |
| set ROWID rowid | |
| if {$tn==1} { set ROWID docid } | |
| do_execsql_test 1.$tn.9 " | |
| WITH x1(o, n) AS ( | |
| VALUES(1, 11) UNION ALL | |
| VALUES(2, 12) UNION ALL | |
| VALUES(3, 13) UNION ALL | |
| VALUES(4, 14) | |
| ) | |
| UPDATE ft SET $ROWID = n FROM x1 WHERE ft.rowid = o; | |
| SELECT rowid, a, b, c FROM ft ORDER BY rowid; | |
| " { | |
| 11 a {} apricot | |
| 12 b apple blueberry | |
| 13 c banana clementine | |
| 14 d cherry dewberry | |
| } | |
| } | |
| finish_test | |