xref: /sqlite-3.40.0/test/autoinc.test (revision b84b38fd)
1f3388144Sdrh# 2004 November 12
2f3388144Sdrh#
3f3388144Sdrh# The author disclaims copyright to this source code.  In place of
4f3388144Sdrh# a legal notice, here is a blessing:
5f3388144Sdrh#
6f3388144Sdrh#    May you do good and not evil.
7f3388144Sdrh#    May you find forgiveness for yourself and forgive others.
8f3388144Sdrh#    May you share freely, never taking more than you give.
9f3388144Sdrh#
10f3388144Sdrh#*************************************************************************
11f3388144Sdrh# This file implements regression tests for SQLite library.  The
12f3388144Sdrh# focus of this script is testing the AUTOINCREMENT features.
13f3388144Sdrh#
140b9f50d8Sdrh# $Id: autoinc.test,v 1.14 2009/06/23 20:28:54 drh Exp $
15f3388144Sdrh#
16f3388144Sdrh
17f3388144Sdrhset testdir [file dirname $argv0]
18f3388144Sdrhsource $testdir/tester.tcl
19*b84b38fdSdanset testprefix autoinc
20f3388144Sdrh
21f3388144Sdrh# If the library is not compiled with autoincrement support then
22f3388144Sdrh# skip all tests in this file.
23f3388144Sdrh#
24f3388144Sdrhifcapable {!autoinc} {
25f3388144Sdrh  finish_test
26f3388144Sdrh  return
27f3388144Sdrh}
28f3388144Sdrh
29867e6de4Sdanif {[permutation]=="inmemory_journal"} {
30867e6de4Sdan  finish_test
31867e6de4Sdan  return
32867e6de4Sdan}
33867e6de4Sdan
34165921a7Sdansqlite3_db_config_lookaside db 0 0 0
35165921a7Sdan
36f3388144Sdrh# The database is initially empty.
37f3388144Sdrh#
38f3388144Sdrhdo_test autoinc-1.1 {
39f3388144Sdrh  execsql {
40f3388144Sdrh    SELECT name FROM sqlite_master WHERE type='table';
41f3388144Sdrh  }
42f3388144Sdrh} {}
43f3388144Sdrh
44f3388144Sdrh# Add a table with the AUTOINCREMENT feature.  Verify that the
45f3388144Sdrh# SQLITE_SEQUENCE table gets created.
46f3388144Sdrh#
47f3388144Sdrhdo_test autoinc-1.2 {
48f3388144Sdrh  execsql {
49f3388144Sdrh    CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
50f3388144Sdrh    SELECT name FROM sqlite_master WHERE type='table';
51f3388144Sdrh  }
52f3388144Sdrh} {t1 sqlite_sequence}
53f3388144Sdrh
54f3388144Sdrh# The SQLITE_SEQUENCE table is initially empty
55f3388144Sdrh#
56f3388144Sdrhdo_test autoinc-1.3 {
57f3388144Sdrh  execsql {
58f3388144Sdrh    SELECT * FROM sqlite_sequence;
59f3388144Sdrh  }
60f3388144Sdrh} {}
61c456e57aSdrhdo_test autoinc-1.3.1 {
62c456e57aSdrh  catchsql {
63c456e57aSdrh    CREATE INDEX seqidx ON sqlite_sequence(name)
64c456e57aSdrh  }
65c456e57aSdrh} {1 {table sqlite_sequence may not be indexed}}
66f3388144Sdrh
67f3388144Sdrh# Close and reopen the database.  Verify that everything is still there.
68f3388144Sdrh#
69f3388144Sdrhdo_test autoinc-1.4 {
70f3388144Sdrh  db close
71f3388144Sdrh  sqlite3 db test.db
72f3388144Sdrh  execsql {
73f3388144Sdrh    SELECT * FROM sqlite_sequence;
74f3388144Sdrh  }
75f3388144Sdrh} {}
76f3388144Sdrh
77f3388144Sdrh# We are not allowed to drop the sqlite_sequence table.
78f3388144Sdrh#
79f3388144Sdrhdo_test autoinc-1.5 {
80f3388144Sdrh  catchsql {DROP TABLE sqlite_sequence}
81f3388144Sdrh} {1 {table sqlite_sequence may not be dropped}}
82f3388144Sdrhdo_test autoinc-1.6 {
83f3388144Sdrh  execsql {SELECT name FROM sqlite_master WHERE type='table'}
84f3388144Sdrh} {t1 sqlite_sequence}
85f3388144Sdrh
86f3388144Sdrh# Insert an entries into the t1 table and make sure the largest key
87f3388144Sdrh# is always recorded in the sqlite_sequence table.
88f3388144Sdrh#
89f3388144Sdrhdo_test autoinc-2.1 {
90f3388144Sdrh  execsql {
91f3388144Sdrh    SELECT * FROM sqlite_sequence
92f3388144Sdrh  }
93f3388144Sdrh} {}
94f3388144Sdrhdo_test autoinc-2.2 {
95f3388144Sdrh  execsql {
96f3388144Sdrh    INSERT INTO t1 VALUES(12,34);
97f3388144Sdrh    SELECT * FROM sqlite_sequence;
98f3388144Sdrh  }
99f3388144Sdrh} {t1 12}
100f3388144Sdrhdo_test autoinc-2.3 {
101f3388144Sdrh  execsql {
102f3388144Sdrh    INSERT INTO t1 VALUES(1,23);
103f3388144Sdrh    SELECT * FROM sqlite_sequence;
104f3388144Sdrh  }
105f3388144Sdrh} {t1 12}
106f3388144Sdrhdo_test autoinc-2.4 {
107f3388144Sdrh  execsql {
108f3388144Sdrh    INSERT INTO t1 VALUES(123,456);
109f3388144Sdrh    SELECT * FROM sqlite_sequence;
110f3388144Sdrh  }
111f3388144Sdrh} {t1 123}
112f3388144Sdrhdo_test autoinc-2.5 {
113f3388144Sdrh  execsql {
114f3388144Sdrh    INSERT INTO t1 VALUES(NULL,567);
115f3388144Sdrh    SELECT * FROM sqlite_sequence;
116f3388144Sdrh  }
117f3388144Sdrh} {t1 124}
118f3388144Sdrhdo_test autoinc-2.6 {
119f3388144Sdrh  execsql {
120f3388144Sdrh    DELETE FROM t1 WHERE y=567;
121f3388144Sdrh    SELECT * FROM sqlite_sequence;
122f3388144Sdrh  }
123f3388144Sdrh} {t1 124}
124f3388144Sdrhdo_test autoinc-2.7 {
125f3388144Sdrh  execsql {
126f3388144Sdrh    INSERT INTO t1 VALUES(NULL,567);
127f3388144Sdrh    SELECT * FROM sqlite_sequence;
128f3388144Sdrh  }
129f3388144Sdrh} {t1 125}
130f3388144Sdrhdo_test autoinc-2.8 {
131f3388144Sdrh  execsql {
132f3388144Sdrh    DELETE FROM t1;
133f3388144Sdrh    SELECT * FROM sqlite_sequence;
134f3388144Sdrh  }
135f3388144Sdrh} {t1 125}
136f3388144Sdrhdo_test autoinc-2.9 {
137f3388144Sdrh  execsql {
138f3388144Sdrh    INSERT INTO t1 VALUES(12,34);
139f3388144Sdrh    SELECT * FROM sqlite_sequence;
140f3388144Sdrh  }
141f3388144Sdrh} {t1 125}
142f3388144Sdrhdo_test autoinc-2.10 {
143f3388144Sdrh  execsql {
144f3388144Sdrh    INSERT INTO t1 VALUES(125,456);
145f3388144Sdrh    SELECT * FROM sqlite_sequence;
146f3388144Sdrh  }
147f3388144Sdrh} {t1 125}
148f3388144Sdrhdo_test autoinc-2.11 {
149f3388144Sdrh  execsql {
150f3388144Sdrh    INSERT INTO t1 VALUES(-1234567,-1);
151f3388144Sdrh    SELECT * FROM sqlite_sequence;
152f3388144Sdrh  }
153f3388144Sdrh} {t1 125}
154f3388144Sdrhdo_test autoinc-2.12 {
155f3388144Sdrh  execsql {
156f3388144Sdrh    INSERT INTO t1 VALUES(234,5678);
157f3388144Sdrh    SELECT * FROM sqlite_sequence;
158f3388144Sdrh  }
159f3388144Sdrh} {t1 234}
160f3388144Sdrhdo_test autoinc-2.13 {
161f3388144Sdrh  execsql {
162f3388144Sdrh    DELETE FROM t1;
163f3388144Sdrh    INSERT INTO t1 VALUES(NULL,1);
164f3388144Sdrh    SELECT * FROM sqlite_sequence;
165f3388144Sdrh  }
166f3388144Sdrh} {t1 235}
167f3388144Sdrhdo_test autoinc-2.14 {
168f3388144Sdrh  execsql {
169f3388144Sdrh    SELECT * FROM t1;
170f3388144Sdrh  }
171f3388144Sdrh} {235 1}
172f3388144Sdrh
173f3388144Sdrh# Manually change the autoincrement values in sqlite_sequence.
174f3388144Sdrh#
175f3388144Sdrhdo_test autoinc-2.20 {
176f3388144Sdrh  execsql {
177f3388144Sdrh    UPDATE sqlite_sequence SET seq=1234 WHERE name='t1';
178f3388144Sdrh    INSERT INTO t1 VALUES(NULL,2);
179f3388144Sdrh    SELECT * FROM t1;
180f3388144Sdrh  }
181f3388144Sdrh} {235 1 1235 2}
182f3388144Sdrhdo_test autoinc-2.21 {
183f3388144Sdrh  execsql {
184f3388144Sdrh    SELECT * FROM sqlite_sequence;
185f3388144Sdrh  }
186f3388144Sdrh} {t1 1235}
187f3388144Sdrhdo_test autoinc-2.22 {
188f3388144Sdrh  execsql {
189f3388144Sdrh    UPDATE sqlite_sequence SET seq=NULL WHERE name='t1';
190f3388144Sdrh    INSERT INTO t1 VALUES(NULL,3);
191f3388144Sdrh    SELECT * FROM t1;
192f3388144Sdrh  }
193f3388144Sdrh} {235 1 1235 2 1236 3}
194f3388144Sdrhdo_test autoinc-2.23 {
195f3388144Sdrh  execsql {
196f3388144Sdrh    SELECT * FROM sqlite_sequence;
197f3388144Sdrh  }
198f3388144Sdrh} {t1 1236}
199f3388144Sdrhdo_test autoinc-2.24 {
200f3388144Sdrh  execsql {
201f3388144Sdrh    UPDATE sqlite_sequence SET seq='a-string' WHERE name='t1';
202f3388144Sdrh    INSERT INTO t1 VALUES(NULL,4);
203f3388144Sdrh    SELECT * FROM t1;
204f3388144Sdrh  }
205f3388144Sdrh} {235 1 1235 2 1236 3 1237 4}
206f3388144Sdrhdo_test autoinc-2.25 {
207f3388144Sdrh  execsql {
208f3388144Sdrh    SELECT * FROM sqlite_sequence;
209f3388144Sdrh  }
210f3388144Sdrh} {t1 1237}
211f3388144Sdrhdo_test autoinc-2.26 {
212f3388144Sdrh  execsql {
213f3388144Sdrh    DELETE FROM sqlite_sequence WHERE name='t1';
214f3388144Sdrh    INSERT INTO t1 VALUES(NULL,5);
215f3388144Sdrh    SELECT * FROM t1;
216f3388144Sdrh  }
217f3388144Sdrh} {235 1 1235 2 1236 3 1237 4 1238 5}
218f3388144Sdrhdo_test autoinc-2.27 {
219f3388144Sdrh  execsql {
220f3388144Sdrh    SELECT * FROM sqlite_sequence;
221f3388144Sdrh  }
222f3388144Sdrh} {t1 1238}
223f3388144Sdrhdo_test autoinc-2.28 {
224f3388144Sdrh  execsql {
225de1a8b8cSdrh    UPDATE sqlite_sequence SET seq='-12345678901234567890'
226f3388144Sdrh      WHERE name='t1';
227f3388144Sdrh    INSERT INTO t1 VALUES(NULL,6);
228f3388144Sdrh    SELECT * FROM t1;
229f3388144Sdrh  }
230f3388144Sdrh} {235 1 1235 2 1236 3 1237 4 1238 5 1239 6}
231f3388144Sdrhdo_test autoinc-2.29 {
232f3388144Sdrh  execsql {
233f3388144Sdrh    SELECT * FROM sqlite_sequence;
234f3388144Sdrh  }
235f3388144Sdrh} {t1 1239}
236f3388144Sdrh
237f3388144Sdrh# Test multi-row inserts
238f3388144Sdrh#
239f3388144Sdrhdo_test autoinc-2.50 {
240f3388144Sdrh  execsql {
241f3388144Sdrh    DELETE FROM t1 WHERE y>=3;
242f3388144Sdrh    INSERT INTO t1 SELECT NULL, y+2 FROM t1;
243f3388144Sdrh    SELECT * FROM t1;
244f3388144Sdrh  }
245f3388144Sdrh} {235 1 1235 2 1240 3 1241 4}
246f3388144Sdrhdo_test autoinc-2.51 {
247f3388144Sdrh  execsql {
248f3388144Sdrh    SELECT * FROM sqlite_sequence
249f3388144Sdrh  }
250f3388144Sdrh} {t1 1241}
25153c0f748Sdanielk1977
25253c0f748Sdanielk1977ifcapable tempdb {
253f3388144Sdrh  do_test autoinc-2.52 {
254f3388144Sdrh    execsql {
255f3388144Sdrh      CREATE TEMP TABLE t2 AS SELECT y FROM t1;
256287fb61cSdanielk1977    }
257287fb61cSdanielk1977    execsql {
258f3388144Sdrh      INSERT INTO t1 SELECT NULL, y+4 FROM t2;
259f3388144Sdrh      SELECT * FROM t1;
260f3388144Sdrh    }
261f3388144Sdrh  } {235 1 1235 2 1240 3 1241 4 1242 5 1243 6 1244 7 1245 8}
262f3388144Sdrh  do_test autoinc-2.53 {
263f3388144Sdrh    execsql {
264f3388144Sdrh      SELECT * FROM sqlite_sequence
265f3388144Sdrh    }
266f3388144Sdrh  } {t1 1245}
267f3388144Sdrh  do_test autoinc-2.54 {
268f3388144Sdrh    execsql {
269f3388144Sdrh      DELETE FROM t1;
270f3388144Sdrh      INSERT INTO t1 SELECT NULL, y FROM t2;
271f3388144Sdrh      SELECT * FROM t1;
272f3388144Sdrh    }
273f3388144Sdrh  } {1246 1 1247 2 1248 3 1249 4}
274f3388144Sdrh  do_test autoinc-2.55 {
275f3388144Sdrh    execsql {
276f3388144Sdrh      SELECT * FROM sqlite_sequence
277f3388144Sdrh    }
278f3388144Sdrh  } {t1 1249}
27953c0f748Sdanielk1977}
280f3388144Sdrh
281f3388144Sdrh# Create multiple AUTOINCREMENT tables.  Make sure all sequences are
282f3388144Sdrh# tracked separately and do not interfere with one another.
283f3388144Sdrh#
284f3388144Sdrhdo_test autoinc-2.70 {
28553c0f748Sdanielk1977  catchsql {
286f3388144Sdrh    DROP TABLE t2;
28753c0f748Sdanielk1977  }
28853c0f748Sdanielk1977  execsql {
289f3388144Sdrh    CREATE TABLE t2(d, e INTEGER PRIMARY KEY AUTOINCREMENT, f);
290f3388144Sdrh    INSERT INTO t2(d) VALUES(1);
291f3388144Sdrh    SELECT * FROM sqlite_sequence;
292f3388144Sdrh  }
29353c0f748Sdanielk1977} [ifcapable tempdb {list t1 1249 t2 1} else {list t1 1241 t2 1}]
294f3388144Sdrhdo_test autoinc-2.71 {
295f3388144Sdrh  execsql {
296f3388144Sdrh    INSERT INTO t2(d) VALUES(2);
297f3388144Sdrh    SELECT * FROM sqlite_sequence;
298f3388144Sdrh  }
29953c0f748Sdanielk1977} [ifcapable tempdb {list t1 1249 t2 2} else {list t1 1241 t2 2}]
300f3388144Sdrhdo_test autoinc-2.72 {
301f3388144Sdrh  execsql {
302f3388144Sdrh    INSERT INTO t1(x) VALUES(10000);
303f3388144Sdrh    SELECT * FROM sqlite_sequence;
304f3388144Sdrh  }
305f3388144Sdrh} {t1 10000 t2 2}
306f3388144Sdrhdo_test autoinc-2.73 {
307f3388144Sdrh  execsql {
308f3388144Sdrh    CREATE TABLE t3(g INTEGER PRIMARY KEY AUTOINCREMENT, h);
309f3388144Sdrh    INSERT INTO t3(h) VALUES(1);
310f3388144Sdrh    SELECT * FROM sqlite_sequence;
311f3388144Sdrh  }
312f3388144Sdrh} {t1 10000 t2 2 t3 1}
313f3388144Sdrhdo_test autoinc-2.74 {
314f3388144Sdrh  execsql {
315f3388144Sdrh    INSERT INTO t2(d,e) VALUES(3,100);
316f3388144Sdrh    SELECT * FROM sqlite_sequence;
317f3388144Sdrh  }
318f3388144Sdrh} {t1 10000 t2 100 t3 1}
319f3388144Sdrh
320f3388144Sdrh
321f3388144Sdrh# When a table with an AUTOINCREMENT is deleted, the corresponding entry
322f3388144Sdrh# in the SQLITE_SEQUENCE table should also be deleted.  But the SQLITE_SEQUENCE
323f3388144Sdrh# table itself should remain behind.
324f3388144Sdrh#
325f3388144Sdrhdo_test autoinc-3.1 {
326f3388144Sdrh  execsql {SELECT name FROM sqlite_sequence}
327f3388144Sdrh} {t1 t2 t3}
328f3388144Sdrhdo_test autoinc-3.2 {
329f3388144Sdrh  execsql {
330f3388144Sdrh    DROP TABLE t1;
331f3388144Sdrh    SELECT name FROM sqlite_sequence;
332f3388144Sdrh  }
333f3388144Sdrh} {t2 t3}
334f3388144Sdrhdo_test autoinc-3.3 {
335f3388144Sdrh  execsql {
336f3388144Sdrh    DROP TABLE t3;
337f3388144Sdrh    SELECT name FROM sqlite_sequence;
338f3388144Sdrh  }
339f3388144Sdrh} {t2}
340f3388144Sdrhdo_test autoinc-3.4 {
341f3388144Sdrh  execsql {
342f3388144Sdrh    DROP TABLE t2;
343f3388144Sdrh    SELECT name FROM sqlite_sequence;
344f3388144Sdrh  }
345f3388144Sdrh} {}
346f3388144Sdrh
347f3388144Sdrh# AUTOINCREMENT on TEMP tables.
348f3388144Sdrh#
34953c0f748Sdanielk1977ifcapable tempdb {
350f3388144Sdrh  do_test autoinc-4.1 {
351f3388144Sdrh    execsql {
35227c77438Sdanielk1977      SELECT 1, name FROM sqlite_master WHERE type='table';
353e0a04a36Sdrh      SELECT 2, name FROM temp.sqlite_master WHERE type='table';
354f3388144Sdrh    }
355f3388144Sdrh  } {1 sqlite_sequence}
356f3388144Sdrh  do_test autoinc-4.2 {
357f3388144Sdrh    execsql {
358f3388144Sdrh      CREATE TABLE t1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
359f3388144Sdrh      CREATE TEMP TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
36027c77438Sdanielk1977      SELECT 1, name FROM sqlite_master WHERE type='table';
36127c77438Sdanielk1977      SELECT 2, name FROM sqlite_temp_master WHERE type='table';
362f3388144Sdrh    }
363f3388144Sdrh  } {1 sqlite_sequence 1 t1 2 t3 2 sqlite_sequence}
364f3388144Sdrh  do_test autoinc-4.3 {
365f3388144Sdrh    execsql {
36627c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
36727c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
368f3388144Sdrh    }
369f3388144Sdrh  } {}
370f3388144Sdrh  do_test autoinc-4.4 {
371f3388144Sdrh    execsql {
372f3388144Sdrh      INSERT INTO t1 VALUES(10,1);
373f3388144Sdrh      INSERT INTO t3 VALUES(20,2);
374f3388144Sdrh      INSERT INTO t1 VALUES(NULL,3);
375f3388144Sdrh      INSERT INTO t3 VALUES(NULL,4);
37627c77438Sdanielk1977    }
37727c77438Sdanielk1977  } {}
37827c77438Sdanielk1977
37927c77438Sdanielk1977  ifcapable compound {
38027c77438Sdanielk1977  do_test autoinc-4.4.1 {
38127c77438Sdanielk1977    execsql {
382f3388144Sdrh      SELECT * FROM t1 UNION ALL SELECT * FROM t3;
383f3388144Sdrh    }
384f3388144Sdrh  } {10 1 11 3 20 2 21 4}
38527c77438Sdanielk1977  } ;# ifcapable compound
38627c77438Sdanielk1977
387f3388144Sdrh  do_test autoinc-4.5 {
388f3388144Sdrh    execsql {
38927c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
39027c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
391f3388144Sdrh    }
392f3388144Sdrh  } {1 t1 11 2 t3 21}
393f3388144Sdrh  do_test autoinc-4.6 {
394f3388144Sdrh    execsql {
395f3388144Sdrh      INSERT INTO t1 SELECT * FROM t3;
39627c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
39727c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
398f3388144Sdrh    }
399f3388144Sdrh  } {1 t1 21 2 t3 21}
400f3388144Sdrh  do_test autoinc-4.7 {
401f3388144Sdrh    execsql {
402f3388144Sdrh      INSERT INTO t3 SELECT x+100, y  FROM t1;
40327c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
40427c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
405f3388144Sdrh    }
406f3388144Sdrh  } {1 t1 21 2 t3 121}
407f3388144Sdrh  do_test autoinc-4.8 {
408f3388144Sdrh    execsql {
409f3388144Sdrh      DROP TABLE t3;
41027c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
41127c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
412f3388144Sdrh    }
413f3388144Sdrh  } {1 t1 21}
414f3388144Sdrh  do_test autoinc-4.9 {
415f3388144Sdrh    execsql {
416f3388144Sdrh      CREATE TEMP TABLE t2(p INTEGER PRIMARY KEY AUTOINCREMENT, q);
417f3388144Sdrh      INSERT INTO t2 SELECT * FROM t1;
418f3388144Sdrh      DROP TABLE t1;
41927c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
42027c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
421f3388144Sdrh    }
422f3388144Sdrh  } {2 t2 21}
423f3388144Sdrh  do_test autoinc-4.10 {
424f3388144Sdrh    execsql {
425f3388144Sdrh      DROP TABLE t2;
42627c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
42727c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
428f3388144Sdrh    }
429f3388144Sdrh  } {}
43053c0f748Sdanielk1977}
431f3388144Sdrh
432f3388144Sdrh# Make sure AUTOINCREMENT works on ATTACH-ed tables.
433f3388144Sdrh#
4345a8f9374Sdanielk1977ifcapable tempdb&&attach {
435f3388144Sdrh  do_test autoinc-5.1 {
436fda06befSmistachkin    forcedelete test2.db
437fda06befSmistachkin    forcedelete test2.db-journal
438f3388144Sdrh    sqlite3 db2 test2.db
439f3388144Sdrh    execsql {
440f3388144Sdrh      CREATE TABLE t4(m INTEGER PRIMARY KEY AUTOINCREMENT, n);
441f3388144Sdrh      CREATE TABLE t5(o, p INTEGER PRIMARY KEY AUTOINCREMENT);
442f3388144Sdrh    } db2;
443f3388144Sdrh    execsql {
444f3388144Sdrh      ATTACH 'test2.db' as aux;
44527c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
44627c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
44727c77438Sdanielk1977      SELECT 3, * FROM aux.sqlite_sequence;
448f3388144Sdrh    }
449f3388144Sdrh  } {}
450f3388144Sdrh  do_test autoinc-5.2 {
451f3388144Sdrh    execsql {
452f3388144Sdrh      INSERT INTO t4 VALUES(NULL,1);
45327c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
45427c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
45527c77438Sdanielk1977      SELECT 3, * FROM aux.sqlite_sequence;
456f3388144Sdrh    }
457f3388144Sdrh  } {3 t4 1}
458f3388144Sdrh  do_test autoinc-5.3 {
459f3388144Sdrh    execsql {
460f3388144Sdrh      INSERT INTO t5 VALUES(100,200);
461f3388144Sdrh      SELECT * FROM sqlite_sequence
462f3388144Sdrh    } db2
463f3388144Sdrh  } {t4 1 t5 200}
464f3388144Sdrh  do_test autoinc-5.4 {
465f3388144Sdrh    execsql {
46627c77438Sdanielk1977      SELECT 1, * FROM main.sqlite_sequence;
46727c77438Sdanielk1977      SELECT 2, * FROM temp.sqlite_sequence;
46827c77438Sdanielk1977      SELECT 3, * FROM aux.sqlite_sequence;
469f3388144Sdrh    }
470f3388144Sdrh  } {3 t4 1 3 t5 200}
47153c0f748Sdanielk1977}
472f3388144Sdrh
473f3388144Sdrh# Requirement REQ00310:  Make sure an insert fails if the sequence is
474f3388144Sdrh# already at its maximum value.
475f3388144Sdrh#
47675f86a4bSdrhifcapable {rowid32} {
47775f86a4bSdrh  do_test autoinc-6.1 {
47875f86a4bSdrh    execsql {
47975f86a4bSdrh      CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w);
48075f86a4bSdrh      INSERT INTO t6 VALUES(2147483647,1);
48175f86a4bSdrh      SELECT seq FROM main.sqlite_sequence WHERE name='t6';
48275f86a4bSdrh    }
48375f86a4bSdrh  } 2147483647
48475f86a4bSdrh}
48575f86a4bSdrhifcapable {!rowid32} {
486f3388144Sdrh  do_test autoinc-6.1 {
487f3388144Sdrh    execsql {
488f3388144Sdrh      CREATE TABLE t6(v INTEGER PRIMARY KEY AUTOINCREMENT, w);
489f3388144Sdrh      INSERT INTO t6 VALUES(9223372036854775807,1);
490f3388144Sdrh      SELECT seq FROM main.sqlite_sequence WHERE name='t6';
491f3388144Sdrh    }
492f3388144Sdrh  } 9223372036854775807
49375f86a4bSdrh}
494f3388144Sdrhdo_test autoinc-6.2 {
495f3388144Sdrh  catchsql {
496f3388144Sdrh    INSERT INTO t6 VALUES(NULL,1);
497f3388144Sdrh  }
4982db0bbc2Sdrh} {1 {database or disk is full}}
499f3388144Sdrh
500f3388144Sdrh# Allow the AUTOINCREMENT keyword inside the parentheses
501f3388144Sdrh# on a separate PRIMARY KEY designation.
502f3388144Sdrh#
503f3388144Sdrhdo_test autoinc-7.1 {
504f3388144Sdrh  execsql {
505f3388144Sdrh    CREATE TABLE t7(x INTEGER, y REAL, PRIMARY KEY(x AUTOINCREMENT));
506f3388144Sdrh    INSERT INTO t7(y) VALUES(123);
507f3388144Sdrh    INSERT INTO t7(y) VALUES(234);
508f3388144Sdrh    DELETE FROM t7;
509f3388144Sdrh    INSERT INTO t7(y) VALUES(345);
510f3388144Sdrh    SELECT * FROM t7;
511f3388144Sdrh  }
5128a51256cSdrh} {3 345.0}
513f3388144Sdrh
514576ec6b3Sdanielk1977# Test that if the AUTOINCREMENT is applied to a non integer primary key
515576ec6b3Sdanielk1977# the error message is sensible.
516576ec6b3Sdanielk1977do_test autoinc-7.2 {
517576ec6b3Sdanielk1977  catchsql {
518576ec6b3Sdanielk1977    CREATE TABLE t8(x TEXT PRIMARY KEY AUTOINCREMENT);
519576ec6b3Sdanielk1977  }
520576ec6b3Sdanielk1977} {1 {AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY}}
521576ec6b3Sdanielk1977
52278776ecdSdrh
52378776ecdSdrh# Ticket #1283.  Make sure that preparing but never running a statement
52478776ecdSdrh# that creates the sqlite_sequence table does not mess up the database.
52578776ecdSdrh#
52678776ecdSdrhdo_test autoinc-8.1 {
527f3388144Sdrh  catch {db2 close}
52878776ecdSdrh  catch {db close}
529fda06befSmistachkin  forcedelete test.db
530dddca286Sdrh  sqlite3 db test.db
531dddca286Sdrh  set DB [sqlite3_connection_pointer db]
53278776ecdSdrh  set STMT [sqlite3_prepare $DB {
53378776ecdSdrh     CREATE TABLE t1(
53478776ecdSdrh       x INTEGER PRIMARY KEY AUTOINCREMENT
53578776ecdSdrh     )
53678776ecdSdrh  } -1 TAIL]
53778776ecdSdrh  sqlite3_finalize $STMT
53878776ecdSdrh  set STMT [sqlite3_prepare $DB {
53978776ecdSdrh     CREATE TABLE t1(
54078776ecdSdrh       x INTEGER PRIMARY KEY AUTOINCREMENT
54178776ecdSdrh     )
54278776ecdSdrh  } -1 TAIL]
54378776ecdSdrh  sqlite3_step $STMT
54478776ecdSdrh  sqlite3_finalize $STMT
54578776ecdSdrh  execsql {
54678776ecdSdrh    INSERT INTO t1 VALUES(NULL);
54778776ecdSdrh    SELECT * FROM t1;
54878776ecdSdrh  }
54978776ecdSdrh} {1}
55078776ecdSdrh
551c9ded4c6Sdrh# Ticket #3148
552c9ded4c6Sdrh# Make sure the sqlite_sequence table is not damaged when doing
553c9ded4c6Sdrh# an empty insert - an INSERT INTO ... SELECT ... where the SELECT
554c9ded4c6Sdrh# clause returns an empty set.
555c9ded4c6Sdrh#
556c9ded4c6Sdrhdo_test autoinc-9.1 {
557c9ded4c6Sdrh  db eval {
558c9ded4c6Sdrh    CREATE TABLE t2(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
559c9ded4c6Sdrh    INSERT INTO t2 VALUES(NULL, 1);
560c9ded4c6Sdrh    CREATE TABLE t3(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
561c9ded4c6Sdrh    INSERT INTO t3 SELECT * FROM t2 WHERE y>1;
562c9ded4c6Sdrh
563c9ded4c6Sdrh    SELECT * FROM sqlite_sequence WHERE name='t3';
564c9ded4c6Sdrh  }
565c9ded4c6Sdrh} {t3 0}
566c9ded4c6Sdrh
56775cbd984Sdanifcapable trigger {
5685bde73c4Sdan  catchsql { pragma recursive_triggers = off }
56976d462eeSdan
5700b9f50d8Sdrh  # Ticket #3928.  Make sure that triggers to not make extra slots in
5710b9f50d8Sdrh  # the SQLITE_SEQUENCE table.
5720b9f50d8Sdrh  #
5730b9f50d8Sdrh  do_test autoinc-3928.1 {
5740b9f50d8Sdrh    db eval {
5750b9f50d8Sdrh      CREATE TABLE t3928(a INTEGER PRIMARY KEY AUTOINCREMENT, b);
5760b9f50d8Sdrh      CREATE TRIGGER t3928r1 BEFORE INSERT ON t3928 BEGIN
5770b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('before1');
5780b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('before2');
5790b9f50d8Sdrh      END;
5800b9f50d8Sdrh      CREATE TRIGGER t3928r2 AFTER INSERT ON t3928 BEGIN
5810b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('after1');
5820b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('after2');
5830b9f50d8Sdrh      END;
5840b9f50d8Sdrh      INSERT INTO t3928(b) VALUES('test');
5850b9f50d8Sdrh      SELECT * FROM t3928 ORDER BY a;
5860b9f50d8Sdrh    }
5870b9f50d8Sdrh  } {1 before1 2 after1 3 after2 4 before2 5 after1 6 after2 7 test 8 before1 9 before2 10 after1 11 before1 12 before2 13 after2}
5880b9f50d8Sdrh  do_test autoinc-3928.2 {
5890b9f50d8Sdrh    db eval {
5900b9f50d8Sdrh      SELECT * FROM sqlite_sequence WHERE name='t3928'
5910b9f50d8Sdrh    }
5920b9f50d8Sdrh  } {t3928 13}
5930b9f50d8Sdrh
5940b9f50d8Sdrh  do_test autoinc-3928.3 {
5950b9f50d8Sdrh    db eval {
5960b9f50d8Sdrh      DROP TRIGGER t3928r1;
5970b9f50d8Sdrh      DROP TRIGGER t3928r2;
5980b9f50d8Sdrh      CREATE TRIGGER t3928r3 BEFORE UPDATE ON t3928
5990b9f50d8Sdrh        WHEN typeof(new.b)=='integer' BEGIN
6000b9f50d8Sdrh           INSERT INTO t3928(b) VALUES('before-int-' || new.b);
6010b9f50d8Sdrh      END;
6020b9f50d8Sdrh      CREATE TRIGGER t3928r4 AFTER UPDATE ON t3928
6030b9f50d8Sdrh        WHEN typeof(new.b)=='integer' BEGIN
6040b9f50d8Sdrh           INSERT INTO t3928(b) VALUES('after-int-' || new.b);
6050b9f50d8Sdrh      END;
6060b9f50d8Sdrh      DELETE FROM t3928 WHERE a!=1;
6070b9f50d8Sdrh      UPDATE t3928 SET b=456 WHERE a=1;
6080b9f50d8Sdrh      SELECT * FROM t3928 ORDER BY a;
6090b9f50d8Sdrh    }
6100b9f50d8Sdrh  } {1 456 14 before-int-456 15 after-int-456}
6110b9f50d8Sdrh  do_test autoinc-3928.4 {
6120b9f50d8Sdrh    db eval {
6130b9f50d8Sdrh      SELECT * FROM sqlite_sequence WHERE name='t3928'
6140b9f50d8Sdrh    }
6150b9f50d8Sdrh  } {t3928 15}
6160b9f50d8Sdrh
6170b9f50d8Sdrh  do_test autoinc-3928.5 {
6180b9f50d8Sdrh    db eval {
6190b9f50d8Sdrh      CREATE TABLE t3928b(x);
6200b9f50d8Sdrh      INSERT INTO t3928b VALUES(100);
6210b9f50d8Sdrh      INSERT INTO t3928b VALUES(200);
6220b9f50d8Sdrh      INSERT INTO t3928b VALUES(300);
6230b9f50d8Sdrh      DELETE FROM t3928;
6240b9f50d8Sdrh      CREATE TABLE t3928c(y INTEGER PRIMARY KEY AUTOINCREMENT, z);
6250b9f50d8Sdrh      CREATE TRIGGER t3928br1 BEFORE DELETE ON t3928b BEGIN
6260b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('before-del-'||old.x);
6270b9f50d8Sdrh        INSERT INTO t3928c(z) VALUES('before-del-'||old.x);
6280b9f50d8Sdrh      END;
6290b9f50d8Sdrh      CREATE TRIGGER t3928br2 AFTER DELETE ON t3928b BEGIN
6300b9f50d8Sdrh        INSERT INTO t3928(b) VALUES('after-del-'||old.x);
6310b9f50d8Sdrh        INSERT INTO t3928c(z) VALUES('after-del-'||old.x);
6320b9f50d8Sdrh      END;
6330b9f50d8Sdrh      DELETE FROM t3928b;
6340b9f50d8Sdrh      SELECT * FROM t3928 ORDER BY a;
6350b9f50d8Sdrh    }
6360b9f50d8Sdrh  } {16 before-del-100 17 after-del-100 18 before-del-200 19 after-del-200 20 before-del-300 21 after-del-300}
6370b9f50d8Sdrh  do_test autoinc-3928.6 {
6380b9f50d8Sdrh    db eval {
6390b9f50d8Sdrh      SELECT * FROM t3928c ORDER BY y;
6400b9f50d8Sdrh    }
6410b9f50d8Sdrh  } {1 before-del-100 2 after-del-100 3 before-del-200 4 after-del-200 5 before-del-300 6 after-del-300}
6420b9f50d8Sdrh  do_test autoinc-3928.7 {
6430b9f50d8Sdrh    db eval {
6440b9f50d8Sdrh      SELECT * FROM sqlite_sequence WHERE name LIKE 't3928%' ORDER BY name;
6450b9f50d8Sdrh    }
6460b9f50d8Sdrh  } {t3928 21 t3928c 6}
647c9ded4c6Sdrh
6483492dd71Sdrh  # Ticket [a696379c1f0886615541a48b35bd8181a80e88f8]
6493492dd71Sdrh  do_test autoinc-a69637.1 {
6503492dd71Sdrh    db eval {
6513492dd71Sdrh      CREATE TABLE ta69637_1(x INTEGER PRIMARY KEY AUTOINCREMENT, y);
6523492dd71Sdrh      CREATE TABLE ta69637_2(z);
6533492dd71Sdrh      CREATE TRIGGER ra69637_1 AFTER INSERT ON ta69637_2 BEGIN
6543492dd71Sdrh        INSERT INTO ta69637_1(y) VALUES(new.z+1);
6553492dd71Sdrh      END;
6563492dd71Sdrh      INSERT INTO ta69637_2 VALUES(123);
6573492dd71Sdrh      SELECT * FROM ta69637_1;
6583492dd71Sdrh    }
6593492dd71Sdrh  } {1 124}
6603492dd71Sdrh  do_test autoinc-a69637.2 {
6613492dd71Sdrh    db eval {
6623492dd71Sdrh      CREATE VIEW va69637_2 AS SELECT * FROM ta69637_2;
6633492dd71Sdrh      CREATE TRIGGER ra69637_2 INSTEAD OF INSERT ON va69637_2 BEGIN
6643492dd71Sdrh        INSERT INTO ta69637_1(y) VALUES(new.z+10000);
6653492dd71Sdrh      END;
6663492dd71Sdrh      INSERT INTO va69637_2 VALUES(123);
6673492dd71Sdrh      SELECT * FROM ta69637_1;
6683492dd71Sdrh    }
6693492dd71Sdrh  } {1 124 2 10123}
67075cbd984Sdan}
6713492dd71Sdrh
6721dd518cfSdrh# 2016-10-03 ticket https://www.sqlite.org/src/tktview/7b3328086a5c1
6731dd518cfSdrh# Make sure autoincrement plays nicely with the xfer optimization
6741dd518cfSdrh#
6751dd518cfSdrhdo_execsql_test autoinc-10.1 {
6761dd518cfSdrh  DELETE FROM sqlite_sequence;
6771dd518cfSdrh  CREATE TABLE t10a(a INTEGER PRIMARY KEY AUTOINCREMENT, b UNIQUE);
6781dd518cfSdrh  INSERT INTO t10a VALUES(888,9999);
6791dd518cfSdrh  CREATE TABLE t10b(x INTEGER PRIMARY KEY AUTOINCREMENT, y UNIQUE);
6801dd518cfSdrh  INSERT INTO t10b SELECT * FROM t10a;
6811dd518cfSdrh  SELECT * FROM sqlite_sequence;
6821dd518cfSdrh} {t10a 888 t10b 888}
6831dd518cfSdrh
684f3d7bbb7Sdrh# 2018-04-21 autoincrement does not cause problems for upsert
685f3d7bbb7Sdrh#
686f3d7bbb7Sdrhdo_execsql_test autoinc-11.1 {
687f3d7bbb7Sdrh  CREATE TABLE t11(a INTEGER PRIMARY KEY AUTOINCREMENT,b UNIQUE);
688f3d7bbb7Sdrh  INSERT INTO t11(a,b) VALUES(2,3),(5,6),(4,3),(1,2)
689f3d7bbb7Sdrh    ON CONFLICT(b) DO UPDATE SET a=a+1000;
690f3d7bbb7Sdrh  SELECT seq FROM sqlite_sequence WHERE name='t11';
691f3d7bbb7Sdrh} {5}
6923492dd71Sdrh
693186ebd41Sdrh# 2018-05-23 ticket d8dc2b3a58cd5dc2918a1d4acbba4676a23ada4c
694186ebd41Sdrh# Does not crash if the sqlite_sequence table schema is missing
695186ebd41Sdrh# or corrupt.
696186ebd41Sdrh#
697186ebd41Sdrhdo_test autoinc-12.1 {
698186ebd41Sdrh  db close
699186ebd41Sdrh  forcedelete test.db
700186ebd41Sdrh  sqlite3 db test.db
7016ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
702186ebd41Sdrh  db eval {
703186ebd41Sdrh    CREATE TABLE fake_sequence(name TEXT PRIMARY KEY,seq) WITHOUT ROWID;
704186ebd41Sdrh    PRAGMA writable_schema=on;
705186ebd41Sdrh    UPDATE sqlite_master SET
706186ebd41Sdrh     sql=replace(sql,'fake_','sqlite_'),
707186ebd41Sdrh     name='sqlite_sequence',
708186ebd41Sdrh     tbl_name='sqlite_sequence'
709186ebd41Sdrh     WHERE name='fake_sequence';
710186ebd41Sdrh  }
711186ebd41Sdrh  db close
712186ebd41Sdrh  sqlite3 db test.db
713186ebd41Sdrh  set res [catch {db eval {
714186ebd41Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
715186ebd41Sdrh    INSERT INTO t1(b) VALUES('one');
716186ebd41Sdrh  }} msg]
717186ebd41Sdrh  lappend res $msg
718186ebd41Sdrh} {1 {database disk image is malformed}}
719186ebd41Sdrhdo_test autoinc-12.2 {
720186ebd41Sdrh  db close
721186ebd41Sdrh  forcedelete test.db
722186ebd41Sdrh  sqlite3 db test.db
7236ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
724186ebd41Sdrh  db eval {
725186ebd41Sdrh   CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
726186ebd41Sdrh   INSERT INTO t1(b) VALUES('one');
727186ebd41Sdrh   PRAGMA writable_schema=on;
728186ebd41Sdrh   UPDATE sqlite_master SET
729186ebd41Sdrh     sql=replace(sql,'sqlite_','x_'),
730186ebd41Sdrh     name='x_sequence',
731186ebd41Sdrh     tbl_name='x_sequence'
732186ebd41Sdrh    WHERE name='sqlite_sequence';
733186ebd41Sdrh  }
734186ebd41Sdrh  db close
735186ebd41Sdrh  sqlite3 db test.db
736186ebd41Sdrh  set res [catch {db eval {
737186ebd41Sdrh    INSERT INTO t1(b) VALUES('two');
738186ebd41Sdrh  }} msg]
739186ebd41Sdrh  lappend res $msg
740186ebd41Sdrh} {1 {database disk image is malformed}}
741d3e17ffbSdanifcapable vtab {
742d3e17ffbSdan  set err "database disk image is malformed"
743d3e17ffbSdan} else {
744d3e17ffbSdan  set err {malformed database schema (sqlite_sequence) - near "VIRTUAL": syntax error}
745d3e17ffbSdan}
746186ebd41Sdrhdo_test autoinc-12.3 {
747186ebd41Sdrh  db close
748186ebd41Sdrh  forcedelete test.db
749186ebd41Sdrh  sqlite3 db test.db
7506ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
751186ebd41Sdrh  db eval {
752186ebd41Sdrh   CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
753186ebd41Sdrh   INSERT INTO t1(b) VALUES('one');
754186ebd41Sdrh   PRAGMA writable_schema=on;
755186ebd41Sdrh   UPDATE sqlite_master SET
756186ebd41Sdrh     sql='CREATE VIRTUAL TABLE sqlite_sequence USING sqlite_dbpage'
757186ebd41Sdrh    WHERE name='sqlite_sequence';
758186ebd41Sdrh  }
759186ebd41Sdrh  db close
760186ebd41Sdrh  sqlite3 db test.db
761186ebd41Sdrh  set res [catch {db eval {
762186ebd41Sdrh    INSERT INTO t1(b) VALUES('two');
763186ebd41Sdrh  }} msg]
764186ebd41Sdrh  lappend res $msg
765d3e17ffbSdan} [list 1 $err]
766186ebd41Sdrhdo_test autoinc-12.4 {
767186ebd41Sdrh  db close
768186ebd41Sdrh  forcedelete test.db
769186ebd41Sdrh  sqlite3 db test.db
770186ebd41Sdrh  db eval {
771186ebd41Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
772186ebd41Sdrh    INSERT INTO t1(b) VALUES('one');
773186ebd41Sdrh    CREATE TABLE fake(name TEXT PRIMARY KEY,seq) WITHOUT ROWID;
774186ebd41Sdrh  }
775186ebd41Sdrh  set root1 [db one {SELECT rootpage FROM sqlite_master
776186ebd41Sdrh                     WHERE name='sqlite_sequence'}]
777186ebd41Sdrh  set root2 [db one {SELECT rootpage FROM sqlite_master
778186ebd41Sdrh                     WHERE name='fake'}]
7796ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
780186ebd41Sdrh  db eval {
781186ebd41Sdrh   PRAGMA writable_schema=on;
782186ebd41Sdrh   UPDATE sqlite_master SET rootpage=$root2
783186ebd41Sdrh    WHERE name='sqlite_sequence';
784186ebd41Sdrh   UPDATE sqlite_master SET rootpage=$root1
785186ebd41Sdrh    WHERE name='fake';
786186ebd41Sdrh  }
787186ebd41Sdrh  db close
788186ebd41Sdrh  sqlite3 db test.db
789186ebd41Sdrh  set res [catch {db eval {
790186ebd41Sdrh    INSERT INTO t1(b) VALUES('two');
791186ebd41Sdrh  }} msg]
792186ebd41Sdrh  lappend res $msg
793186ebd41Sdrh} {1 {database disk image is malformed}}
794186ebd41Sdrhbreakpoint
795186ebd41Sdrhdo_test autoinc-12.5 {
796186ebd41Sdrh  db close
797186ebd41Sdrh  forcedelete test.db
798186ebd41Sdrh  sqlite3 db test.db
7996ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
800186ebd41Sdrh  db eval {
801186ebd41Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
802186ebd41Sdrh    INSERT INTO t1(b) VALUES('one');
803186ebd41Sdrh    PRAGMA writable_schema=on;
804186ebd41Sdrh    UPDATE sqlite_master SET
805186ebd41Sdrh       sql='CREATE TABLE sqlite_sequence(x)'
806186ebd41Sdrh      WHERE name='sqlite_sequence';
807186ebd41Sdrh  }
808186ebd41Sdrh  db close
809186ebd41Sdrh  sqlite3 db test.db
810186ebd41Sdrh  set res [catch {db eval {
811186ebd41Sdrh    INSERT INTO t1(b) VALUES('two');
812186ebd41Sdrh  }} msg]
813186ebd41Sdrh  lappend res $msg
814186ebd41Sdrh} {1 {database disk image is malformed}}
815186ebd41Sdrhdo_test autoinc-12.6 {
816186ebd41Sdrh  db close
817186ebd41Sdrh  forcedelete test.db
818186ebd41Sdrh  sqlite3 db test.db
8196ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
820186ebd41Sdrh  db eval {
821186ebd41Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
822186ebd41Sdrh    INSERT INTO t1(b) VALUES('one');
823186ebd41Sdrh    PRAGMA writable_schema=on;
824186ebd41Sdrh    UPDATE sqlite_master SET
825186ebd41Sdrh       sql='CREATE TABLE sqlite_sequence(x,y INTEGER PRIMARY KEY)'
826186ebd41Sdrh      WHERE name='sqlite_sequence';
827186ebd41Sdrh  }
828186ebd41Sdrh  db close
829186ebd41Sdrh  sqlite3 db test.db
830186ebd41Sdrh  set res [catch {db eval {
831186ebd41Sdrh    INSERT INTO t1(b) VALUES('two'),('three'),('four');
832186ebd41Sdrh    INSERT INTO t1(b) VALUES('five');
833186ebd41Sdrh    PRAGMA integrity_check;
834186ebd41Sdrh  }} msg]
835186ebd41Sdrh  lappend res $msg
836186ebd41Sdrh} {0 ok}
837186ebd41Sdrhdo_test autoinc-12.7 {
838186ebd41Sdrh  db close
839186ebd41Sdrh  forcedelete test.db
840186ebd41Sdrh  sqlite3 db test.db
8416ab91a7aSdrh  sqlite3_db_config db DEFENSIVE 0
842186ebd41Sdrh  db eval {
843186ebd41Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b TEXT);
844186ebd41Sdrh    INSERT INTO t1(b) VALUES('one');
845186ebd41Sdrh    PRAGMA writable_schema=on;
846186ebd41Sdrh    UPDATE sqlite_master SET
847186ebd41Sdrh       sql='CREATE TABLE sqlite_sequence(y INTEGER PRIMARY KEY,x)'
848186ebd41Sdrh      WHERE name='sqlite_sequence';
849186ebd41Sdrh  }
850186ebd41Sdrh  db close
851186ebd41Sdrh  sqlite3 db test.db
852186ebd41Sdrh  set res [catch {db eval {
853186ebd41Sdrh    INSERT INTO t1(b) VALUES('two'),('three'),('four');
854186ebd41Sdrh    INSERT INTO t1(b) VALUES('five');
855186ebd41Sdrh    PRAGMA integrity_check;
856186ebd41Sdrh  }} msg]
857186ebd41Sdrh  lappend res $msg
858186ebd41Sdrh} {0 ok}
859186ebd41Sdrh
860*b84b38fdSdan#--------------------------------------------------------------------------
861*b84b38fdSdanreset_db
862*b84b38fdSdando_execsql_test 13.0 {
863*b84b38fdSdan  CREATE TABLE t1(i INTEGER PRIMARY KEY AUTOINCREMENT, j);
864*b84b38fdSdan  CREATE TABLE t2(i INTEGER PRIMARY KEY AUTOINCREMENT, j);
865*b84b38fdSdan  CREATE TABLE t3(i INTEGER PRIMARY KEY AUTOINCREMENT, j);
866*b84b38fdSdan
867*b84b38fdSdan  INSERT INTO t1 VALUES(NULL, 1);
868*b84b38fdSdan  INSERT INTO t2 VALUES(NULL, 2);
869*b84b38fdSdan  INSERT INTO t3 VALUES(NULL, 3);
870*b84b38fdSdan
871*b84b38fdSdan  SELECT name FROM sqlite_sequence;
872*b84b38fdSdan} {t1 t2 t3}
873*b84b38fdSdan
874*b84b38fdSdando_execsql_test 13.1 {
875*b84b38fdSdan  UPDATE sqlite_sequence SET name=NULL WHERE name='t2';
876*b84b38fdSdan  INSERT INTO t3 VALUES(NULL, 4);
877*b84b38fdSdan  DELETE FROM t3;
878*b84b38fdSdan  INSERT INTO t3 VALUES(NULL, 5);
879*b84b38fdSdan  SELECT * FROM t3;
880*b84b38fdSdan} {3 5}
881*b84b38fdSdan
882*b84b38fdSdan
883f3388144Sdrhfinish_test
884