1b19a2bc6Sdrh# 2001 September 15 262c68191Sdrh# 3b19a2bc6Sdrh# The author disclaims copyright to this source code. In place of 4b19a2bc6Sdrh# a legal notice, here is a blessing: 562c68191Sdrh# 6b19a2bc6Sdrh# May you do good and not evil. 7b19a2bc6Sdrh# May you find forgiveness for yourself and forgive others. 8b19a2bc6Sdrh# May you share freely, never taking more than you give. 962c68191Sdrh# 1062c68191Sdrh#*********************************************************************** 1162c68191Sdrh# This file implements regression tests for SQLite library. The 1262c68191Sdrh# focus of this file is testing the DELETE FROM statement. 1362c68191Sdrh# 14dda70fe3Sdrh# $Id: delete.test,v 1.26 2009/06/05 17:09:12 drh Exp $ 1562c68191Sdrh 1662c68191Sdrhset testdir [file dirname $argv0] 1762c68191Sdrhsource $testdir/tester.tcl 1862c68191Sdrh 1962c68191Sdrh# Try to delete from a non-existant table. 2062c68191Sdrh# 2162c68191Sdrhdo_test delete-1.1 { 2262c68191Sdrh set v [catch {execsql {DELETE FROM test1}} msg] 2362c68191Sdrh lappend v $msg 2462c68191Sdrh} {1 {no such table: test1}} 2562c68191Sdrh 2662c68191Sdrh# Try to delete from sqlite_master 2762c68191Sdrh# 2862c68191Sdrhdo_test delete-2.1 { 2962c68191Sdrh set v [catch {execsql {DELETE FROM sqlite_master}} msg] 3062c68191Sdrh lappend v $msg 311d37e284Sdrh} {1 {table sqlite_master may not be modified}} 3262c68191Sdrh 337020f651Sdrh# Delete selected entries from a table with and without an index. 347020f651Sdrh# 351bee3d7bSdrhdo_test delete-3.1.1 { 367020f651Sdrh execsql {CREATE TABLE table1(f1 int, f2 int)} 377020f651Sdrh execsql {INSERT INTO table1 VALUES(1,2)} 387020f651Sdrh execsql {INSERT INTO table1 VALUES(2,4)} 397020f651Sdrh execsql {INSERT INTO table1 VALUES(3,8)} 407020f651Sdrh execsql {INSERT INTO table1 VALUES(4,16)} 417020f651Sdrh execsql {SELECT * FROM table1 ORDER BY f1} 427020f651Sdrh} {1 2 2 4 3 8 4 16} 431bee3d7bSdrhdo_test delete-3.1.2 { 447020f651Sdrh execsql {DELETE FROM table1 WHERE f1=3} 451bee3d7bSdrh} {} 461bee3d7bSdrhdo_test delete-3.1.3 { 477020f651Sdrh execsql {SELECT * FROM table1 ORDER BY f1} 487020f651Sdrh} {1 2 2 4 4 16} 491bee3d7bSdrhdo_test delete-3.1.4 { 507020f651Sdrh execsql {CREATE INDEX index1 ON table1(f1)} 511bee3d7bSdrh execsql {PRAGMA count_changes=on} 52cc43cabcSdrh ifcapable explain { 53cc43cabcSdrh execsql {EXPLAIN DELETE FROM table1 WHERE f1=3} 54cc43cabcSdrh } 554cfa7934Sdrh execsql {DELETE FROM 'table1' WHERE f1=3} 561bee3d7bSdrh} {0} 571bee3d7bSdrhdo_test delete-3.1.5 { 587020f651Sdrh execsql {SELECT * FROM table1 ORDER BY f1} 597020f651Sdrh} {1 2 2 4 4 16} 604ebfef14Sdrhdo_test delete-3.1.6.1 { 617020f651Sdrh execsql {DELETE FROM table1 WHERE f1=2} 621bee3d7bSdrh} {1} 634ebfef14Sdrhdo_test delete-3.1.6.2 { 644ebfef14Sdrh db changes 654ebfef14Sdrh} 1 661bee3d7bSdrhdo_test delete-3.1.7 { 677020f651Sdrh execsql {SELECT * FROM table1 ORDER BY f1} 687020f651Sdrh} {1 2 4 16} 69ed717fe3Sdrhintegrity_check delete-3.2 70ed717fe3Sdrh 718be51133Sdrh# Semantic errors in the WHERE clause 728be51133Sdrh# 738be51133Sdrhdo_test delete-4.1 { 748be51133Sdrh execsql {CREATE TABLE table2(f1 int, f2 int)} 758be51133Sdrh set v [catch {execsql {DELETE FROM table2 WHERE f3=5}} msg] 768be51133Sdrh lappend v $msg 77967e8b73Sdrh} {1 {no such column: f3}} 788be51133Sdrh 798be51133Sdrhdo_test delete-4.2 { 808be51133Sdrh set v [catch {execsql {DELETE FROM table2 WHERE xyzzy(f1+4)}} msg] 818be51133Sdrh lappend v $msg 828be51133Sdrh} {1 {no such function: xyzzy}} 83ed717fe3Sdrhintegrity_check delete-4.3 8462c68191Sdrh 853494ffe9Sdrh# Lots of deletes 863494ffe9Sdrh# 871bee3d7bSdrhdo_test delete-5.1.1 { 883494ffe9Sdrh execsql {DELETE FROM table1} 891bee3d7bSdrh} {2} 901bee3d7bSdrhdo_test delete-5.1.2 { 913494ffe9Sdrh execsql {SELECT count(*) FROM table1} 921bee3d7bSdrh} {0} 931bee3d7bSdrhdo_test delete-5.2.1 { 941bee3d7bSdrh execsql {BEGIN TRANSACTION} 953494ffe9Sdrh for {set i 1} {$i<=200} {incr i} { 963494ffe9Sdrh execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 973494ffe9Sdrh } 981bee3d7bSdrh execsql {COMMIT} 991bee3d7bSdrh execsql {SELECT count(*) FROM table1} 1001bee3d7bSdrh} {200} 1011bee3d7bSdrhdo_test delete-5.2.2 { 1021bee3d7bSdrh execsql {DELETE FROM table1} 103*020c4f38Sdan} {200} 1041bee3d7bSdrhdo_test delete-5.2.3 { 1051bee3d7bSdrh execsql {BEGIN TRANSACTION} 1061bee3d7bSdrh for {set i 1} {$i<=200} {incr i} { 1071bee3d7bSdrh execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 1081bee3d7bSdrh } 1091bee3d7bSdrh execsql {COMMIT} 1101bee3d7bSdrh execsql {SELECT count(*) FROM table1} 1111bee3d7bSdrh} {200} 1121bee3d7bSdrhdo_test delete-5.2.4 { 1131bee3d7bSdrh execsql {PRAGMA count_changes=off} 1141bee3d7bSdrh execsql {DELETE FROM table1} 1151bee3d7bSdrh} {} 1161bee3d7bSdrhdo_test delete-5.2.5 { 1171bee3d7bSdrh execsql {SELECT count(*) FROM table1} 1181bee3d7bSdrh} {0} 1191bee3d7bSdrhdo_test delete-5.2.6 { 1201bee3d7bSdrh execsql {BEGIN TRANSACTION} 1211bee3d7bSdrh for {set i 1} {$i<=200} {incr i} { 1221bee3d7bSdrh execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 1231bee3d7bSdrh } 1241bee3d7bSdrh execsql {COMMIT} 1253494ffe9Sdrh execsql {SELECT count(*) FROM table1} 1263494ffe9Sdrh} {200} 1273494ffe9Sdrhdo_test delete-5.3 { 1283494ffe9Sdrh for {set i 1} {$i<=200} {incr i 4} { 1293494ffe9Sdrh execsql "DELETE FROM table1 WHERE f1==$i" 1303494ffe9Sdrh } 1313494ffe9Sdrh execsql {SELECT count(*) FROM table1} 1323494ffe9Sdrh} {150} 1334ebfef14Sdrhdo_test delete-5.4.1 { 1343494ffe9Sdrh execsql "DELETE FROM table1 WHERE f1>50" 1354ebfef14Sdrh db changes 1364ebfef14Sdrh} [db one {SELECT count(*) FROM table1 WHERE f1>50}] 1374ebfef14Sdrhdo_test delete-5.4.2 { 1383494ffe9Sdrh execsql {SELECT count(*) FROM table1} 1393494ffe9Sdrh} {37} 1403494ffe9Sdrhdo_test delete-5.5 { 1413494ffe9Sdrh for {set i 1} {$i<=70} {incr i 3} { 1423494ffe9Sdrh execsql "DELETE FROM table1 WHERE f1==$i" 1433494ffe9Sdrh } 1443494ffe9Sdrh execsql {SELECT f1 FROM table1 ORDER BY f1} 1453494ffe9Sdrh} {2 3 6 8 11 12 14 15 18 20 23 24 26 27 30 32 35 36 38 39 42 44 47 48 50} 1463494ffe9Sdrhdo_test delete-5.6 { 1473494ffe9Sdrh for {set i 1} {$i<40} {incr i} { 1483494ffe9Sdrh execsql "DELETE FROM table1 WHERE f1==$i" 1493494ffe9Sdrh } 1503494ffe9Sdrh execsql {SELECT f1 FROM table1 ORDER BY f1} 1513494ffe9Sdrh} {42 44 47 48 50} 1523494ffe9Sdrhdo_test delete-5.7 { 1533494ffe9Sdrh execsql "DELETE FROM table1 WHERE f1!=48" 1543494ffe9Sdrh execsql {SELECT f1 FROM table1 ORDER BY f1} 1553494ffe9Sdrh} {48} 156ed717fe3Sdrhintegrity_check delete-5.8 157ed717fe3Sdrh 1583494ffe9Sdrh 1590353ceddSdrh# Delete large quantities of data. We want to test the List overflow 1600353ceddSdrh# mechanism in the vdbe. 1610353ceddSdrh# 1620353ceddSdrhdo_test delete-6.1 { 1635f3b4ab5Sdrh execsql {BEGIN; DELETE FROM table1} 1640353ceddSdrh for {set i 1} {$i<=3000} {incr i} { 1655f3b4ab5Sdrh execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 1660353ceddSdrh } 1670353ceddSdrh execsql {DELETE FROM table2} 1685f3b4ab5Sdrh for {set i 1} {$i<=3000} {incr i} { 1695f3b4ab5Sdrh execsql "INSERT INTO table2 VALUES($i,[expr {$i*$i}])" 1705f3b4ab5Sdrh } 1715f3b4ab5Sdrh execsql {COMMIT} 1720353ceddSdrh execsql {SELECT count(*) FROM table1} 1730353ceddSdrh} {3000} 1740353ceddSdrhdo_test delete-6.2 { 1750353ceddSdrh execsql {SELECT count(*) FROM table2} 1760353ceddSdrh} {3000} 1770353ceddSdrhdo_test delete-6.3 { 1780353ceddSdrh execsql {SELECT f1 FROM table1 WHERE f1<10 ORDER BY f1} 1790353ceddSdrh} {1 2 3 4 5 6 7 8 9} 1800353ceddSdrhdo_test delete-6.4 { 1810353ceddSdrh execsql {SELECT f1 FROM table2 WHERE f1<10 ORDER BY f1} 1820353ceddSdrh} {1 2 3 4 5 6 7 8 9} 1834ebfef14Sdrhdo_test delete-6.5.1 { 1840353ceddSdrh execsql {DELETE FROM table1 WHERE f1>7} 1854ebfef14Sdrh db changes 1864ebfef14Sdrh} {2993} 1874ebfef14Sdrhdo_test delete-6.5.2 { 1880353ceddSdrh execsql {SELECT f1 FROM table1 ORDER BY f1} 1890353ceddSdrh} {1 2 3 4 5 6 7} 1900353ceddSdrhdo_test delete-6.6 { 1910353ceddSdrh execsql {DELETE FROM table2 WHERE f1>7} 1920353ceddSdrh execsql {SELECT f1 FROM table2 ORDER BY f1} 1930353ceddSdrh} {1 2 3 4 5 6 7} 1940353ceddSdrhdo_test delete-6.7 { 1950353ceddSdrh execsql {DELETE FROM table1} 1960353ceddSdrh execsql {SELECT f1 FROM table1} 1970353ceddSdrh} {} 1980353ceddSdrhdo_test delete-6.8 { 1990353ceddSdrh execsql {INSERT INTO table1 VALUES(2,3)} 2000353ceddSdrh execsql {SELECT f1 FROM table1} 2010353ceddSdrh} {2} 2020353ceddSdrhdo_test delete-6.9 { 2030353ceddSdrh execsql {DELETE FROM table2} 2040353ceddSdrh execsql {SELECT f1 FROM table2} 2050353ceddSdrh} {} 2060353ceddSdrhdo_test delete-6.10 { 2070353ceddSdrh execsql {INSERT INTO table2 VALUES(2,3)} 2080353ceddSdrh execsql {SELECT f1 FROM table2} 2090353ceddSdrh} {2} 210ed717fe3Sdrhintegrity_check delete-6.11 2110353ceddSdrh 21226b3e1bcSdrhdo_test delete-7.1 { 21326b3e1bcSdrh execsql { 21426b3e1bcSdrh CREATE TABLE t3(a); 21526b3e1bcSdrh INSERT INTO t3 VALUES(1); 21626b3e1bcSdrh INSERT INTO t3 SELECT a+1 FROM t3; 21726b3e1bcSdrh INSERT INTO t3 SELECT a+2 FROM t3; 21826b3e1bcSdrh SELECT * FROM t3; 21926b3e1bcSdrh } 22026b3e1bcSdrh} {1 2 3 4} 221798da52cSdrhifcapable {trigger} { 22226b3e1bcSdrh do_test delete-7.2 { 22326b3e1bcSdrh execsql { 22426b3e1bcSdrh CREATE TABLE cnt(del); 22526b3e1bcSdrh INSERT INTO cnt VALUES(0); 22626b3e1bcSdrh CREATE TRIGGER r1 AFTER DELETE ON t3 FOR EACH ROW BEGIN 22726b3e1bcSdrh UPDATE cnt SET del=del+1; 22826b3e1bcSdrh END; 22926b3e1bcSdrh DELETE FROM t3 WHERE a<2; 23026b3e1bcSdrh SELECT * FROM t3; 23126b3e1bcSdrh } 23226b3e1bcSdrh } {2 3 4} 23326b3e1bcSdrh do_test delete-7.3 { 23426b3e1bcSdrh execsql { 23526b3e1bcSdrh SELECT * FROM cnt; 23626b3e1bcSdrh } 23726b3e1bcSdrh } {1} 23826b3e1bcSdrh do_test delete-7.4 { 23926b3e1bcSdrh execsql { 24026b3e1bcSdrh DELETE FROM t3; 24126b3e1bcSdrh SELECT * FROM t3; 24226b3e1bcSdrh } 24326b3e1bcSdrh } {} 24426b3e1bcSdrh do_test delete-7.5 { 24526b3e1bcSdrh execsql { 24626b3e1bcSdrh SELECT * FROM cnt; 24726b3e1bcSdrh } 24826b3e1bcSdrh } {4} 24926b3e1bcSdrh do_test delete-7.6 { 25026b3e1bcSdrh execsql { 25126b3e1bcSdrh INSERT INTO t3 VALUES(1); 25226b3e1bcSdrh INSERT INTO t3 SELECT a+1 FROM t3; 25326b3e1bcSdrh INSERT INTO t3 SELECT a+2 FROM t3; 25426b3e1bcSdrh CREATE TABLE t4 AS SELECT * FROM t3; 25526b3e1bcSdrh PRAGMA count_changes=ON; 25626b3e1bcSdrh DELETE FROM t3; 25726b3e1bcSdrh DELETE FROM t4; 25826b3e1bcSdrh } 25926b3e1bcSdrh } {4 4} 260798da52cSdrh} ;# endif trigger 261798da52cSdrhifcapable {!trigger} { 262798da52cSdrh execsql {DELETE FROM t3} 263798da52cSdrh} 264ed717fe3Sdrhintegrity_check delete-7.7 2650353ceddSdrh 26666b4ebafSdrh# Make sure error messages are consistent when attempting to delete 26766b4ebafSdrh# from a read-only database. Ticket #304. 26866b4ebafSdrh# 26966b4ebafSdrhdo_test delete-8.0 { 27066b4ebafSdrh execsql { 27166b4ebafSdrh PRAGMA count_changes=OFF; 27266b4ebafSdrh INSERT INTO t3 VALUES(123); 27366b4ebafSdrh SELECT * FROM t3; 27466b4ebafSdrh } 27566b4ebafSdrh} {123} 27666b4ebafSdrhdb close 277fda06befSmistachkincatch {forcedelete test.db-journal} 27866b4ebafSdrhcatch {file attributes test.db -permissions 0444} 27966b4ebafSdrhcatch {file attributes test.db -readonly 1} 280dddca286Sdrhsqlite3 db test.db 281dddca286Sdrhset ::DB [sqlite3_connection_pointer db] 28266b4ebafSdrhdo_test delete-8.1 { 28366b4ebafSdrh catchsql { 28466b4ebafSdrh DELETE FROM t3; 28566b4ebafSdrh } 28666b4ebafSdrh} {1 {attempt to write a readonly database}} 28766b4ebafSdrhdo_test delete-8.2 { 28866b4ebafSdrh execsql {SELECT * FROM t3} 28966b4ebafSdrh} {123} 29066b4ebafSdrhdo_test delete-8.3 { 29166b4ebafSdrh catchsql { 29266b4ebafSdrh DELETE FROM t3 WHERE 1; 29366b4ebafSdrh } 29466b4ebafSdrh} {1 {attempt to write a readonly database}} 29566b4ebafSdrhdo_test delete-8.4 { 29666b4ebafSdrh execsql {SELECT * FROM t3} 29766b4ebafSdrh} {123} 2980de0bb33Sdanielk1977 2990de0bb33Sdanielk1977# Update for v3: In v2 the DELETE statement would succeed because no 3000de0bb33Sdanielk1977# database writes actually occur. Version 3 refuses to open a transaction 3010de0bb33Sdanielk1977# on a read-only file, so the statement fails. 30266b4ebafSdrhdo_test delete-8.5 { 30366b4ebafSdrh catchsql { 30466b4ebafSdrh DELETE FROM t3 WHERE a<100; 30566b4ebafSdrh } 3060de0bb33Sdanielk1977# v2 result: {0 {}} 3070de0bb33Sdanielk1977} {1 {attempt to write a readonly database}} 30866b4ebafSdrhdo_test delete-8.6 { 30966b4ebafSdrh execsql {SELECT * FROM t3} 31066b4ebafSdrh} {123} 311ed717fe3Sdrhintegrity_check delete-8.7 3120353ceddSdrh 313382e28faSdanielk1977# Need to do the following for tcl 8.5 on mac. On that configuration, the 314fda06befSmistachkin# -readonly flag is taken so seriously that a subsequent [forcedelete] 315382e28faSdanielk1977# (required before the next test file can be executed) will fail. 316382e28faSdanielk1977# 317382e28faSdanielk1977catch {file attributes test.db -readonly 0} 318ef165cedSdanielk1977db close 319fda06befSmistachkinforcedelete test.db test.db-journal 320ef165cedSdanielk1977 321c4d201c6Sdanielk1977# The following tests verify that SQLite correctly handles the case 322c4d201c6Sdanielk1977# where an index B-Tree is being scanned, the rowid column being read 323c4d201c6Sdanielk1977# from each index entry and another statement deletes some rows from 324c4d201c6Sdanielk1977# the index B-Tree. At one point this (obscure) scenario was causing 325c4d201c6Sdanielk1977# SQLite to return spurious SQLITE_CORRUPT errors and arguably incorrect 326c4d201c6Sdanielk1977# query results. 327c4d201c6Sdanielk1977# 328ef165cedSdanielk1977do_test delete-9.1 { 329ef165cedSdanielk1977 sqlite3 db test.db 330ef165cedSdanielk1977 execsql { 331ef165cedSdanielk1977 CREATE TABLE t5(a, b); 332ef165cedSdanielk1977 CREATE TABLE t6(c, d); 333ef165cedSdanielk1977 INSERT INTO t5 VALUES(1, 2); 334ef165cedSdanielk1977 INSERT INTO t5 VALUES(3, 4); 335ef165cedSdanielk1977 INSERT INTO t5 VALUES(5, 6); 336ef165cedSdanielk1977 INSERT INTO t6 VALUES('a', 'b'); 337ef165cedSdanielk1977 INSERT INTO t6 VALUES('c', 'd'); 338ef165cedSdanielk1977 CREATE INDEX i5 ON t5(a); 339c4d201c6Sdanielk1977 CREATE INDEX i6 ON t6(c); 340ef165cedSdanielk1977 } 341ef165cedSdanielk1977} {} 342ef165cedSdanielk1977do_test delete-9.2 { 343c4d201c6Sdanielk1977 set res [list] 344c4d201c6Sdanielk1977 db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } { 345dda70fe3Sdrh if {$r==2} { db eval { DELETE FROM t5 } } 346c4d201c6Sdanielk1977 lappend res $r $c $d 347c4d201c6Sdanielk1977 } 348c4d201c6Sdanielk1977 set res 349c4d201c6Sdanielk1977} {1 a b 1 c d 2 a b {} c d} 350c4d201c6Sdanielk1977do_test delete-9.3 { 351c4d201c6Sdanielk1977 execsql { 352c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(1, 2); 353c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(3, 4); 354c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(5, 6); 355c4d201c6Sdanielk1977 } 356c4d201c6Sdanielk1977 set res [list] 357c4d201c6Sdanielk1977 db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } { 358dda70fe3Sdrh if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 2 } } 359c4d201c6Sdanielk1977 lappend res $r $c $d 360c4d201c6Sdanielk1977 } 361c4d201c6Sdanielk1977 set res 362c4d201c6Sdanielk1977} {1 a b 1 c d 2 a b {} c d 3 a b 3 c d} 363c4d201c6Sdanielk1977do_test delete-9.4 { 364c4d201c6Sdanielk1977 execsql { 365c4d201c6Sdanielk1977 DELETE FROM t5; 366c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(1, 2); 367c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(3, 4); 368c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(5, 6); 369c4d201c6Sdanielk1977 } 370c4d201c6Sdanielk1977 set res [list] 371c4d201c6Sdanielk1977 db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } { 372dda70fe3Sdrh if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 1 } } 373c4d201c6Sdanielk1977 lappend res $r $c $d 374c4d201c6Sdanielk1977 } 375c4d201c6Sdanielk1977 set res 376c4d201c6Sdanielk1977} {1 a b 1 c d 2 a b 2 c d 3 a b 3 c d} 377c4d201c6Sdanielk1977do_test delete-9.5 { 378c4d201c6Sdanielk1977 execsql { 379c4d201c6Sdanielk1977 DELETE FROM t5; 380c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(1, 2); 381c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(3, 4); 382c4d201c6Sdanielk1977 INSERT INTO t5 VALUES(5, 6); 383c4d201c6Sdanielk1977 } 384c4d201c6Sdanielk1977 set res [list] 385c4d201c6Sdanielk1977 db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } { 386dda70fe3Sdrh if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 3 } } 387c4d201c6Sdanielk1977 lappend res $r $c $d 388c4d201c6Sdanielk1977 } 389c4d201c6Sdanielk1977 set res 390c4d201c6Sdanielk1977} {1 a b 1 c d 2 a b 2 c d} 391ef165cedSdanielk1977 39261441c34Sdando_execsql_test delete-10.0 { 39361441c34Sdan CREATE TABLE t1(a INT UNIQUE, b INT); 39461441c34Sdan INSERT INTO t1(a,b) VALUES('1','2'); 39561441c34Sdan SELECT * FROM t1 WHERE a='1' AND b='2'; 39661441c34Sdan} {1 2} 39761441c34Sdan 39861441c34Sdando_execsql_test delete-10.1 { 39961441c34Sdan DELETE FROM t1 WHERE a='1' AND b='2'; 40061441c34Sdan} 40161441c34Sdan 40261441c34Sdando_execsql_test delete-10.2 { 40361441c34Sdan SELECT * FROM t1 WHERE a='1' AND b='2'; 40461441c34Sdan} 40561441c34Sdan 4065e3a6ebfSdrhdo_execsql_test delete-11.0 { 4075e3a6ebfSdrh CREATE TABLE t11(a INTEGER PRIMARY KEY, b INT); 4085e3a6ebfSdrh WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<20) 4095e3a6ebfSdrh INSERT INTO t11(a,b) SELECT x, (x*17)%100 FROM cnt; 4105e3a6ebfSdrh SELECT * FROM t11; 4115e3a6ebfSdrh} {1 17 2 34 3 51 4 68 5 85 6 2 7 19 8 36 9 53 10 70 11 87 12 4 13 21 14 38 15 55 16 72 17 89 18 6 19 23 20 40} 4125e3a6ebfSdrhdo_execsql_test delete-11.1 { 4135e3a6ebfSdrh DELETE FROM t11 AS xyz 4145e3a6ebfSdrh WHERE EXISTS(SELECT 1 FROM t11 WHERE t11.a>xyz.a AND t11.b<=xyz.b); 4155e3a6ebfSdrh SELECT * FROM t11; 4165e3a6ebfSdrh} {6 2 12 4 18 6 19 23 20 40} 4175e3a6ebfSdrh 418382e28faSdanielk1977 41962c68191Sdrhfinish_test 420