18ce10ba6Sdrh# 2003 June 21 28ce10ba6Sdrh# 38ce10ba6Sdrh# The author disclaims copyright to this source code. In place of 48ce10ba6Sdrh# a legal notice, here is a blessing: 58ce10ba6Sdrh# 68ce10ba6Sdrh# May you do good and not evil. 78ce10ba6Sdrh# May you find forgiveness for yourself and forgive others. 88ce10ba6Sdrh# May you share freely, never taking more than you give. 98ce10ba6Sdrh# 108ce10ba6Sdrh#*********************************************************************** 118ce10ba6Sdrh# This file implements regression tests for SQLite library. 128ce10ba6Sdrh# 138ce10ba6Sdrh# This file implements tests for miscellanous features that were 148ce10ba6Sdrh# left out of other test files. 158ce10ba6Sdrh# 164152e677Sdanielk1977# $Id: misc2.test,v 1.28 2007/09/12 17:01:45 danielk1977 Exp $ 178ce10ba6Sdrh 188ce10ba6Sdrhset testdir [file dirname $argv0] 198ce10ba6Sdrhsource $testdir/tester.tcl 208ce10ba6Sdrh 2176d462eeSdan# The tests in this file were written before SQLite supported recursive 2276d462eeSdan# trigger invocation, and some tests depend on that to pass. So disable 2376d462eeSdan# recursive triggers for this file. 245bde73c4Sdancatchsql { pragma recursive_triggers = off } 2576d462eeSdan 26798da52cSdrhifcapable {trigger} { 278ce10ba6Sdrh# Test for ticket #360 288ce10ba6Sdrh# 298ce10ba6Sdrhdo_test misc2-1.1 { 308ce10ba6Sdrh catchsql { 318ce10ba6Sdrh CREATE TABLE FOO(bar integer); 328ce10ba6Sdrh CREATE TRIGGER foo_insert BEFORE INSERT ON foo BEGIN 338ce10ba6Sdrh SELECT CASE WHEN (NOT new.bar BETWEEN 0 AND 20) 348ce10ba6Sdrh THEN raise(rollback, 'aiieee') END; 358ce10ba6Sdrh END; 368ce10ba6Sdrh INSERT INTO foo(bar) VALUES (1); 378ce10ba6Sdrh } 38dc339ee2Sdrh} {0 {}} 39dc339ee2Sdrhdo_test misc2-1.2 { 40dc339ee2Sdrh catchsql { 41dc339ee2Sdrh INSERT INTO foo(bar) VALUES (111); 42dc339ee2Sdrh } 438ce10ba6Sdrh} {1 aiieee} 44798da52cSdrh} ;# endif trigger 45d60ccc6aSdrh 46d60ccc6aSdrh# Make sure ROWID works on a view and a subquery. Ticket #364 47d60ccc6aSdrh# 48d60ccc6aSdrhdo_test misc2-2.1 { 49d60ccc6aSdrh execsql { 50d60ccc6aSdrh CREATE TABLE t1(a,b,c); 51d60ccc6aSdrh INSERT INTO t1 VALUES(1,2,3); 52da808d56Sdrh CREATE TABLE t2(a,b,c); 53d60ccc6aSdrh INSERT INTO t2 VALUES(7,8,9); 54d8702b4dSdanielk1977 } 55d8702b4dSdanielk1977} {} 56e61b9f4fSdanielk1977ifcapable subquery { 57*6e5020e8Sdrh do_catchsql_test misc2-2.2 { 58d60ccc6aSdrh SELECT rowid, * FROM (SELECT * FROM t1, t2); 59*6e5020e8Sdrh } {1 {no such column: rowid}} 60*6e5020e8Sdrh do_catchsql_test misc2-2.2b { 61*6e5020e8Sdrh SELECT 'rowid', * FROM (SELECT * FROM t1, t2); 62*6e5020e8Sdrh } {0 {rowid 1 2 3 7 8 9}} 63d60ccc6aSdrh} 64*6e5020e8Sdrh 652564ef97Sdrhifcapable view { 66a6c54defSdrh do_catchsql_test misc2-2.3 { 67d60ccc6aSdrh CREATE VIEW v1 AS SELECT * FROM t1, t2; 68d60ccc6aSdrh SELECT rowid, * FROM v1; 69a6c54defSdrh } {1 {no such column: rowid}} 70*6e5020e8Sdrh do_catchsql_test misc2-2.3b { 71*6e5020e8Sdrh SELECT 'rowid', * FROM v1; 72*6e5020e8Sdrh } {0 {rowid 1 2 3 7 8 9}} 730fa8ddbdSdanielk1977} ;# ifcapable view 74da808d56Sdrh 752564ef97Sdrh# Ticket #2002 and #1952. 762564ef97Sdrhifcapable subquery { 772564ef97Sdrh do_test misc2-2.4 { 782564ef97Sdrh execsql2 { 792564ef97Sdrh SELECT * FROM (SELECT a, b AS 'a', c AS 'a', 4 AS 'a' FROM t1) 802564ef97Sdrh } 812564ef97Sdrh } {a 1 a:1 2 a:2 3 a:3 4} 822564ef97Sdrh} 832564ef97Sdrh 84da808d56Sdrh# Check name binding precedence. Ticket #387 85da808d56Sdrh# 86da808d56Sdrhdo_test misc2-3.1 { 87da808d56Sdrh catchsql { 88da808d56Sdrh SELECT t1.b+t2.b AS a, t1.a, t2.a FROM t1, t2 WHERE a==10 89da808d56Sdrh } 90da808d56Sdrh} {1 {ambiguous column name: a}} 91dc2d94deSdrh 92dc2d94deSdrh# Make sure 32-bit integer overflow is handled properly in queries. 93dc2d94deSdrh# ticket #408 94dc2d94deSdrh# 95dc2d94deSdrhdo_test misc2-4.1 { 96dc2d94deSdrh execsql { 97dc2d94deSdrh INSERT INTO t1 VALUES(4000000000,'a','b'); 98dc2d94deSdrh SELECT a FROM t1 WHERE a>1; 99dc2d94deSdrh } 100dc2d94deSdrh} {4000000000} 101dc2d94deSdrhdo_test misc2-4.2 { 102dc2d94deSdrh execsql { 103dc2d94deSdrh INSERT INTO t1 VALUES(2147483648,'b2','c2'); 104dc2d94deSdrh INSERT INTO t1 VALUES(2147483647,'b3','c3'); 105dc2d94deSdrh SELECT a FROM t1 WHERE a>2147483647; 106dc2d94deSdrh } 107dc2d94deSdrh} {4000000000 2147483648} 108dc2d94deSdrhdo_test misc2-4.3 { 109dc2d94deSdrh execsql { 110dc2d94deSdrh SELECT a FROM t1 WHERE a<2147483648; 111dc2d94deSdrh } 112dc2d94deSdrh} {1 2147483647} 113dc2d94deSdrhdo_test misc2-4.4 { 114dc2d94deSdrh execsql { 115dc2d94deSdrh SELECT a FROM t1 WHERE a<=2147483648; 116dc2d94deSdrh } 117dc2d94deSdrh} {1 2147483648 2147483647} 118dc2d94deSdrhdo_test misc2-4.5 { 119dc2d94deSdrh execsql { 120dc2d94deSdrh SELECT a FROM t1 WHERE a<10000000000; 121dc2d94deSdrh } 122dc2d94deSdrh} {1 4000000000 2147483648 2147483647} 123dc2d94deSdrhdo_test misc2-4.6 { 124dc2d94deSdrh execsql { 125dc2d94deSdrh SELECT a FROM t1 WHERE a<1000000000000 ORDER BY 1; 126dc2d94deSdrh } 127dc2d94deSdrh} {1 2147483647 2147483648 4000000000} 1284305d103Sdrh 1294305d103Sdrh# There were some issues with expanding a SrcList object using a call 1304305d103Sdrh# to sqliteSrcListAppend() if the SrcList had previously been duplicated 1314305d103Sdrh# using a call to sqliteSrcListDup(). Ticket #416. The following test 1324305d103Sdrh# makes sure the problem has been fixed. 1334305d103Sdrh# 1340fa8ddbdSdanielk1977ifcapable view { 1354305d103Sdrhdo_test misc2-5.1 { 1364305d103Sdrh execsql { 1374305d103Sdrh CREATE TABLE x(a,b); 1384305d103Sdrh CREATE VIEW y AS 1394305d103Sdrh SELECT x1.b AS p, x2.b AS q FROM x AS x1, x AS x2 WHERE x1.a=x2.a; 1404305d103Sdrh CREATE VIEW z AS 1414305d103Sdrh SELECT y1.p, y2.p FROM y AS y1, y AS y2 WHERE y1.q=y2.q; 1424305d103Sdrh SELECT * from z; 1434305d103Sdrh } 1444305d103Sdrh} {} 1450fa8ddbdSdanielk1977} 146901afd43Sdrh 147901afd43Sdrh# Make sure we can open a database with an empty filename. What this 148901afd43Sdrh# does is store the database in a temporary file that is deleted when 149901afd43Sdrh# the database is closed. Ticket #432. 150901afd43Sdrh# 151901afd43Sdrhdo_test misc2-6.1 { 152901afd43Sdrh db close 153ef4ac8f9Sdrh sqlite3 db {} 154901afd43Sdrh execsql { 155901afd43Sdrh CREATE TABLE t1(a,b); 156901afd43Sdrh INSERT INTO t1 VALUES(1,2); 157901afd43Sdrh SELECT * FROM t1; 158901afd43Sdrh } 159901afd43Sdrh} {1 2} 160e4c61693Sdrh 16112b13002Sdanielk1977# Make sure we get an error message (not a segfault) on an attempt to 16212b13002Sdanielk1977# update a table from within the callback of a select on that same 16312b13002Sdanielk1977# table. 16412b13002Sdanielk1977# 165980b1a74Sdrh# 2006-08-16: This has changed. It is now permitted to update 166980b1a74Sdrh# the table being SELECTed from within the callback of the query. 167980b1a74Sdrh# 1684152e677Sdanielk1977ifcapable tclvar { 16912b13002Sdanielk1977 do_test misc2-7.1 { 17012b13002Sdanielk1977 db close 171fda06befSmistachkin forcedelete test.db 17212b13002Sdanielk1977 sqlite3 db test.db 17312b13002Sdanielk1977 execsql { 17412b13002Sdanielk1977 CREATE TABLE t1(x); 17512b13002Sdanielk1977 INSERT INTO t1 VALUES(1); 176980b1a74Sdrh INSERT INTO t1 VALUES(2); 177980b1a74Sdrh INSERT INTO t1 VALUES(3); 178980b1a74Sdrh SELECT * FROM t1; 17912b13002Sdanielk1977 } 180980b1a74Sdrh } {1 2 3} 18112b13002Sdanielk1977 do_test misc2-7.2 { 18212b13002Sdanielk1977 set rc [catch { 18312b13002Sdanielk1977 db eval {SELECT rowid FROM t1} {} { 18412b13002Sdanielk1977 db eval "DELETE FROM t1 WHERE rowid=$rowid" 18512b13002Sdanielk1977 } 18612b13002Sdanielk1977 } msg] 18712b13002Sdanielk1977 lappend rc $msg 188980b1a74Sdrh } {0 {}} 189980b1a74Sdrh do_test misc2-7.3 { 190980b1a74Sdrh execsql {SELECT * FROM t1} 191980b1a74Sdrh } {} 19212b13002Sdanielk1977 do_test misc2-7.4 { 193980b1a74Sdrh execsql { 194980b1a74Sdrh DELETE FROM t1; 195980b1a74Sdrh INSERT INTO t1 VALUES(1); 196980b1a74Sdrh INSERT INTO t1 VALUES(2); 197980b1a74Sdrh INSERT INTO t1 VALUES(3); 198980b1a74Sdrh INSERT INTO t1 VALUES(4); 19912b13002Sdanielk1977 } 200980b1a74Sdrh db eval {SELECT rowid, x FROM t1} { 201980b1a74Sdrh if {$x & 1} { 202980b1a74Sdrh db eval {DELETE FROM t1 WHERE rowid=$rowid} 2034489f9bdSdanielk1977 } 204980b1a74Sdrh } 205980b1a74Sdrh execsql {SELECT * FROM t1} 206980b1a74Sdrh } {2 4} 207980b1a74Sdrh do_test misc2-7.5 { 208980b1a74Sdrh execsql { 209980b1a74Sdrh DELETE FROM t1; 210980b1a74Sdrh INSERT INTO t1 VALUES(1); 211980b1a74Sdrh INSERT INTO t1 VALUES(2); 212980b1a74Sdrh INSERT INTO t1 VALUES(3); 213980b1a74Sdrh INSERT INTO t1 VALUES(4); 214980b1a74Sdrh } 215980b1a74Sdrh db eval {SELECT rowid, x FROM t1} { 216980b1a74Sdrh if {$x & 1} { 217980b1a74Sdrh db eval {DELETE FROM t1 WHERE rowid=$rowid+1} 218980b1a74Sdrh } 219980b1a74Sdrh } 220980b1a74Sdrh execsql {SELECT * FROM t1} 221980b1a74Sdrh } {1 3} 222980b1a74Sdrh do_test misc2-7.6 { 223980b1a74Sdrh execsql { 224980b1a74Sdrh DELETE FROM t1; 225980b1a74Sdrh INSERT INTO t1 VALUES(1); 226980b1a74Sdrh INSERT INTO t1 VALUES(2); 227980b1a74Sdrh INSERT INTO t1 VALUES(3); 228980b1a74Sdrh INSERT INTO t1 VALUES(4); 229980b1a74Sdrh } 230980b1a74Sdrh db eval {SELECT rowid, x FROM t1} { 231980b1a74Sdrh if {$x & 1} { 232980b1a74Sdrh db eval {DELETE FROM t1} 233980b1a74Sdrh } 234980b1a74Sdrh } 235980b1a74Sdrh execsql {SELECT * FROM t1} 236980b1a74Sdrh } {} 237980b1a74Sdrh do_test misc2-7.7 { 238980b1a74Sdrh execsql { 239980b1a74Sdrh DELETE FROM t1; 240980b1a74Sdrh INSERT INTO t1 VALUES(1); 241980b1a74Sdrh INSERT INTO t1 VALUES(2); 242980b1a74Sdrh INSERT INTO t1 VALUES(3); 243980b1a74Sdrh INSERT INTO t1 VALUES(4); 244980b1a74Sdrh } 245980b1a74Sdrh db eval {SELECT rowid, x FROM t1} { 246980b1a74Sdrh if {$x & 1} { 247980b1a74Sdrh db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid} 248980b1a74Sdrh } 249980b1a74Sdrh } 250980b1a74Sdrh execsql {SELECT * FROM t1} 251980b1a74Sdrh } {101 2 103 4} 252980b1a74Sdrh do_test misc2-7.8 { 253980b1a74Sdrh execsql { 254980b1a74Sdrh DELETE FROM t1; 255980b1a74Sdrh INSERT INTO t1 VALUES(1); 256980b1a74Sdrh } 257980b1a74Sdrh db eval {SELECT rowid, x FROM t1} { 258980b1a74Sdrh if {$x<10} { 259980b1a74Sdrh db eval {INSERT INTO t1 VALUES($x+1)} 260980b1a74Sdrh } 261980b1a74Sdrh } 262980b1a74Sdrh execsql {SELECT * FROM t1} 263980b1a74Sdrh } {1 2 3 4 5 6 7 8 9 10} 2644489f9bdSdanielk1977 2658c4d3a6bSdrh # Repeat the tests 7.1 through 7.8 about but this time do the SELECTs 2668c4d3a6bSdrh # in reverse order so that we exercise the sqlite3BtreePrev() routine 2678c4d3a6bSdrh # instead of sqlite3BtreeNext() 2688c4d3a6bSdrh # 2698c4d3a6bSdrh do_test misc2-7.11 { 2708c4d3a6bSdrh db close 271fda06befSmistachkin forcedelete test.db 2728c4d3a6bSdrh sqlite3 db test.db 2738c4d3a6bSdrh execsql { 2748c4d3a6bSdrh CREATE TABLE t1(x); 2758c4d3a6bSdrh INSERT INTO t1 VALUES(1); 2768c4d3a6bSdrh INSERT INTO t1 VALUES(2); 2778c4d3a6bSdrh INSERT INTO t1 VALUES(3); 2788c4d3a6bSdrh SELECT * FROM t1; 2798c4d3a6bSdrh } 2808c4d3a6bSdrh } {1 2 3} 2818c4d3a6bSdrh do_test misc2-7.12 { 2828c4d3a6bSdrh set rc [catch { 2838c4d3a6bSdrh db eval {SELECT rowid FROM t1 ORDER BY rowid DESC} {} { 2848c4d3a6bSdrh db eval "DELETE FROM t1 WHERE rowid=$rowid" 2858c4d3a6bSdrh } 2868c4d3a6bSdrh } msg] 2878c4d3a6bSdrh lappend rc $msg 2888c4d3a6bSdrh } {0 {}} 2898c4d3a6bSdrh do_test misc2-7.13 { 2908c4d3a6bSdrh execsql {SELECT * FROM t1} 2918c4d3a6bSdrh } {} 2928c4d3a6bSdrh do_test misc2-7.14 { 2938c4d3a6bSdrh execsql { 2948c4d3a6bSdrh DELETE FROM t1; 2958c4d3a6bSdrh INSERT INTO t1 VALUES(1); 2968c4d3a6bSdrh INSERT INTO t1 VALUES(2); 2978c4d3a6bSdrh INSERT INTO t1 VALUES(3); 2988c4d3a6bSdrh INSERT INTO t1 VALUES(4); 2998c4d3a6bSdrh } 3008c4d3a6bSdrh db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} { 3018c4d3a6bSdrh if {$x & 1} { 3028c4d3a6bSdrh db eval {DELETE FROM t1 WHERE rowid=$rowid} 3038c4d3a6bSdrh } 3048c4d3a6bSdrh } 3058c4d3a6bSdrh execsql {SELECT * FROM t1} 3068c4d3a6bSdrh } {2 4} 3078c4d3a6bSdrh do_test misc2-7.15 { 3088c4d3a6bSdrh execsql { 3098c4d3a6bSdrh DELETE FROM t1; 3108c4d3a6bSdrh INSERT INTO t1 VALUES(1); 3118c4d3a6bSdrh INSERT INTO t1 VALUES(2); 3128c4d3a6bSdrh INSERT INTO t1 VALUES(3); 3138c4d3a6bSdrh INSERT INTO t1 VALUES(4); 3148c4d3a6bSdrh } 3158c4d3a6bSdrh db eval {SELECT rowid, x FROM t1} { 3168c4d3a6bSdrh if {$x & 1} { 3178c4d3a6bSdrh db eval {DELETE FROM t1 WHERE rowid=$rowid+1} 3188c4d3a6bSdrh } 3198c4d3a6bSdrh } 3208c4d3a6bSdrh execsql {SELECT * FROM t1} 3218c4d3a6bSdrh } {1 3} 3228c4d3a6bSdrh do_test misc2-7.16 { 3238c4d3a6bSdrh execsql { 3248c4d3a6bSdrh DELETE FROM t1; 3258c4d3a6bSdrh INSERT INTO t1 VALUES(1); 3268c4d3a6bSdrh INSERT INTO t1 VALUES(2); 3278c4d3a6bSdrh INSERT INTO t1 VALUES(3); 3288c4d3a6bSdrh INSERT INTO t1 VALUES(4); 3298c4d3a6bSdrh } 3308c4d3a6bSdrh db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} { 3318c4d3a6bSdrh if {$x & 1} { 3328c4d3a6bSdrh db eval {DELETE FROM t1} 3338c4d3a6bSdrh } 3348c4d3a6bSdrh } 3358c4d3a6bSdrh execsql {SELECT * FROM t1} 3368c4d3a6bSdrh } {} 3378c4d3a6bSdrh do_test misc2-7.17 { 3388c4d3a6bSdrh execsql { 3398c4d3a6bSdrh DELETE FROM t1; 3408c4d3a6bSdrh INSERT INTO t1 VALUES(1); 3418c4d3a6bSdrh INSERT INTO t1 VALUES(2); 3428c4d3a6bSdrh INSERT INTO t1 VALUES(3); 3438c4d3a6bSdrh INSERT INTO t1 VALUES(4); 3448c4d3a6bSdrh } 3458c4d3a6bSdrh db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} { 3468c4d3a6bSdrh if {$x & 1} { 3478c4d3a6bSdrh db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid} 3488c4d3a6bSdrh } 3498c4d3a6bSdrh } 3508c4d3a6bSdrh execsql {SELECT * FROM t1} 3518c4d3a6bSdrh } {101 2 103 4} 3528c4d3a6bSdrh do_test misc2-7.18 { 3538c4d3a6bSdrh execsql { 3548c4d3a6bSdrh DELETE FROM t1; 3558c4d3a6bSdrh INSERT INTO t1(rowid,x) VALUES(10,10); 3568c4d3a6bSdrh } 3578c4d3a6bSdrh db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} { 3588c4d3a6bSdrh if {$x>1} { 3598c4d3a6bSdrh db eval {INSERT INTO t1(rowid,x) VALUES($x-1,$x-1)} 3608c4d3a6bSdrh } 3618c4d3a6bSdrh } 3628c4d3a6bSdrh execsql {SELECT * FROM t1} 3638c4d3a6bSdrh } {1 2 3 4 5 6 7 8 9 10} 3644152e677Sdanielk1977} 3658c4d3a6bSdrh 3664489f9bdSdanielk1977db close 367fda06befSmistachkinforcedelete test.db 3684489f9bdSdanielk1977sqlite3 db test.db 3695bde73c4Sdancatchsql { pragma recursive_triggers = off } 37012b13002Sdanielk1977 37161b487d0Sdrh# Ticket #453. If the SQL ended with "-", the tokenizer was calling that 37261b487d0Sdrh# an incomplete token, which caused problem. The solution was to just call 37361b487d0Sdrh# it a minus sign. 37461b487d0Sdrh# 37561b487d0Sdrhdo_test misc2-8.1 { 37661b487d0Sdrh catchsql {-} 37761b487d0Sdrh} {1 {near "-": syntax error}} 3780f18bfa7Sdrh 3790f18bfa7Sdrh# Ticket #513. Make sure the VDBE stack does not grow on a 3-way join. 3800f18bfa7Sdrh# 38153c0f748Sdanielk1977ifcapable tempdb { 3820f18bfa7Sdrh do_test misc2-9.1 { 3830f18bfa7Sdrh execsql { 3840f18bfa7Sdrh BEGIN; 3850f18bfa7Sdrh CREATE TABLE counts(n INTEGER PRIMARY KEY); 3860f18bfa7Sdrh INSERT INTO counts VALUES(0); 3870f18bfa7Sdrh INSERT INTO counts VALUES(1); 3880f18bfa7Sdrh INSERT INTO counts SELECT n+2 FROM counts; 3890f18bfa7Sdrh INSERT INTO counts SELECT n+4 FROM counts; 3900f18bfa7Sdrh INSERT INTO counts SELECT n+8 FROM counts; 3910f18bfa7Sdrh COMMIT; 3920f18bfa7Sdrh 3930f18bfa7Sdrh CREATE TEMP TABLE x AS 3940f18bfa7Sdrh SELECT dim1.n, dim2.n, dim3.n 3950f18bfa7Sdrh FROM counts AS dim1, counts AS dim2, counts AS dim3 3960f18bfa7Sdrh WHERE dim1.n<10 AND dim2.n<10 AND dim3.n<10; 3970f18bfa7Sdrh 3980f18bfa7Sdrh SELECT count(*) FROM x; 3990f18bfa7Sdrh } 4000f18bfa7Sdrh } {1000} 4010f18bfa7Sdrh do_test misc2-9.2 { 4020f18bfa7Sdrh execsql { 4030f18bfa7Sdrh DROP TABLE x; 4040f18bfa7Sdrh CREATE TEMP TABLE x AS 4050f18bfa7Sdrh SELECT dim1.n, dim2.n, dim3.n 4060f18bfa7Sdrh FROM counts AS dim1, counts AS dim2, counts AS dim3 4070f18bfa7Sdrh WHERE dim1.n>=6 AND dim2.n>=6 AND dim3.n>=6; 4080f18bfa7Sdrh 4090f18bfa7Sdrh SELECT count(*) FROM x; 4100f18bfa7Sdrh } 4110f18bfa7Sdrh } {1000} 4120f18bfa7Sdrh do_test misc2-9.3 { 4130f18bfa7Sdrh execsql { 4140f18bfa7Sdrh DROP TABLE x; 4150f18bfa7Sdrh CREATE TEMP TABLE x AS 4160f18bfa7Sdrh SELECT dim1.n, dim2.n, dim3.n, dim4.n 4170f18bfa7Sdrh FROM counts AS dim1, counts AS dim2, counts AS dim3, counts AS dim4 4180f18bfa7Sdrh WHERE dim1.n<5 AND dim2.n<5 AND dim3.n<5 AND dim4.n<5; 4190f18bfa7Sdrh 4200f18bfa7Sdrh SELECT count(*) FROM x; 4210f18bfa7Sdrh } 4220f18bfa7Sdrh } [expr 5*5*5*5] 42353c0f748Sdanielk1977} 424acf4ac96Sdrh 4257e62779aSdrh# Ticket #1229. Sometimes when a "NEW.X" appears in a SELECT without 4267e62779aSdrh# a FROM clause deep within a trigger, the code generator is unable to 4277e62779aSdrh# trace the NEW.X back to an original table and thus figure out its 4287e62779aSdrh# declared datatype. 4297e62779aSdrh# 4307e62779aSdrh# The SQL code below was causing a segfault. 4317e62779aSdrh# 4323bdca9c9Sdanielk1977ifcapable subquery&&trigger { 4337e62779aSdrh do_test misc2-10.1 { 4347e62779aSdrh execsql { 4357e62779aSdrh CREATE TABLE t1229(x); 4367e62779aSdrh CREATE TRIGGER r1229 BEFORE INSERT ON t1229 BEGIN 4377e62779aSdrh INSERT INTO t1229 SELECT y FROM (SELECT new.x y); 4387e62779aSdrh END; 4397e62779aSdrh INSERT INTO t1229 VALUES(1); 4407e62779aSdrh } 4417e62779aSdrh } {} 4421576cd92Sdanielk1977} 4437e62779aSdrh 444acf4ac96Sdrhfinish_test 445