xref: /sqlite-3.40.0/ext/rtree/rtree1.test (revision d7480403)
1ebaecc14Sdanielk1977# 2008 Feb 19
2ebaecc14Sdanielk1977#
3ebaecc14Sdanielk1977# The author disclaims copyright to this source code.  In place of
4ebaecc14Sdanielk1977# a legal notice, here is a blessing:
5ebaecc14Sdanielk1977#
6ebaecc14Sdanielk1977#    May you do good and not evil.
7ebaecc14Sdanielk1977#    May you find forgiveness for yourself and forgive others.
8ebaecc14Sdanielk1977#    May you share freely, never taking more than you give.
9ebaecc14Sdanielk1977#
10ebaecc14Sdanielk1977#***********************************************************************
11ebaecc14Sdanielk1977#
12ebaecc14Sdanielk1977# The focus of this file is testing the r-tree extension.
13ebaecc14Sdanielk1977#
14ebaecc14Sdanielk1977
15b13dee99Sdanielk1977if {![info exists testdir]} {
16897230ebSdan  set testdir [file join [file dirname [info script]] .. .. test]
17b13dee99Sdanielk1977}
183ddb5a51Sdanielk1977source [file join [file dirname [info script]] rtree_util.tcl]
19ebaecc14Sdanielk1977source $testdir/tester.tcl
2065eb6476Smistachkinset testprefix rtree1
21ebaecc14Sdanielk1977
22ebaecc14Sdanielk1977# Test plan:
23ebaecc14Sdanielk1977#
24ebaecc14Sdanielk1977#   rtree-1.*: Creating/destroying r-tree tables.
25ebaecc14Sdanielk1977#   rtree-2.*: Test the implicit constraints - unique rowid and
26ebaecc14Sdanielk1977#              (coord[N]<=coord[N+1]) for even values of N. Also
27ebaecc14Sdanielk1977#              automatic assigning of rowid values.
28ebaecc14Sdanielk1977#   rtree-3.*: Linear scans of r-tree data.
29ebaecc14Sdanielk1977#   rtree-4.*: Test INSERT
30ebaecc14Sdanielk1977#   rtree-5.*: Test DELETE
31ebaecc14Sdanielk1977#   rtree-6.*: Test UPDATE
32ebaecc14Sdanielk1977#   rtree-7.*: Test renaming an r-tree table.
33ebaecc14Sdanielk1977#   rtree-8.*: Test constrained scans of r-tree data.
34ebaecc14Sdanielk1977#
35c6055c73Sdan#   rtree-12.*: Test that on-conflict clauses are supported.
3657ff60b1Sdan#   rtree-13.*: Test that bug [d2889096e7bdeac6d] has been fixed.
3706f8c635Sdan#   rtree-14.*: Test if a non-integer is inserted into the PK column of an
3806f8c635Sdan#               r-tree table, it is converted to an integer before being
3906f8c635Sdan#               inserted. Also that if a non-numeric is inserted into one
4006f8c635Sdan#               of the min/max dimension columns, it is converted to the
4106f8c635Sdan#               required type before being inserted.
425b09d13aSdan#   rtree-15.*: Check that DROP TABLE works within a transaction that
435b09d13aSdan#               writes to an r-tree table.
44c6055c73Sdan#
45ebaecc14Sdanielk1977
46ebaecc14Sdanielk1977ifcapable !rtree {
47ebaecc14Sdanielk1977  finish_test
48ebaecc14Sdanielk1977  return
49ebaecc14Sdanielk1977}
50ebaecc14Sdanielk1977
51ebaecc14Sdanielk1977#----------------------------------------------------------------------------
52ebaecc14Sdanielk1977# Test cases rtree-1.* test CREATE and DROP table statements.
53ebaecc14Sdanielk1977#
54ebaecc14Sdanielk1977
55ebaecc14Sdanielk1977# Test creating and dropping an rtree table.
56ebaecc14Sdanielk1977#
57ebaecc14Sdanielk1977do_test rtree-1.1.1 {
58ebaecc14Sdanielk1977  execsql { CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2) }
59ebaecc14Sdanielk1977} {}
602e50f670Sdrhdo_test rtree-1.1.2a {
61ebaecc14Sdanielk1977  execsql { SELECT name FROM sqlite_master ORDER BY name }
62ebaecc14Sdanielk1977} {t1 t1_node t1_parent t1_rowid}
632e50f670Sdrhdo_execsql_test rtree-1.1.2b {
642e50f670Sdrh  SELECT name FROM pragma_table_list WHERE type='shadow' ORDER BY name;
652e50f670Sdrh} {t1_node t1_parent t1_rowid}
66ebaecc14Sdanielk1977do_test rtree-1.1.3 {
67ebaecc14Sdanielk1977  execsql {
68ebaecc14Sdanielk1977    DROP TABLE t1;
69ebaecc14Sdanielk1977    SELECT name FROM sqlite_master ORDER BY name;
70ebaecc14Sdanielk1977  }
71ebaecc14Sdanielk1977} {}
72ebaecc14Sdanielk1977
73ebaecc14Sdanielk1977# Test creating and dropping an rtree table with an odd name in
74ebaecc14Sdanielk1977# an attached database.
75ebaecc14Sdanielk1977#
76ebaecc14Sdanielk1977do_test rtree-1.2.1 {
778cf6c554Sdanielk1977  file delete -force test2.db
78ebaecc14Sdanielk1977  execsql {
79ebaecc14Sdanielk1977    ATTACH 'test2.db' AS aux;
80ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE aux.'a" "b' USING rtree(ii, x1, x2, y1, y2);
81ebaecc14Sdanielk1977  }
82ebaecc14Sdanielk1977} {}
83ebaecc14Sdanielk1977do_test rtree-1.2.2 {
84ebaecc14Sdanielk1977  execsql { SELECT name FROM sqlite_master ORDER BY name }
85ebaecc14Sdanielk1977} {}
86ebaecc14Sdanielk1977do_test rtree-1.2.3 {
87ebaecc14Sdanielk1977  execsql { SELECT name FROM aux.sqlite_master ORDER BY name }
88ebaecc14Sdanielk1977} {{a" "b} {a" "b_node} {a" "b_parent} {a" "b_rowid}}
89ebaecc14Sdanielk1977do_test rtree-1.2.4 {
90ebaecc14Sdanielk1977  execsql {
91ebaecc14Sdanielk1977    DROP TABLE aux.'a" "b';
92ebaecc14Sdanielk1977    SELECT name FROM aux.sqlite_master ORDER BY name;
93ebaecc14Sdanielk1977  }
94ebaecc14Sdanielk1977} {}
95ebaecc14Sdanielk1977
96ebaecc14Sdanielk1977# Test that the logic for checking the number of columns specified
97ebaecc14Sdanielk1977# for an rtree table. Acceptable values are odd numbers between 3 and
98ebaecc14Sdanielk1977# 11, inclusive.
99ebaecc14Sdanielk1977#
100ebaecc14Sdanielk1977set cols [list i1 i2 i3 i4 i5 i6 i7 i8 i9 iA iB iC iD iE iF iG iH iI iJ iK]
101ebaecc14Sdanielk1977for {set nCol 1} {$nCol<[llength $cols]} {incr nCol} {
102ebaecc14Sdanielk1977
103ebaecc14Sdanielk1977  set columns [join [lrange $cols 0 [expr {$nCol-1}]] ,]
104ebaecc14Sdanielk1977
105ebaecc14Sdanielk1977  set X {0 {}}
106ebaecc14Sdanielk1977  if {$nCol%2 == 0}  { set X {1 {Wrong number of columns for an rtree table}} }
107ebaecc14Sdanielk1977  if {$nCol < 3}     { set X {1 {Too few columns for an rtree table}} }
108ebaecc14Sdanielk1977  if {$nCol > 11}    { set X {1 {Too many columns for an rtree table}} }
109ebaecc14Sdanielk1977
110ebaecc14Sdanielk1977  do_test rtree-1.3.$nCol {
111ebaecc14Sdanielk1977    catchsql "
112ebaecc14Sdanielk1977      CREATE VIRTUAL TABLE t1 USING rtree($columns);
113ebaecc14Sdanielk1977    "
114ebaecc14Sdanielk1977  } $X
115ebaecc14Sdanielk1977
116ebaecc14Sdanielk1977  catchsql { DROP TABLE t1 }
117ebaecc14Sdanielk1977}
1185102cf8dSdrhdo_catchsql_test rtree-1.3.1000 {
1195102cf8dSdrh  CREATE VIRTUAL TABLE t1000 USING rtree;
1205102cf8dSdrh} {1 {Too few columns for an rtree table}}
121ebaecc14Sdanielk1977
122f439fbdaSdrh# Like execsql except display output as integer where that can be
123f439fbdaSdrh# done without loss of information.
124f439fbdaSdrh#
125f439fbdaSdrhproc execsql_intout {sql} {
126f439fbdaSdrh  set out {}
127f439fbdaSdrh  foreach term [execsql $sql] {
128f439fbdaSdrh    regsub {\.0$} $term {} term
129f439fbdaSdrh    lappend out $term
130f439fbdaSdrh  }
131f439fbdaSdrh  return $out
132f439fbdaSdrh}
133f439fbdaSdrh
134ebaecc14Sdanielk1977# Test that it is possible to open an existing database that contains
135ebaecc14Sdanielk1977# r-tree tables.
136ebaecc14Sdanielk1977#
13765e6b0ddSdrhdo_execsql_test rtree-1.4.1a {
138ebaecc14Sdanielk1977  CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2);
139ebaecc14Sdanielk1977  INSERT INTO t1 VALUES(1, 5.0, 10.0);
14065e6b0ddSdrh  SELECT substr(hex(data),1,40) FROM t1_node;
14165e6b0ddSdrh} {00000001000000000000000140A0000041200000}
14265e6b0ddSdrhdo_execsql_test rtree-1.4.1b {
143ebaecc14Sdanielk1977  INSERT INTO t1 VALUES(2, 15.0, 20.0);
144ebaecc14Sdanielk1977} {}
145ebaecc14Sdanielk1977do_test rtree-1.4.2 {
146ebaecc14Sdanielk1977  db close
147ebaecc14Sdanielk1977  sqlite3 db test.db
148f439fbdaSdrh  execsql_intout { SELECT * FROM t1 ORDER BY ii }
149f439fbdaSdrh} {1 5 10 2 15 20}
150ebaecc14Sdanielk1977do_test rtree-1.4.3 {
151ebaecc14Sdanielk1977  execsql { DROP TABLE t1 }
152ebaecc14Sdanielk1977} {}
153ebaecc14Sdanielk1977
154ebaecc14Sdanielk1977# Test that it is possible to create an r-tree table with ridiculous
155ebaecc14Sdanielk1977# column names.
156ebaecc14Sdanielk1977#
157ebaecc14Sdanielk1977do_test rtree-1.5.1 {
158f439fbdaSdrh  execsql_intout {
159ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t1 USING rtree("the key", "x dim.", "x2'dim");
160ebaecc14Sdanielk1977    INSERT INTO t1 VALUES(1, 2, 3);
161ebaecc14Sdanielk1977    SELECT "the key", "x dim.", "x2'dim" FROM t1;
162ebaecc14Sdanielk1977  }
163f439fbdaSdrh} {1 2 3}
164ebaecc14Sdanielk1977do_test rtree-1.5.1 {
165ebaecc14Sdanielk1977  execsql { DROP TABLE t1 }
166ebaecc14Sdanielk1977} {}
167ebaecc14Sdanielk1977
168ebaecc14Sdanielk1977# Force the r-tree constructor to fail.
169ebaecc14Sdanielk1977#
170ebaecc14Sdanielk1977do_test rtree-1.6.1 {
171ebaecc14Sdanielk1977  execsql { CREATE TABLE t1_rowid(a); }
172ebaecc14Sdanielk1977  catchsql {
173ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t1 USING rtree("the key", "x dim.", "x2'dim");
174ebaecc14Sdanielk1977  }
1759f86ad23Sdrh} {1 {table "t1_rowid" already exists}}
176ebaecc14Sdanielk1977do_test rtree-1.6.1 {
177ebaecc14Sdanielk1977  execsql { DROP TABLE t1_rowid }
178ebaecc14Sdanielk1977} {}
179ebaecc14Sdanielk1977
180ebaecc14Sdanielk1977#----------------------------------------------------------------------------
181ebaecc14Sdanielk1977# Test cases rtree-2.*
182ebaecc14Sdanielk1977#
183ebaecc14Sdanielk1977do_test rtree-2.1.1 {
184ebaecc14Sdanielk1977  execsql {
185ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
186ebaecc14Sdanielk1977    SELECT * FROM t1;
187ebaecc14Sdanielk1977  }
188ebaecc14Sdanielk1977} {}
189ebaecc14Sdanielk1977
190ebaecc14Sdanielk1977do_test rtree-2.1.2 {
191ebaecc14Sdanielk1977  execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
192f439fbdaSdrh  execsql_intout { SELECT * FROM t1 }
193f439fbdaSdrh} {1 1 3 2 4}
194ebaecc14Sdanielk1977do_test rtree-2.1.3 {
195ebaecc14Sdanielk1977  execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
196ebaecc14Sdanielk1977  execsql { SELECT rowid FROM t1 ORDER BY rowid }
197ebaecc14Sdanielk1977} {1 2}
198ebaecc14Sdanielk1977do_test rtree-2.1.3 {
199ebaecc14Sdanielk1977  execsql { INSERT INTO t1 VALUES(NULL, 1, 3, 2, 4) }
200ebaecc14Sdanielk1977  execsql { SELECT ii FROM t1 ORDER BY ii }
201ebaecc14Sdanielk1977} {1 2 3}
202ebaecc14Sdanielk1977
203ebaecc14Sdanielk1977do_test rtree-2.2.1 {
204ebaecc14Sdanielk1977  catchsql { INSERT INTO t1 VALUES(2, 1, 3, 2, 4) }
2055782bc27Sdan} {1 {UNIQUE constraint failed: t1.ii}}
206ebaecc14Sdanielk1977do_test rtree-2.2.2 {
207ebaecc14Sdanielk1977  catchsql { INSERT INTO t1 VALUES(4, 1, 3, 4, 2) }
2085782bc27Sdan} {1 {rtree constraint failed: t1.(y1<=y2)}}
209ebaecc14Sdanielk1977do_test rtree-2.2.3 {
210ebaecc14Sdanielk1977  catchsql { INSERT INTO t1 VALUES(4, 3, 1, 2, 4) }
2115782bc27Sdan} {1 {rtree constraint failed: t1.(x1<=x2)}}
212ebaecc14Sdanielk1977do_test rtree-2.2.4 {
213ebaecc14Sdanielk1977  execsql { SELECT ii FROM t1 ORDER BY ii }
214ebaecc14Sdanielk1977} {1 2 3}
215ebaecc14Sdanielk1977
216ebaecc14Sdanielk1977do_test rtree-2.X {
217ebaecc14Sdanielk1977  execsql { DROP TABLE t1 }
218ebaecc14Sdanielk1977} {}
219ebaecc14Sdanielk1977
220ebaecc14Sdanielk1977#----------------------------------------------------------------------------
221ebaecc14Sdanielk1977# Test cases rtree-3.* test linear scans of r-tree table data. To test
222ebaecc14Sdanielk1977# this we have to insert some data into an r-tree, but that is not the
223ebaecc14Sdanielk1977# focus of these tests.
224ebaecc14Sdanielk1977#
225ebaecc14Sdanielk1977do_test rtree-3.1.1 {
226ebaecc14Sdanielk1977  execsql {
227ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
228ebaecc14Sdanielk1977    SELECT * FROM t1;
229ebaecc14Sdanielk1977  }
230ebaecc14Sdanielk1977} {}
231ebaecc14Sdanielk1977do_test rtree-3.1.2 {
232f439fbdaSdrh  execsql_intout {
233ebaecc14Sdanielk1977    INSERT INTO t1 VALUES(5, 1, 3, 2, 4);
234ebaecc14Sdanielk1977    SELECT * FROM t1;
235ebaecc14Sdanielk1977  }
236f439fbdaSdrh} {5 1 3 2 4}
237ebaecc14Sdanielk1977do_test rtree-3.1.3 {
238f439fbdaSdrh  execsql_intout {
239ebaecc14Sdanielk1977    INSERT INTO t1 VALUES(6, 2, 6, 4, 8);
240ebaecc14Sdanielk1977    SELECT * FROM t1;
241ebaecc14Sdanielk1977  }
242f439fbdaSdrh} {5 1 3 2 4 6 2 6 4 8}
243ebaecc14Sdanielk1977
244ebaecc14Sdanielk1977# Test the constraint on the coordinates (c[i]<=c[i+1] where (i%2==0)):
245ebaecc14Sdanielk1977do_test rtree-3.2.1 {
246ebaecc14Sdanielk1977  catchsql { INSERT INTO t1 VALUES(7, 2, 6, 4, 3) }
2475782bc27Sdan} {1 {rtree constraint failed: t1.(y1<=y2)}}
248ebaecc14Sdanielk1977do_test rtree-3.2.2 {
249ebaecc14Sdanielk1977  catchsql { INSERT INTO t1 VALUES(8, 2, 6, 3, 3) }
250ebaecc14Sdanielk1977} {0 {}}
251ebaecc14Sdanielk1977
252ebaecc14Sdanielk1977#----------------------------------------------------------------------------
253ebaecc14Sdanielk1977# Test cases rtree-5.* test DELETE operations.
254ebaecc14Sdanielk1977#
255ebaecc14Sdanielk1977do_test rtree-5.1.1 {
256ebaecc14Sdanielk1977  execsql { CREATE VIRTUAL TABLE t2 USING rtree(ii, x1, x2) }
257ebaecc14Sdanielk1977} {}
258ebaecc14Sdanielk1977do_test rtree-5.1.2 {
259f439fbdaSdrh  execsql_intout {
260ebaecc14Sdanielk1977    INSERT INTO t2 VALUES(1, 10, 20);
261ebaecc14Sdanielk1977    INSERT INTO t2 VALUES(2, 30, 40);
262ebaecc14Sdanielk1977    INSERT INTO t2 VALUES(3, 50, 60);
263ebaecc14Sdanielk1977    SELECT * FROM t2 ORDER BY ii;
264ebaecc14Sdanielk1977  }
265f439fbdaSdrh} {1 10 20 2 30 40 3 50 60}
266ebaecc14Sdanielk1977do_test rtree-5.1.3 {
267f439fbdaSdrh  execsql_intout {
268ebaecc14Sdanielk1977    DELETE FROM t2 WHERE ii=2;
269ebaecc14Sdanielk1977    SELECT * FROM t2 ORDER BY ii;
270ebaecc14Sdanielk1977  }
271f439fbdaSdrh} {1 10 20 3 50 60}
272ebaecc14Sdanielk1977do_test rtree-5.1.4 {
273f439fbdaSdrh  execsql_intout {
274ebaecc14Sdanielk1977    DELETE FROM t2 WHERE ii=1;
275ebaecc14Sdanielk1977    SELECT * FROM t2 ORDER BY ii;
276ebaecc14Sdanielk1977  }
277f439fbdaSdrh} {3 50 60}
278ebaecc14Sdanielk1977do_test rtree-5.1.5 {
279ebaecc14Sdanielk1977  execsql {
280ebaecc14Sdanielk1977    DELETE FROM t2 WHERE ii=3;
281ebaecc14Sdanielk1977    SELECT * FROM t2 ORDER BY ii;
282ebaecc14Sdanielk1977  }
283ebaecc14Sdanielk1977} {}
284ebaecc14Sdanielk1977do_test rtree-5.1.6 {
285ebaecc14Sdanielk1977  execsql { SELECT * FROM t2_rowid }
286ebaecc14Sdanielk1977} {}
287ebaecc14Sdanielk1977
288ebaecc14Sdanielk1977#----------------------------------------------------------------------------
289ebaecc14Sdanielk1977# Test cases rtree-5.* test UPDATE operations.
290ebaecc14Sdanielk1977#
291ebaecc14Sdanielk1977do_test rtree-6.1.1 {
292ebaecc14Sdanielk1977  execsql { CREATE VIRTUAL TABLE t3 USING rtree(ii, x1, x2, y1, y2) }
293ebaecc14Sdanielk1977} {}
294ebaecc14Sdanielk1977do_test rtree-6.1.2 {
295f439fbdaSdrh  execsql_intout {
296ebaecc14Sdanielk1977    INSERT INTO t3 VALUES(1, 2, 3, 4, 5);
297ebaecc14Sdanielk1977    UPDATE t3 SET x2=5;
298ebaecc14Sdanielk1977    SELECT * FROM t3;
299ebaecc14Sdanielk1977  }
300f439fbdaSdrh} {1 2 5 4 5}
301ebaecc14Sdanielk1977do_test rtree-6.1.3 {
302ebaecc14Sdanielk1977  execsql { UPDATE t3 SET ii = 2 }
303f439fbdaSdrh  execsql_intout { SELECT * FROM t3 }
304f439fbdaSdrh} {2 2 5 4 5}
305ebaecc14Sdanielk1977
306ebaecc14Sdanielk1977#----------------------------------------------------------------------------
307ebaecc14Sdanielk1977# Test cases rtree-7.* test rename operations.
308ebaecc14Sdanielk1977#
309ebaecc14Sdanielk1977do_test rtree-7.1.1 {
310ebaecc14Sdanielk1977  execsql {
311ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t4 USING rtree(ii, x1, x2, y1, y2, z1, z2);
312ebaecc14Sdanielk1977    INSERT INTO t4 VALUES(1, 2, 3, 4, 5, 6, 7);
313ebaecc14Sdanielk1977  }
314ebaecc14Sdanielk1977} {}
315ebaecc14Sdanielk1977do_test rtree-7.1.2 {
316ebaecc14Sdanielk1977  execsql { ALTER TABLE t4 RENAME TO t5 }
317f439fbdaSdrh  execsql_intout { SELECT * FROM t5 }
318f439fbdaSdrh} {1 2 3 4 5 6 7}
319ebaecc14Sdanielk1977do_test rtree-7.1.3 {
320ebaecc14Sdanielk1977  db close
321ebaecc14Sdanielk1977  sqlite3 db test.db
322f439fbdaSdrh  execsql_intout { SELECT * FROM t5 }
323f439fbdaSdrh} {1 2 3 4 5 6 7}
324ebaecc14Sdanielk1977do_test rtree-7.1.4 {
325ebaecc14Sdanielk1977  execsql { ALTER TABLE t5 RENAME TO 'raisara "one"'''}
326f439fbdaSdrh  execsql_intout { SELECT * FROM "raisara ""one""'" }
327f439fbdaSdrh} {1 2 3 4 5 6 7}
328ebaecc14Sdanielk1977do_test rtree-7.1.5 {
329f439fbdaSdrh  execsql_intout { SELECT * FROM 'raisara "one"''' }
330f439fbdaSdrh} {1 2 3 4 5 6 7}
331ebaecc14Sdanielk1977do_test rtree-7.1.6 {
332ebaecc14Sdanielk1977  execsql { ALTER TABLE "raisara ""one""'" RENAME TO "abc 123" }
333f439fbdaSdrh  execsql_intout { SELECT * FROM "abc 123" }
334f439fbdaSdrh} {1 2 3 4 5 6 7}
335ebaecc14Sdanielk1977do_test rtree-7.1.7 {
336ebaecc14Sdanielk1977  db close
337ebaecc14Sdanielk1977  sqlite3 db test.db
338f439fbdaSdrh  execsql_intout { SELECT * FROM "abc 123" }
339f439fbdaSdrh} {1 2 3 4 5 6 7}
340ebaecc14Sdanielk1977
341ebaecc14Sdanielk1977# An error midway through a rename operation.
342ebaecc14Sdanielk1977do_test rtree-7.2.1 {
343ebaecc14Sdanielk1977  execsql {
344ebaecc14Sdanielk1977    CREATE TABLE t4_node(a);
345ebaecc14Sdanielk1977  }
346ebaecc14Sdanielk1977  catchsql { ALTER TABLE "abc 123" RENAME TO t4 }
347a690ff36Sdrh} {1 {SQL logic error}}
348ebaecc14Sdanielk1977do_test rtree-7.2.2 {
349f439fbdaSdrh  execsql_intout { SELECT * FROM "abc 123" }
350f439fbdaSdrh} {1 2 3 4 5 6 7}
351ebaecc14Sdanielk1977do_test rtree-7.2.3 {
352ebaecc14Sdanielk1977  execsql {
353ebaecc14Sdanielk1977    DROP TABLE t4_node;
354ebaecc14Sdanielk1977    CREATE TABLE t4_rowid(a);
355ebaecc14Sdanielk1977  }
356ebaecc14Sdanielk1977  catchsql { ALTER TABLE "abc 123" RENAME TO t4 }
357a690ff36Sdrh} {1 {SQL logic error}}
358ebaecc14Sdanielk1977do_test rtree-7.2.4 {
359ebaecc14Sdanielk1977  db close
360ebaecc14Sdanielk1977  sqlite3 db test.db
361f439fbdaSdrh  execsql_intout { SELECT * FROM "abc 123" }
362f439fbdaSdrh} {1 2 3 4 5 6 7}
363ebaecc14Sdanielk1977do_test rtree-7.2.5 {
364ebaecc14Sdanielk1977  execsql { DROP TABLE t4_rowid }
365ebaecc14Sdanielk1977  execsql { ALTER TABLE "abc 123" RENAME TO t4 }
366f439fbdaSdrh  execsql_intout { SELECT * FROM t4 }
367f439fbdaSdrh} {1 2 3 4 5 6 7}
368ebaecc14Sdanielk1977
369ebaecc14Sdanielk1977
370ebaecc14Sdanielk1977#----------------------------------------------------------------------------
371ebaecc14Sdanielk1977# Test cases rtree-8.*
372ebaecc14Sdanielk1977#
373ebaecc14Sdanielk1977
374ebaecc14Sdanielk1977# Test that the function to determine if a leaf cell is part of the
375ebaecc14Sdanielk1977# result set works.
376ebaecc14Sdanielk1977do_test rtree-8.1.1 {
377ebaecc14Sdanielk1977  execsql {
378ebaecc14Sdanielk1977    CREATE VIRTUAL TABLE t6 USING rtree(ii, x1, x2);
379ebaecc14Sdanielk1977    INSERT INTO t6 VALUES(1, 3, 7);
380ebaecc14Sdanielk1977    INSERT INTO t6 VALUES(2, 4, 6);
381ebaecc14Sdanielk1977  }
382ebaecc14Sdanielk1977} {}
383ebaecc14Sdanielk1977do_test rtree-8.1.2 { execsql { SELECT ii FROM t6 WHERE x1>2 } }   {1 2}
384ebaecc14Sdanielk1977do_test rtree-8.1.3 { execsql { SELECT ii FROM t6 WHERE x1>3 } }   {2}
385ebaecc14Sdanielk1977do_test rtree-8.1.4 { execsql { SELECT ii FROM t6 WHERE x1>4 } }   {}
386ebaecc14Sdanielk1977do_test rtree-8.1.5 { execsql { SELECT ii FROM t6 WHERE x1>5 } }   {}
387674a9b34Sdrhdo_test rtree-8.1.6 { execsql { SELECT ii FROM t6 WHERE x1>''} }   {}
388674a9b34Sdrhdo_test rtree-8.1.7 { execsql { SELECT ii FROM t6 WHERE x1>null}}  {}
389e5748a55Sdrhdo_test rtree-8.1.8 { execsql { SELECT ii FROM t6 WHERE x1>'2'} }   {1 2}
390e5748a55Sdrhdo_test rtree-8.1.9 { execsql { SELECT ii FROM t6 WHERE x1>'3'} }   {2}
391674a9b34Sdrhdo_test rtree-8.2.2 { execsql { SELECT ii FROM t6 WHERE x1>=2 } }  {1 2}
392674a9b34Sdrhdo_test rtree-8.2.3 { execsql { SELECT ii FROM t6 WHERE x1>=3 } }  {1 2}
393674a9b34Sdrhdo_test rtree-8.2.4 { execsql { SELECT ii FROM t6 WHERE x1>=4 } }  {2}
394674a9b34Sdrhdo_test rtree-8.2.5 { execsql { SELECT ii FROM t6 WHERE x1>=5 } }  {}
395674a9b34Sdrhdo_test rtree-8.2.6 { execsql { SELECT ii FROM t6 WHERE x1>=''} }  {}
396674a9b34Sdrhdo_test rtree-8.2.7 { execsql { SELECT ii FROM t6 WHERE x1>=null}} {}
397e5748a55Sdrhdo_test rtree-8.2.8 { execsql { SELECT ii FROM t6 WHERE x1>='4'} } {2}
398e5748a55Sdrhdo_test rtree-8.2.9 { execsql { SELECT ii FROM t6 WHERE x1>='5'} } {}
399674a9b34Sdrhdo_test rtree-8.3.2 { execsql { SELECT ii FROM t6 WHERE x1<2 } }   {}
400674a9b34Sdrhdo_test rtree-8.3.3 { execsql { SELECT ii FROM t6 WHERE x1<3 } }   {}
401674a9b34Sdrhdo_test rtree-8.3.4 { execsql { SELECT ii FROM t6 WHERE x1<4 } }   {1}
402674a9b34Sdrhdo_test rtree-8.3.5 { execsql { SELECT ii FROM t6 WHERE x1<5 } }   {1 2}
403674a9b34Sdrhdo_test rtree-8.3.6 { execsql { SELECT ii FROM t6 WHERE x1<''} }   {1 2}
404674a9b34Sdrhdo_test rtree-8.3.7 { execsql { SELECT ii FROM t6 WHERE x1<null}}  {}
405e5748a55Sdrhdo_test rtree-8.3.8 { execsql { SELECT ii FROM t6 WHERE x1<'3'} }  {}
406e5748a55Sdrhdo_test rtree-8.3.9 { execsql { SELECT ii FROM t6 WHERE x1<'4'} }  {1}
407674a9b34Sdrhdo_test rtree-8.4.2 { execsql { SELECT ii FROM t6 WHERE x1<=2 } }  {}
408674a9b34Sdrhdo_test rtree-8.4.3 { execsql { SELECT ii FROM t6 WHERE x1<=3 } }  {1}
409674a9b34Sdrhdo_test rtree-8.4.4 { execsql { SELECT ii FROM t6 WHERE x1<=4 } }  {1 2}
410674a9b34Sdrhdo_test rtree-8.4.5 { execsql { SELECT ii FROM t6 WHERE x1<=5 } }  {1 2}
411674a9b34Sdrhdo_test rtree-8.4.6 { execsql { SELECT ii FROM t6 WHERE x1<=''} }  {1 2}
412674a9b34Sdrhdo_test rtree-8.4.7 { execsql { SELECT ii FROM t6 WHERE x1<=null}} {}
413674a9b34Sdrhdo_test rtree-8.5.2 { execsql { SELECT ii FROM t6 WHERE x1=2 } }   {}
414674a9b34Sdrhdo_test rtree-8.5.3 { execsql { SELECT ii FROM t6 WHERE x1=3 } }   {1}
415674a9b34Sdrhdo_test rtree-8.5.4 { execsql { SELECT ii FROM t6 WHERE x1=4 } }   {2}
416674a9b34Sdrhdo_test rtree-8.5.5 { execsql { SELECT ii FROM t6 WHERE x1=5 } }   {}
417674a9b34Sdrhdo_test rtree-8.5.6 { execsql { SELECT ii FROM t6 WHERE x1=''} }   {}
418674a9b34Sdrhdo_test rtree-8.5.7 { execsql { SELECT ii FROM t6 WHERE x1=null}}  {}
419ebaecc14Sdanielk1977
420e5748a55Sdrh
4217974759cSdanielk1977#----------------------------------------------------------------------------
4227974759cSdanielk1977# Test cases rtree-9.*
4237974759cSdanielk1977#
4247974759cSdanielk1977# Test that ticket #3549 is fixed.
4257974759cSdanielk1977do_test rtree-9.1 {
4267974759cSdanielk1977  execsql {
4277974759cSdanielk1977    CREATE TABLE foo (id INTEGER PRIMARY KEY);
4287974759cSdanielk1977    CREATE VIRTUAL TABLE bar USING rtree (id, minX, maxX, minY, maxY);
4297974759cSdanielk1977    INSERT INTO foo VALUES (null);
4307974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4317974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4327974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4337974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4347974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4357974759cSdanielk1977    INSERT INTO foo SELECT null FROM foo;
4367974759cSdanielk1977    DELETE FROM foo WHERE id > 40;
4377974759cSdanielk1977    INSERT INTO bar SELECT NULL, 0, 0, 0, 0 FROM foo;
4387974759cSdanielk1977  }
4397974759cSdanielk1977} {}
4407974759cSdanielk1977
4417974759cSdanielk1977# This used to crash.
4427974759cSdanielk1977do_test rtree-9.2 {
4437974759cSdanielk1977  execsql {
4447974759cSdanielk1977    SELECT count(*) FROM bar b1, bar b2, foo s1 WHERE s1.id = b1.id;
4457974759cSdanielk1977  }
4467974759cSdanielk1977} {1600}
4477974759cSdanielk1977do_test rtree-9.3 {
4487974759cSdanielk1977  execsql {
4497974759cSdanielk1977    SELECT count(*) FROM bar b1, bar b2, foo s1
4507974759cSdanielk1977    WHERE b1.minX <= b2.maxX AND s1.id = b1.id;
4517974759cSdanielk1977  }
4527974759cSdanielk1977} {1600}
453ebaecc14Sdanielk1977
45433c54a98Sdanielk1977#-------------------------------------------------------------------------
45533c54a98Sdanielk1977# Ticket #3970: Check that the error message is meaningful when a
45633c54a98Sdanielk1977# keyword is used as a column name.
45733c54a98Sdanielk1977#
45833c54a98Sdanielk1977do_test rtree-10.1 {
45933c54a98Sdanielk1977  catchsql { CREATE VIRTUAL TABLE t7 USING rtree(index, x1, y1, x2, y2) }
46033c54a98Sdanielk1977} {1 {near "index": syntax error}}
46133c54a98Sdanielk1977
4623f0d9d38Sdan#-------------------------------------------------------------------------
4633f0d9d38Sdan# Test last_insert_rowid().
4643f0d9d38Sdan#
4653f0d9d38Sdando_test rtree-11.1 {
4663f0d9d38Sdan  execsql {
4673f0d9d38Sdan    CREATE VIRTUAL TABLE t8 USING rtree(idx, x1, x2, y1, y2);
4683f0d9d38Sdan    INSERT INTO t8 VALUES(1, 1.0, 1.0, 2.0, 2.0);
4693f0d9d38Sdan    SELECT last_insert_rowid();
4703f0d9d38Sdan  }
4713f0d9d38Sdan} {1}
4723f0d9d38Sdando_test rtree-11.2 {
4733f0d9d38Sdan  execsql {
4743f0d9d38Sdan    INSERT INTO t8 VALUES(NULL, 1.0, 1.0, 2.0, 2.0);
4753f0d9d38Sdan    SELECT last_insert_rowid();
4763f0d9d38Sdan  }
4773f0d9d38Sdan} {2}
4783f0d9d38Sdan
479c6055c73Sdan#-------------------------------------------------------------------------
480c6055c73Sdan# Test on-conflict clause handling.
481c6055c73Sdan#
482c6055c73Sdandb_delete_and_reopen
48365e6b0ddSdrhdo_execsql_test 12.0.1 {
484c6055c73Sdan  CREATE VIRTUAL TABLE t1 USING rtree_i32(idx, x1, x2, y1, y2);
485c6055c73Sdan  INSERT INTO t1 VALUES(1,   1, 2, 3, 4);
48665e6b0ddSdrh  SELECT substr(hex(data),1,56) FROM t1_node;
48765e6b0ddSdrh} {00000001000000000000000100000001000000020000000300000004}
48865e6b0ddSdrhdo_execsql_test 12.0.2 {
489c6055c73Sdan  INSERT INTO t1 VALUES(2,   2, 3, 4, 5);
490c6055c73Sdan  INSERT INTO t1 VALUES(3,   3, 4, 5, 6);
491c6055c73Sdan
492c6055c73Sdan  CREATE TABLE source(idx, x1, x2, y1, y2);
493c6055c73Sdan  INSERT INTO source VALUES(5, 8, 8, 8, 8);
494c6055c73Sdan  INSERT INTO source VALUES(2, 7, 7, 7, 7);
495c6055c73Sdan}
496c6055c73Sdandb_save_and_close
497c6055c73Sdanforeach {tn sql_template testdata} {
498c6055c73Sdan  1    "INSERT %CONF% INTO t1 VALUES(2, 7, 7, 7, 7)" {
499c6055c73Sdan    ROLLBACK 0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
500c6055c73Sdan    ABORT    0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
501c6055c73Sdan    IGNORE   0 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
502c6055c73Sdan    FAIL     0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
503c6055c73Sdan    REPLACE  0 0 {1 1 2 3 4   2 7 7 7 7   3 3 4 5 6   4 4 5 6 7}
504c6055c73Sdan  }
505c6055c73Sdan
506c6055c73Sdan  2    "INSERT %CONF% INTO t1 SELECT * FROM source" {
507c6055c73Sdan    ROLLBACK 1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
508c6055c73Sdan    ABORT    1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
509c6055c73Sdan    IGNORE   1 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
510c6055c73Sdan    FAIL     1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
511c6055c73Sdan    REPLACE  1 0 {1 1 2 3 4   2 7 7 7 7   3 3 4 5 6   4 4 5 6 7  5 8 8 8 8}
512c6055c73Sdan  }
513c6055c73Sdan
514c6055c73Sdan  3    "UPDATE %CONF% t1 SET idx = 2 WHERE idx = 4" {
515338e311aSdrh    ROLLBACK 0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
516338e311aSdrh    ABORT    0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
517338e311aSdrh    IGNORE   0 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
518338e311aSdrh    FAIL     0 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
519338e311aSdrh    REPLACE  0 0 {1 1 2 3 4   2 4 5 6 7   3 3 4 5 6}
520c6055c73Sdan  }
521c6055c73Sdan
522c6055c73Sdan  3    "UPDATE %CONF% t1 SET idx = ((idx+1)%5)+1 WHERE idx > 2" {
523c6055c73Sdan    ROLLBACK 1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
524c6055c73Sdan    ABORT    1 1 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
525c6055c73Sdan    IGNORE   1 0 {1 1 2 3 4   2 2 3 4 5               4 4 5 6 7   5 3 4 5 6}
526c6055c73Sdan    FAIL     1 1 {1 1 2 3 4   2 2 3 4 5               4 4 5 6 7   5 3 4 5 6}
527c6055c73Sdan    REPLACE  1 0 {1 4 5 6 7   2 2 3 4 5                           5 3 4 5 6}
528c6055c73Sdan  }
529c6055c73Sdan
530c6055c73Sdan  4    "INSERT %CONF% INTO t1 VALUES(2, 7, 6, 7, 7)" {
5315782bc27Sdan    ROLLBACK 0 2 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6}
5325782bc27Sdan    ABORT    0 2 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
533c6055c73Sdan    IGNORE   0 0 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
5345782bc27Sdan    FAIL     0 2 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
5355782bc27Sdan    REPLACE  0 2 {1 1 2 3 4   2 2 3 4 5   3 3 4 5 6   4 4 5 6 7}
536c6055c73Sdan  }
537c6055c73Sdan
538c6055c73Sdan} {
539c6055c73Sdan  foreach {mode uses error data} $testdata {
540c6055c73Sdan    db_restore_and_reopen
541c6055c73Sdan
542c6055c73Sdan    set sql [string map [list %CONF% "OR $mode"] $sql_template]
543c6055c73Sdan    set testname "12.$tn.[string tolower $mode]"
544c6055c73Sdan
545c6055c73Sdan    execsql {
546c6055c73Sdan      BEGIN;
547c6055c73Sdan        INSERT INTO t1 VALUES(4,   4, 5, 6, 7);
548c6055c73Sdan    }
549c6055c73Sdan
550c6055c73Sdan    set res(0) {0 {}}
5515782bc27Sdan    set res(1) {1 {UNIQUE constraint failed: t1.idx}}
5525782bc27Sdan    set res(2) {1 {rtree constraint failed: t1.(x1<=x2)}}
5535782bc27Sdan
554c6055c73Sdan    do_catchsql_test $testname.1 $sql $res($error)
555c6055c73Sdan    do_test $testname.2 [list sql_uses_stmt db $sql] $uses
556c6055c73Sdan    do_execsql_test $testname.3 { SELECT * FROM t1 ORDER BY idx } $data
557c6055c73Sdan
5581917e92fSdan    do_rtree_integrity_test $testname.4 t1
559c6055c73Sdan    db close
560c6055c73Sdan  }
561c6055c73Sdan}
56257ff60b1Sdan
56357ff60b1Sdan#-------------------------------------------------------------------------
56457ff60b1Sdan# Test that bug [d2889096e7bdeac6d] has been fixed.
56557ff60b1Sdan#
56657ff60b1Sdanreset_db
56757ff60b1Sdando_execsql_test 13.1 {
56857ff60b1Sdan  CREATE VIRTUAL TABLE t9 USING rtree(id, xmin, xmax);
56957ff60b1Sdan  INSERT INTO t9 VALUES(1,0,0);
57057ff60b1Sdan  INSERT INTO t9 VALUES(2,0,0);
57157ff60b1Sdan  SELECT * FROM t9 WHERE id IN (1, 2);
57257ff60b1Sdan} {1 0.0 0.0 2 0.0 0.0}
57357ff60b1Sdan
57457ff60b1Sdando_execsql_test 13.2 {
57557ff60b1Sdan  WITH r(x) AS (
57657ff60b1Sdan    SELECT 1 UNION ALL
57757ff60b1Sdan    SELECT 2 UNION ALL
57857ff60b1Sdan    SELECT 3
57957ff60b1Sdan  )
58057ff60b1Sdan  SELECT * FROM r CROSS JOIN t9 WHERE id=x;
58157ff60b1Sdan} {1 1 0.0 0.0 2 2 0.0 0.0}
58257ff60b1Sdan
58306f8c635Sdan#-------------------------------------------------------------------------
58406f8c635Sdan# Test if a non-integer is inserted into the PK column of an r-tree
58506f8c635Sdan# table, it is converted to an integer before being inserted. Also
58606f8c635Sdan# that if a non-numeric is inserted into one of the min/max dimension
58706f8c635Sdan# columns, it is converted to the required type before being inserted.
58806f8c635Sdan#
58906f8c635Sdando_execsql_test 14.1 {
59006f8c635Sdan  CREATE VIRTUAL TABLE t10 USING rtree(ii, x1, x2);
59106f8c635Sdan}
59206f8c635Sdan
59306f8c635Sdando_execsql_test 14.2 {
59406f8c635Sdan  INSERT INTO t10 VALUES(NULL,   1, 2);
59506f8c635Sdan  INSERT INTO t10 VALUES(NULL,   2, 3);
59606f8c635Sdan  INSERT INTO t10 VALUES('4xxx', 3, 4);
59706f8c635Sdan  INSERT INTO t10 VALUES(5.0,    4, 5);
59806f8c635Sdan  INSERT INTO t10 VALUES(6.4,    5, 6);
59906f8c635Sdan}
60006f8c635Sdando_execsql_test 14.3 {
60106f8c635Sdan  SELECT * FROM t10;
60206f8c635Sdan} {
60306f8c635Sdan  1 1.0 2.0   2 2.0 3.0   4 3.0 4.0   5 4.0 5.0   6 5.0 6.0
60406f8c635Sdan}
60506f8c635Sdan
60606f8c635Sdando_execsql_test 14.4 {
60706f8c635Sdan  DELETE FROM t10;
60806f8c635Sdan  INSERT INTO t10 VALUES(1, 'one', 'two');
60906f8c635Sdan  INSERT INTO t10 VALUES(2, '52xyz', '81...');
61006f8c635Sdan}
61106f8c635Sdando_execsql_test 14.5 {
61206f8c635Sdan  SELECT * FROM t10;
61306f8c635Sdan} {
61406f8c635Sdan  1 0.0 0.0
61506f8c635Sdan  2 52.0 81.0
61606f8c635Sdan}
617348d7f64Sdrhdo_execsql_test 14.6 {
618348d7f64Sdrh  INSERT INTO t10 VALUES(0,10,20);
619348d7f64Sdrh  SELECT * FROM t10 WHERE ii=NULL;
620348d7f64Sdrh} {}
621348d7f64Sdrhdo_execsql_test 14.7 {
622348d7f64Sdrh  SELECT * FROM t10 WHERE ii='xyz';
623348d7f64Sdrh} {}
624348d7f64Sdrhdo_execsql_test 14.8 {
625348d7f64Sdrh  SELECT * FROM t10 WHERE ii='0.0';
626348d7f64Sdrh} {0 10.0 20.0}
627348d7f64Sdrhdo_execsql_test 14.9 {
628348d7f64Sdrh  SELECT * FROM t10 WHERE ii=0.0;
629348d7f64Sdrh} {0 10.0 20.0}
63006f8c635Sdan
631348d7f64Sdrh
632348d7f64Sdrhdo_execsql_test 14.104 {
63306f8c635Sdan  DROP TABLE t10;
63406f8c635Sdan  CREATE VIRTUAL TABLE t10 USING rtree_i32(ii, x1, x2);
63506f8c635Sdan  INSERT INTO t10 VALUES(1, 'one', 'two');
63606f8c635Sdan  INSERT INTO t10 VALUES(2, '52xyz', '81...');
63706f8c635Sdan  INSERT INTO t10 VALUES(3, 42.3, 49.9);
63806f8c635Sdan}
639348d7f64Sdrhdo_execsql_test 14.105 {
64006f8c635Sdan  SELECT * FROM t10;
64106f8c635Sdan} {
64206f8c635Sdan  1 0 0
64306f8c635Sdan  2 52 81
64406f8c635Sdan  3 42 49
64506f8c635Sdan}
64606f8c635Sdan
6475b09d13aSdan#-------------------------------------------------------------------------
6485b09d13aSdan#
6495b09d13aSdando_execsql_test 15.0 {
6505b09d13aSdan  CREATE VIRTUAL TABLE rt USING rtree(id, x1,x2, y1,y2);
6515b09d13aSdan  CREATE TEMP TABLE t13(a, b, c);
6525b09d13aSdan}
6535b09d13aSdando_execsql_test 15.1 {
6545b09d13aSdan  BEGIN;
6555b09d13aSdan  INSERT INTO rt VALUES(1,2,3,4,5);
6565b09d13aSdan}
6575b09d13aSdando_execsql_test 15.2 {
6585b09d13aSdan  DROP TABLE t13;
6595b09d13aSdan  COMMIT;
6605b09d13aSdan}
6615b09d13aSdan
662252f3961Sdrh# Test cases for the new auxiliary columns feature
663252f3961Sdrh#
664252f3961Sdrhdo_catchsql_test 16.100 {
665252f3961Sdrh  CREATE VIRTUAL TABLE t16 USING rtree(id,x0,x1,y0,+aux1,x1);
666252f3961Sdrh} {1 {Auxiliary rtree columns must be last}}
667252f3961Sdrhdo_test 16.110 {
668252f3961Sdrh  set sql {
669252f3961Sdrh    CREATE VIRTUAL TABLE t16 USING rtree(
670252f3961Sdrh      id, x00, x01, x10, x11, x20, x21, x30, x31, x40, x41
671252f3961Sdrh  }
672252f3961Sdrh  for {set i 12} {$i<=100} {incr i} {
673252f3961Sdrh     append sql ", +a$i"
674252f3961Sdrh  }
675252f3961Sdrh  append sql ");"
676252f3961Sdrh  execsql $sql
677252f3961Sdrh} {}
678252f3961Sdrhdo_test 16.120 {
679252f3961Sdrh  set sql {
680252f3961Sdrh    CREATE VIRTUAL TABLE t16b USING rtree(
681252f3961Sdrh      id, x00, x01, x10, x11, x20, x21, x30, x31, x40, x41
682252f3961Sdrh  }
683252f3961Sdrh  for {set i 12} {$i<=101} {incr i} {
684252f3961Sdrh     append sql ", +a$i"
685252f3961Sdrh  }
686252f3961Sdrh  append sql ");"
687252f3961Sdrh  catchsql $sql
688252f3961Sdrh} {1 {Too many columns for an rtree table}}
689252f3961Sdrh
690136c9903Sdrhdo_execsql_test 16.130 {
691136c9903Sdrh  DROP TABLE IF EXISTS rt1;
692136c9903Sdrh  CREATE VIRTUAL TABLE rt1 USING rtree(id, x1, x2, +aux);
693136c9903Sdrh  INSERT INTO rt1 VALUES(1, 1, 2, 'aux1');
694136c9903Sdrh  INSERT INTO rt1 VALUES(2, 2, 3, 'aux2');
695136c9903Sdrh  INSERT INTO rt1 VALUES(3, 3, 4, 'aux3');
696136c9903Sdrh  INSERT INTO rt1 VALUES(4, 4, 5, 'aux4');
697136c9903Sdrh  SELECT * FROM rt1 WHERE id IN (1, 2, 3, 4);
698136c9903Sdrh} {1 1.0 2.0 aux1 2 2.0 3.0 aux2 3 3.0 4.0 aux3 4 4.0 5.0 aux4}
699252f3961Sdrh
700e6370e9cSdanreset_db
701e6370e9cSdando_execsql_test 17.0 {
702e6370e9cSdan  CREATE VIRTUAL TABLE t1 USING rtree(id, x1 PRIMARY KEY, x2, y1, y2);
703e6370e9cSdan  CREATE VIRTUAL TABLE t2 USING rtree(id, x1, x2, y1, y2 UNIQUE);
704e6370e9cSdan}
705e6370e9cSdando_execsql_test 17.1 {
706e6370e9cSdan  REINDEX t1;
707e6370e9cSdan  REINDEX t2;
708e6370e9cSdan} {}
709e6370e9cSdan
710e6370e9cSdando_execsql_test 17.2 {
711e6370e9cSdan  REINDEX;
712e6370e9cSdan} {}
713e6370e9cSdan
7140a64ddbeSdrhreset_db
7150a64ddbeSdrhdo_execsql_test 18.0 {
7160a64ddbeSdrh  CREATE VIRTUAL TABLE rt0 USING rtree(c0, c1, c2);
7170a64ddbeSdrh  INSERT INTO rt0(c0,c1,c2) VALUES(9,2,3);
7180a64ddbeSdrh  SELECT c0 FROM rt0 WHERE rt0.c1 > '-1';
7190a64ddbeSdrh  SELECT rt0.c1 > '-1' FROM rt0;
7200a64ddbeSdrh} {9 1}
7210a64ddbeSdrh
722eab0e103Sdanexpand_all_sql db
7232826918dSdrh
7242826918dSdrh# 2020-02-28 ticket e63b4d1a65546532
7252826918dSdrhreset_db
7262826918dSdrhdo_execsql_test 19.0 {
7272826918dSdrh  CREATE VIRTUAL TABLE rt0 USING rtree(a,b,c);
7282826918dSdrh  INSERT INTO rt0(a,b,c) VALUES(0,0.0,0.0);
7292826918dSdrh  CREATE VIEW v0(x) AS SELECT DISTINCT rt0.b FROM rt0;
7302826918dSdrh  SELECT v0.x FROM v0, rt0;
7312826918dSdrh} {0.0}
7322826918dSdrhdo_execsql_test 19.1 {
7332826918dSdrh  SELECT v0.x FROM v0, rt0 WHERE v0.x = rt0.b;
7342826918dSdrh} {0.0}
7352826918dSdrh
736ae8776e0Sdrh# 2022-06-20 https://sqlite.org/forum/forumpost/57bdf2217d
737ae8776e0Sdrh#
738ae8776e0Sdrhreset_db
739ae8776e0Sdrhdo_execsql_test 20.0 {
740ae8776e0Sdrh  CREATE VIRTUAL TABLE rt0 USING rtree(id, x0, x1);
741ae8776e0Sdrh  CREATE TABLE t0(a INT);
742ae8776e0Sdrh  CREATE TABLE t1(b INT);
743ae8776e0Sdrh  INSERT INTO rt0 VALUES(0, 0, 0);
744*d7480403Sdrh}
745*d7480403Sdrhdo_catchsql_test 20.1 {
746ae8776e0Sdrh  SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE +x0 = 0;
747*d7480403Sdrh} {1 {ON clause references tables to its right}}
748*d7480403Sdrhdo_catchsql_test 20.2 {
749ae8776e0Sdrh  SELECT * FROM t1 JOIN t0 ON x0>a RIGHT JOIN rt0 ON true WHERE x0 = 0;
750*d7480403Sdrh} {1 {ON clause references tables to its right}}
751*d7480403Sdrhdb null -
752*d7480403Sdrhdo_execsql_test 20.3 {
753*d7480403Sdrh  SELECT * FROM t1 JOIN t0 ON true RIGHT JOIN rt0 ON x0>a WHERE +x0 = 0;
754*d7480403Sdrh} {- - 0 0.0 0.0}
755*d7480403Sdrhdo_execsql_test 20.4 {
756*d7480403Sdrh  SELECT * FROM t1 JOIN t0 ON true RIGHT JOIN rt0 ON x0>a WHERE x0 = 0;
757*d7480403Sdrh} {- - 0 0.0 0.0}
758ae8776e0Sdrh
759ebaecc14Sdanielk1977finish_test
760