1*1da57d55SToomas Soome# 2c5c4113dSnw141292# 2001 September 15 3c5c4113dSnw141292# 4c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 5c5c4113dSnw141292# a legal notice, here is a blessing: 6c5c4113dSnw141292# 7c5c4113dSnw141292# May you do good and not evil. 8c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 9c5c4113dSnw141292# May you share freely, never taking more than you give. 10c5c4113dSnw141292# 11c5c4113dSnw141292#*********************************************************************** 12c5c4113dSnw141292# This file implements regression tests for SQLite library. The 13c5c4113dSnw141292# focus of this file is testing the INSERT statement that takes is 14c5c4113dSnw141292# result from a SELECT. 15c5c4113dSnw141292# 16c5c4113dSnw141292# $Id: insert2.test,v 1.10 2002/06/25 13:16:04 drh Exp $ 17c5c4113dSnw141292 18c5c4113dSnw141292set testdir [file dirname $argv0] 19c5c4113dSnw141292source $testdir/tester.tcl 20c5c4113dSnw141292 21c5c4113dSnw141292# Create some tables with data that we can select against 22c5c4113dSnw141292# 23c5c4113dSnw141292do_test insert2-1.0 { 24c5c4113dSnw141292 execsql {CREATE TABLE d1(n int, log int);} 25c5c4113dSnw141292 for {set i 1} {$i<=20} {incr i} { 26c5c4113dSnw141292 for {set j 0} {pow(2,$j)<$i} {incr j} {} 27c5c4113dSnw141292 execsql "INSERT INTO d1 VALUES($i,$j)" 28c5c4113dSnw141292 } 29c5c4113dSnw141292 execsql {SELECT * FROM d1 ORDER BY n} 30c5c4113dSnw141292} {1 0 2 1 3 2 4 2 5 3 6 3 7 3 8 3 9 4 10 4 11 4 12 4 13 4 14 4 15 4 16 4 17 5 18 5 19 5 20 5} 31c5c4113dSnw141292 32c5c4113dSnw141292# Insert into a new table from the old one. 33c5c4113dSnw141292# 34c5c4113dSnw141292do_test insert2-1.1.1 { 35c5c4113dSnw141292 execsql { 36c5c4113dSnw141292 CREATE TABLE t1(log int, cnt int); 37c5c4113dSnw141292 PRAGMA count_changes=on; 38c5c4113dSnw141292 INSERT INTO t1 SELECT log, count(*) FROM d1 GROUP BY log; 39c5c4113dSnw141292 } 40c5c4113dSnw141292} {6} 41c5c4113dSnw141292do_test insert2-1.1.2 { 42c5c4113dSnw141292 db changes 43c5c4113dSnw141292} {6} 44c5c4113dSnw141292do_test insert2-1.1.3 { 45c5c4113dSnw141292 execsql {SELECT * FROM t1 ORDER BY log} 46c5c4113dSnw141292} {0 1 1 1 2 2 3 4 4 8 5 4} 47c5c4113dSnw141292 48c5c4113dSnw141292do_test insert2-1.2.1 { 49c5c4113dSnw141292 catch {execsql {DROP TABLE t1}} 50c5c4113dSnw141292 execsql { 51c5c4113dSnw141292 CREATE TABLE t1(log int, cnt int); 52c5c4113dSnw141292 INSERT INTO t1 53c5c4113dSnw141292 SELECT log, count(*) FROM d1 GROUP BY log 54c5c4113dSnw141292 EXCEPT SELECT n-1,log FROM d1; 55c5c4113dSnw141292 } 56c5c4113dSnw141292} {4} 57c5c4113dSnw141292do_test insert2-1.2.2 { 58c5c4113dSnw141292 execsql { 59c5c4113dSnw141292 SELECT * FROM t1 ORDER BY log; 60c5c4113dSnw141292 } 61c5c4113dSnw141292} {0 1 3 4 4 8 5 4} 62c5c4113dSnw141292do_test insert2-1.3.1 { 63c5c4113dSnw141292 catch {execsql {DROP TABLE t1}} 64c5c4113dSnw141292 execsql { 65c5c4113dSnw141292 CREATE TABLE t1(log int, cnt int); 66c5c4113dSnw141292 PRAGMA count_changes=off; 67c5c4113dSnw141292 INSERT INTO t1 68c5c4113dSnw141292 SELECT log, count(*) FROM d1 GROUP BY log 69c5c4113dSnw141292 INTERSECT SELECT n-1,log FROM d1; 70c5c4113dSnw141292 } 71c5c4113dSnw141292} {} 72c5c4113dSnw141292do_test insert2-1.3.2 { 73c5c4113dSnw141292 execsql { 74c5c4113dSnw141292 SELECT * FROM t1 ORDER BY log; 75c5c4113dSnw141292 } 76c5c4113dSnw141292} {1 1 2 2} 77c5c4113dSnw141292do_test insert2-1.4 { 78c5c4113dSnw141292 catch {execsql {DROP TABLE t1}} 79c5c4113dSnw141292 set r [execsql { 80c5c4113dSnw141292 CREATE TABLE t1(log int, cnt int); 81c5c4113dSnw141292 CREATE INDEX i1 ON t1(log); 82c5c4113dSnw141292 CREATE INDEX i2 ON t1(cnt); 83c5c4113dSnw141292 INSERT INTO t1 SELECT log, count() FROM d1 GROUP BY log; 84c5c4113dSnw141292 SELECT * FROM t1 ORDER BY log; 85c5c4113dSnw141292 }] 86c5c4113dSnw141292 lappend r [execsql {SELECT cnt FROM t1 WHERE log=3}] 87c5c4113dSnw141292 lappend r [execsql {SELECT log FROM t1 WHERE cnt=4 ORDER BY log}] 88c5c4113dSnw141292} {0 1 1 1 2 2 3 4 4 8 5 4 4 {3 5}} 89c5c4113dSnw141292 90c5c4113dSnw141292do_test insert2-2.0 { 91c5c4113dSnw141292 execsql { 92c5c4113dSnw141292 CREATE TABLE t3(a,b,c); 93c5c4113dSnw141292 CREATE TABLE t4(x,y); 94c5c4113dSnw141292 INSERT INTO t4 VALUES(1,2); 95c5c4113dSnw141292 SELECT * FROM t4; 96c5c4113dSnw141292 } 97c5c4113dSnw141292} {1 2} 98c5c4113dSnw141292do_test insert2-2.1 { 99c5c4113dSnw141292 execsql { 100c5c4113dSnw141292 INSERT INTO t3(a,c) SELECT * FROM t4; 101c5c4113dSnw141292 SELECT * FROM t3; 102c5c4113dSnw141292 } 103c5c4113dSnw141292} {1 {} 2} 104c5c4113dSnw141292do_test insert2-2.2 { 105c5c4113dSnw141292 execsql { 106c5c4113dSnw141292 DELETE FROM t3; 107c5c4113dSnw141292 INSERT INTO t3(c,b) SELECT * FROM t4; 108c5c4113dSnw141292 SELECT * FROM t3; 109c5c4113dSnw141292 } 110c5c4113dSnw141292} {{} 2 1} 111c5c4113dSnw141292do_test insert2-2.3 { 112c5c4113dSnw141292 execsql { 113c5c4113dSnw141292 DELETE FROM t3; 114c5c4113dSnw141292 INSERT INTO t3(c,a,b) SELECT x, 'hi', y FROM t4; 115c5c4113dSnw141292 SELECT * FROM t3; 116c5c4113dSnw141292 } 117c5c4113dSnw141292} {hi 2 1} 118c5c4113dSnw141292 119c5c4113dSnw141292integrity_check insert2-3.0 120c5c4113dSnw141292 121c5c4113dSnw141292# File table t4 with lots of data 122c5c4113dSnw141292# 123c5c4113dSnw141292do_test insert2-3.1 { 124c5c4113dSnw141292 execsql { 125c5c4113dSnw141292 SELECT * from t4; 126c5c4113dSnw141292 } 127c5c4113dSnw141292} {1 2} 128c5c4113dSnw141292do_test insert2-3.2 { 129c5c4113dSnw141292 execsql { 130c5c4113dSnw141292 BEGIN; 131c5c4113dSnw141292 INSERT INTO t4 VALUES(2,4); 132c5c4113dSnw141292 INSERT INTO t4 VALUES(3,6); 133c5c4113dSnw141292 INSERT INTO t4 VALUES(4,8); 134c5c4113dSnw141292 INSERT INTO t4 VALUES(5,10); 135c5c4113dSnw141292 INSERT INTO t4 VALUES(6,12); 136c5c4113dSnw141292 INSERT INTO t4 VALUES(7,14); 137c5c4113dSnw141292 INSERT INTO t4 VALUES(8,16); 138c5c4113dSnw141292 INSERT INTO t4 VALUES(9,18); 139c5c4113dSnw141292 INSERT INTO t4 VALUES(10,20); 140c5c4113dSnw141292 COMMIT; 141c5c4113dSnw141292 } 142c5c4113dSnw141292 db changes 143c5c4113dSnw141292} {9} 144c5c4113dSnw141292do_test insert2-3.2.1 { 145c5c4113dSnw141292 execsql { 146c5c4113dSnw141292 SELECT count(*) FROM t4; 147c5c4113dSnw141292 } 148c5c4113dSnw141292} {10} 149c5c4113dSnw141292do_test insert2-3.3 { 150c5c4113dSnw141292 execsql { 151c5c4113dSnw141292 BEGIN; 152c5c4113dSnw141292 INSERT INTO t4 SELECT x+(SELECT max(x) FROM t4),y FROM t4; 153c5c4113dSnw141292 INSERT INTO t4 SELECT x+(SELECT max(x) FROM t4),y FROM t4; 154c5c4113dSnw141292 INSERT INTO t4 SELECT x+(SELECT max(x) FROM t4),y FROM t4; 155c5c4113dSnw141292 INSERT INTO t4 SELECT x+(SELECT max(x) FROM t4),y FROM t4; 156c5c4113dSnw141292 COMMIT; 157c5c4113dSnw141292 SELECT count(*) FROM t4; 158c5c4113dSnw141292 } 159c5c4113dSnw141292} {160} 160c5c4113dSnw141292do_test insert2-3.4 { 161c5c4113dSnw141292 execsql { 162c5c4113dSnw141292 BEGIN; 163c5c4113dSnw141292 UPDATE t4 SET y='lots of data for the row where x=' || x 164c5c4113dSnw141292 || ' and y=' || y || ' - even more data to fill space'; 165c5c4113dSnw141292 COMMIT; 166c5c4113dSnw141292 SELECT count(*) FROM t4; 167c5c4113dSnw141292 } 168c5c4113dSnw141292} {160} 169c5c4113dSnw141292do_test insert2-3.5 { 170c5c4113dSnw141292 execsql { 171c5c4113dSnw141292 BEGIN; 172c5c4113dSnw141292 INSERT INTO t4 SELECT x+(SELECT max(x)+1 FROM t4),y FROM t4; 173c5c4113dSnw141292 SELECT count(*) from t4; 174c5c4113dSnw141292 ROLLBACK; 175c5c4113dSnw141292 } 176c5c4113dSnw141292} {320} 177c5c4113dSnw141292do_test insert2-3.6 { 178c5c4113dSnw141292 execsql { 179c5c4113dSnw141292 SELECT count(*) FROM t4; 180c5c4113dSnw141292 } 181c5c4113dSnw141292} {160} 182c5c4113dSnw141292do_test insert2-3.7 { 183c5c4113dSnw141292 execsql { 184c5c4113dSnw141292 BEGIN; 185c5c4113dSnw141292 DELETE FROM t4 WHERE x!=123; 186c5c4113dSnw141292 SELECT count(*) FROM t4; 187c5c4113dSnw141292 ROLLBACK; 188c5c4113dSnw141292 } 189c5c4113dSnw141292} {1} 190c5c4113dSnw141292do_test insert2-3.8 { 191c5c4113dSnw141292 db changes 192c5c4113dSnw141292} {159} 193c5c4113dSnw141292integrity_check insert2-3.9 194c5c4113dSnw141292 195c5c4113dSnw141292finish_test 196