xref: /sqlite-3.40.0/test/misc2.test (revision 6e5020e8)
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