/ Hex Artifact Content
Login

Artifact 605fd0d7e7d571370c32b12dbf395b58953de246:


0000: 23 20 32 30 30 32 20 4a 75 6c 79 20 31 37 0a 23  # 2002 July 17.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65   this file is te
01c0: 73 74 69 6e 67 20 74 68 65 20 61 62 69 6c 69 74  sting the abilit
01d0: 79 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  y of the library
01e0: 20 74 6f 20 64 65 74 65 63 74 0a 23 20 70 61 73   to detect.# pas
01f0: 74 20 6f 72 20 66 75 74 75 72 65 20 66 69 6c 65  t or future file
0200: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
0210: 6e 75 6d 62 65 72 73 20 61 6e 64 20 72 65 73 70  numbers and resp
0220: 6f 6e 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ond appropriatel
0230: 79 2e 0a 23 0a 23 20 24 49 64 3a 20 76 65 72 73  y..#.# $Id: vers
0240: 69 6f 6e 2e 74 65 73 74 2c 76 20 31 2e 38 20 32  ion.test,v 1.8 2
0250: 30 30 32 2f 30 39 2f 30 32 20 31 32 3a 31 34 3a  002/09/02 12:14:
0260: 35 31 20 64 72 68 20 45 78 70 20 24 0a 0a 73 65  51 drh Exp $..se
0270: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0280: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0290: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
02a0: 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 43 75  tester.tcl..# Cu
02b0: 72 72 65 6e 74 20 66 69 6c 65 20 66 6f 72 6d 61  rrent file forma
02c0: 74 20 76 65 72 73 69 6f 6e 0a 73 65 74 20 56 58  t version.set VX
02d0: 20 34 0a 0a 23 20 43 72 65 61 74 65 20 61 20 6e   4..# Create a n
02e0: 65 77 20 64 61 74 61 62 61 73 65 0a 23 0a 64 6f  ew database.#.do
02f0: 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e  _test version-1.
0300: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0310: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0320: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
0330: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0340: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
0350: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0360: 78 2b 31 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  x+1 FROM t1;.   
0370: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0380: 53 45 4c 45 43 54 20 78 2b 32 20 46 52 4f 4d 20  SELECT x+2 FROM 
0390: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
03a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b  NTO t1 SELECT x+
03b0: 34 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  4 FROM t1;.    S
03c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
03d0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  .  }.} {1 2 3 4 
03e0: 35 20 36 20 37 20 38 7d 0a 0a 23 20 4d 61 6b 65  5 6 7 8}..# Make
03f0: 20 73 75 72 65 20 74 68 65 20 76 65 72 73 69 6f   sure the versio
0400: 6e 20 6e 75 6d 62 65 72 20 69 73 20 73 65 74 20  n number is set 
0410: 63 6f 72 72 65 63 74 6c 79 0a 23 0a 64 6f 5f 74  correctly.#.do_t
0420: 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e 32 20  est version-1.2 
0430: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
0440: 65 74 20 3a 3a 62 74 20 5b 62 74 72 65 65 5f 6f  et ::bt [btree_o
0450: 70 65 6e 20 74 65 73 74 2e 64 62 5d 0a 20 20 62  pen test.db].  b
0460: 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73  tree_begin_trans
0470: 61 63 74 69 6f 6e 20 24 3a 3a 62 74 0a 20 20 73  action $::bt.  s
0480: 65 74 20 3a 3a 6d 65 74 61 20 5b 62 74 72 65 65  et ::meta [btree
0490: 5f 67 65 74 5f 6d 65 74 61 20 24 3a 3a 62 74 5d  _get_meta $::bt]
04a0: 0a 20 20 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63  .  btree_rollbac
04b0: 6b 20 24 3a 3a 62 74 0a 20 20 6c 69 6e 64 65 78  k $::bt.  lindex
04c0: 20 24 3a 3a 6d 65 74 61 20 32 0a 7d 20 24 56 58   $::meta 2.} $VX
04d0: 0a 0a 23 20 49 6e 63 72 65 61 73 65 20 74 68 65  ..# Increase the
04e0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 6e 75 6d   file_format num
04f0: 62 65 72 20 62 79 20 6f 6e 65 2e 20 20 56 65 72  ber by one.  Ver
0500: 69 66 79 20 74 68 61 74 20 74 68 65 0a 23 20 66  ify that the.# f
0510: 69 6c 65 20 77 69 6c 6c 20 72 65 66 75 73 65 20  ile will refuse 
0520: 74 6f 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f 74 65  to open..#.do_te
0530: 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e 33 20 7b  st version-1.3 {
0540: 0a 20 20 73 65 74 20 6d 32 20 5b 6c 72 65 70 6c  .  set m2 [lrepl
0550: 61 63 65 20 24 3a 3a 6d 65 74 61 20 32 20 32 20  ace $::meta 2 2 
0560: 5b 65 78 70 72 20 7b 24 3a 3a 56 58 2b 31 7d 5d  [expr {$::VX+1}]
0570: 5d 0a 20 20 62 74 72 65 65 5f 62 65 67 69 6e 5f  ].  btree_begin_
0580: 74 72 61 6e 73 61 63 74 69 6f 6e 20 24 3a 3a 62  transaction $::b
0590: 74 0a 20 20 65 76 61 6c 20 62 74 72 65 65 5f 75  t.  eval btree_u
05a0: 70 64 61 74 65 5f 6d 65 74 61 20 24 3a 3a 62 74  pdate_meta $::bt
05b0: 20 24 6d 32 0a 20 20 62 74 72 65 65 5f 63 6f 6d   $m2.  btree_com
05c0: 6d 69 74 20 24 3a 3a 62 74 0a 20 20 73 65 74 20  mit $::bt.  set 
05d0: 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74  rc [catch {sqlit
05e0: 65 20 64 62 20 74 65 73 74 2e 64 62 7d 20 6d 73  e db test.db} ms
05f0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20  g].  lappend rc 
0600: 24 6d 73 67 0a 7d 20 7b 31 20 7b 75 6e 73 75 70  $msg.} {1 {unsup
0610: 70 6f 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d  ported file form
0620: 61 74 7d 7d 0a 0a 23 20 44 65 63 72 65 61 73 65  at}}..# Decrease
0630: 20 74 68 65 20 66 69 6c 65 5f 66 6f 72 6d 61 74   the file_format
0640: 20 6e 75 6d 62 65 72 20 62 79 20 6f 6e 65 2e 20   number by one. 
0650: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
0660: 0a 23 20 66 69 6c 65 20 77 69 6c 6c 20 6f 70 65  .# file will ope
0670: 6e 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 64  n correctly..#.d
0680: 6f 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31  o_test version-1
0690: 2e 34 20 7b 0a 20 20 73 65 74 20 6d 32 20 5b 6c  .4 {.  set m2 [l
06a0: 72 65 70 6c 61 63 65 20 24 3a 3a 6d 65 74 61 20  replace $::meta 
06b0: 32 20 32 20 5b 65 78 70 72 20 7b 24 3a 3a 56 58  2 2 [expr {$::VX
06c0: 2d 31 7d 5d 5d 0a 20 20 62 74 72 65 65 5f 62 65  -1}]].  btree_be
06d0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin_transaction 
06e0: 24 3a 3a 62 74 0a 20 20 65 76 61 6c 20 62 74 72  $::bt.  eval btr
06f0: 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61 20 24  ee_update_meta $
0700: 3a 3a 62 74 20 24 6d 32 0a 20 20 62 74 72 65 65  ::bt $m2.  btree
0710: 5f 63 6f 6d 6d 69 74 20 24 3a 3a 62 74 0a 20 20  _commit $::bt.  
0720: 73 71 6c 69 74 65 20 64 62 20 74 65 73 74 2e 64  sqlite db test.d
0730: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
0740: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0750: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t1;.  }.} {1 2 3
0760: 20 34 20 35 20 36 20 37 20 38 7d 0a 0a 23 20 53   4 5 6 7 8}..# S
0770: 65 74 20 74 68 65 20 66 69 6c 65 5f 66 6f 72 6d  et the file_form
0780: 61 74 20 6e 75 6d 62 65 72 20 74 6f 20 32 2e 20  at number to 2. 
0790: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 63 61 75   This should cau
07a0: 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  se the automatic
07b0: 0a 23 20 75 70 67 72 61 64 65 20 70 72 6f 63 65  .# upgrade proce
07c0: 73 73 69 6e 67 20 74 6f 20 72 75 6e 2e 0a 23 0a  ssing to run..#.
07d0: 64 6f 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d  do_test version-
07e0: 31 2e 35 20 7b 0a 20 20 73 65 74 20 6d 32 20 5b  1.5 {.  set m2 [
07f0: 6c 72 65 70 6c 61 63 65 20 24 3a 3a 6d 65 74 61  lreplace $::meta
0800: 20 32 20 32 20 32 5d 0a 20 20 62 74 72 65 65 5f   2 2 2].  btree_
0810: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
0820: 6e 20 24 3a 3a 62 74 0a 20 20 65 76 61 6c 20 62  n $::bt.  eval b
0830: 74 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61  tree_update_meta
0840: 20 24 3a 3a 62 74 20 24 6d 32 0a 20 20 62 74 72   $::bt $m2.  btr
0850: 65 65 5f 63 6f 6d 6d 69 74 20 24 3a 3a 62 74 0a  ee_commit $::bt.
0860: 20 20 73 71 6c 69 74 65 20 64 62 20 74 65 73 74    sqlite db test
0870: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
0880: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0890: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t1;.  }.} {1 2
08a0: 20 33 20 34 20 35 20 36 20 37 20 38 7d 0a 64 6f   3 4 5 6 7 8}.do
08b0: 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e  _test version-1.
08c0: 36 20 7b 0a 20 20 73 65 74 20 3a 3a 6d 65 74 61  6 {.  set ::meta
08d0: 20 5b 62 74 72 65 65 5f 67 65 74 5f 6d 65 74 61   [btree_get_meta
08e0: 20 24 3a 3a 62 74 5d 0a 20 20 6c 69 6e 64 65 78   $::bt].  lindex
08f0: 20 24 3a 3a 6d 65 74 61 20 32 0a 7d 20 24 56 58   $::meta 2.} $VX
0900: 0a 0a 23 20 41 64 64 20 73 6f 6d 65 20 74 72 69  ..# Add some tri
0910: 67 67 65 72 73 2c 20 76 69 65 77 73 2c 20 61 6e  ggers, views, an
0920: 64 20 69 6e 64 69 63 65 73 20 74 6f 20 74 68 65  d indices to the
0930: 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 61 6b 65   schema and make
0940: 20 73 75 72 65 20 74 68 65 0a 23 20 61 75 74 6f   sure the.# auto
0950: 6d 61 74 69 63 20 75 70 67 72 61 64 65 20 73 74  matic upgrade st
0960: 69 6c 6c 20 77 6f 72 6b 73 2e 0a 23 0a 64 6f 5f  ill works..#.do_
0970: 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e 37  test version-1.7
0980: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0990: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
09a0: 69 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 20  i1 ON t1(x);.   
09b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
09c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
09d0: 45 20 74 32 28 61 20 49 4e 54 45 47 45 52 20 50  E t2(a INTEGER P
09e0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
09f0: 49 51 55 45 2c 20 63 29 3b 0a 20 20 20 20 43 52  IQUE, c);.    CR
0a00: 45 41 54 45 20 54 41 42 4c 45 20 63 6e 74 28 6e  EATE TABLE cnt(n
0a10: 61 6d 65 2c 69 6e 73 2c 20 64 65 6c 29 3b 0a 20  ame,ins, del);. 
0a20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
0a30: 6e 74 20 56 41 4c 55 45 53 28 27 74 31 27 2c 30  nt VALUES('t1',0
0a40: 2c 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,0);.    INSERT 
0a50: 49 4e 54 4f 20 63 6e 74 20 56 41 4c 55 45 53 28  INTO cnt VALUES(
0a60: 27 74 32 27 2c 30 2c 30 29 3b 0a 20 20 20 20 43  't2',0,0);.    C
0a70: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72 31  REATE TRIGGER r1
0a80: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
0a90: 20 74 31 20 46 4f 52 20 45 41 43 48 20 52 4f 57   t1 FOR EACH ROW
0aa0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
0ab0: 41 54 45 20 63 6e 74 20 53 45 54 20 69 6e 73 3d  ATE cnt SET ins=
0ac0: 69 6e 73 2b 31 20 57 48 45 52 45 20 6e 61 6d 65  ins+1 WHERE name
0ad0: 3d 27 74 31 27 3b 0a 20 20 20 20 45 4e 44 3b 0a  ='t1';.    END;.
0ae0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
0af0: 45 52 20 72 32 20 41 46 54 45 52 20 44 45 4c 45  ER r2 AFTER DELE
0b00: 54 45 20 4f 4e 20 74 31 20 46 4f 52 20 45 41 43  TE ON t1 FOR EAC
0b10: 48 20 52 4f 57 20 42 45 47 49 4e 0a 20 20 20 20  H ROW BEGIN.    
0b20: 20 20 55 50 44 41 54 45 20 63 6e 74 20 53 45 54    UPDATE cnt SET
0b30: 20 64 65 6c 3d 64 65 6c 2b 31 20 57 48 45 52 45   del=del+1 WHERE
0b40: 20 6e 61 6d 65 3d 27 74 31 27 3b 0a 20 20 20 20   name='t1';.    
0b50: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
0b60: 54 52 49 47 47 45 52 20 72 33 20 41 46 54 45 52  TRIGGER r3 AFTER
0b70: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 46 4f   INSERT ON t2 FO
0b80: 52 20 45 41 43 48 20 52 4f 57 20 42 45 47 49 4e  R EACH ROW BEGIN
0b90: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 63 6e  .      UPDATE cn
0ba0: 74 20 53 45 54 20 69 6e 73 3d 69 6e 73 2b 31 20  t SET ins=ins+1 
0bb0: 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 32 27 3b  WHERE name='t2';
0bc0: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
0bd0: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 34 20  EATE TRIGGER r4 
0be0: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
0bf0: 74 32 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20  t2 FOR EACH ROW 
0c00: 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41  BEGIN.      UPDA
0c10: 54 45 20 63 6e 74 20 53 45 54 20 64 65 6c 3d 64  TE cnt SET del=d
0c20: 65 6c 2b 31 20 57 48 45 52 45 20 6e 61 6d 65 3d  el+1 WHERE name=
0c30: 27 74 32 27 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  't2';.    END;. 
0c40: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76     CREATE VIEW v
0c50: 31 20 41 53 20 53 45 4c 45 43 54 20 78 2b 31 30  1 AS SELECT x+10
0c60: 30 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  0 FROM t1;.    C
0c70: 52 45 41 54 45 20 56 49 45 57 20 76 32 20 41 53  REATE VIEW v2 AS
0c80: 20 53 45 4c 45 43 54 20 73 75 6d 28 69 6e 73 29   SELECT sum(ins)
0c90: 2c 20 73 75 6d 28 64 65 6c 29 20 46 52 4f 4d 20  , sum(del) FROM 
0ca0: 63 6e 74 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  cnt;.    INSERT 
0cb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0cc0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0cd0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 78 2b 31  TO t1 SELECT x+1
0ce0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
0cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0d00: 45 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 31 3b  ECT x+2 FROM t1;
0d10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0d20: 20 74 31 20 53 45 4c 45 43 54 20 78 2b 34 20 46   t1 SELECT x+4 F
0d30: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45  ROM t1;.    SELE
0d40: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
0d50: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0d60: 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20 76 65   7 8}.do_test ve
0d70: 72 73 69 6f 6e 2d 31 2e 38 20 7b 0a 20 20 65 78  rsion-1.8 {.  ex
0d80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0d90: 43 54 20 2a 20 46 52 4f 4d 20 76 32 3b 0a 20 20  CT * FROM v2;.  
0da0: 7d 0a 7d 20 7b 38 20 30 7d 0a 64 6f 5f 74 65 73  }.} {8 0}.do_tes
0db0: 74 20 76 65 72 73 69 6f 6e 2d 31 2e 39 20 7b 0a  t version-1.9 {.
0dc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0dd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6e  SELECT * FROM cn
0de0: 74 3b 0a 20 20 7d 0a 7d 20 7b 74 31 20 38 20 30  t;.  }.} {t1 8 0
0df0: 20 74 32 20 30 20 30 7d 0a 64 6f 5f 74 65 73 74   t2 0 0}.do_test
0e00: 20 76 65 72 73 69 6f 6e 2d 31 2e 31 30 20 7b 0a   version-1.10 {.
0e10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
0e30: 45 4c 45 43 54 20 78 2a 33 2c 20 78 2a 32 2c 20  ELECT x*3, x*2, 
0e40: 78 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  x FROM t1;.    S
0e50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
0e60: 0a 20 20 7d 0a 7d 20 7b 33 20 32 20 31 20 36 20  .  }.} {3 2 1 6 
0e70: 34 20 32 20 39 20 36 20 33 20 31 32 20 38 20 34  4 2 9 6 3 12 8 4
0e80: 20 31 35 20 31 30 20 35 20 31 38 20 31 32 20 36   15 10 5 18 12 6
0e90: 20 32 31 20 31 34 20 37 20 32 34 20 31 36 20 38   21 14 7 24 16 8
0ea0: 7d 0a 64 6f 5f 74 65 73 74 20 76 65 72 73 69 6f  }.do_test versio
0eb0: 6e 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  n-1.11 {.  execs
0ec0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0ed0: 2a 20 46 52 4f 4d 20 63 6e 74 3b 0a 20 20 7d 0a  * FROM cnt;.  }.
0ee0: 7d 20 7b 74 31 20 38 20 30 20 74 32 20 38 20 30  } {t1 8 0 t2 8 0
0ef0: 7d 0a 0a 23 20 48 65 72 65 20 77 65 20 64 6f 20  }..# Here we do 
0f00: 74 68 65 20 75 70 67 72 61 64 65 20 74 65 73 74  the upgrade test
0f10: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 65 72 73  ..#.do_test vers
0f20: 69 6f 6e 2d 31 2e 31 32 20 7b 0a 20 20 64 62 20  ion-1.12 {.  db 
0f30: 63 6c 6f 73 65 0a 20 20 73 65 74 20 6d 32 20 5b  close.  set m2 [
0f40: 6c 72 65 70 6c 61 63 65 20 24 3a 3a 6d 65 74 61  lreplace $::meta
0f50: 20 32 20 32 20 32 5d 0a 20 20 62 74 72 65 65 5f   2 2 2].  btree_
0f60: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
0f70: 6e 20 24 3a 3a 62 74 0a 20 20 65 76 61 6c 20 62  n $::bt.  eval b
0f80: 74 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61  tree_update_meta
0f90: 20 24 3a 3a 62 74 20 24 6d 32 0a 20 20 62 74 72   $::bt $m2.  btr
0fa0: 65 65 5f 63 6f 6d 6d 69 74 20 24 3a 3a 62 74 0a  ee_commit $::bt.
0fb0: 20 20 73 71 6c 69 74 65 20 64 62 20 74 65 73 74    sqlite db test
0fc0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
0fd0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0fe0: 4d 20 63 6e 74 3b 0a 20 20 7d 0a 7d 20 7b 74 31  M cnt;.  }.} {t1
0ff0: 20 38 20 30 20 74 32 20 38 20 30 7d 0a 64 6f 5f   8 0 t2 8 0}.do_
1000: 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e 31  test version-1.1
1010: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
1020: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1030: 4d 20 76 31 3b 0a 20 20 7d 0a 7d 20 7b 31 30 31  M v1;.  }.} {101
1040: 20 31 30 32 20 31 30 33 20 31 30 34 20 31 30 35   102 103 104 105
1050: 20 31 30 36 20 31 30 37 20 31 30 38 7d 0a 64 6f   106 107 108}.do
1060: 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 31 2e  _test version-1.
1070: 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  14 {.  execsql {
1080: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1090: 4f 4d 20 76 32 3b 0a 20 20 7d 0a 7d 20 7b 31 36  OM v2;.  }.} {16
10a0: 20 30 7d 0a 0a 23 20 54 72 79 20 74 6f 20 64 6f   0}..# Try to do
10b0: 20 61 6e 20 75 70 67 72 61 64 65 20 77 68 65 72   an upgrade wher
10c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
10d0: 69 6c 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ile is read-only
10e0: 0a 23 0a 64 6f 5f 74 65 73 74 20 76 65 72 73 69  .#.do_test versi
10f0: 6f 6e 2d 32 2e 31 20 7b 0a 20 20 64 62 20 63 6c  on-2.1 {.  db cl
1100: 6f 73 65 0a 20 20 73 65 74 20 6d 32 20 5b 6c 72  ose.  set m2 [lr
1110: 65 70 6c 61 63 65 20 24 3a 3a 6d 65 74 61 20 32  eplace $::meta 2
1120: 20 32 20 32 5d 0a 20 20 62 74 72 65 65 5f 62 65   2 2].  btree_be
1130: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin_transaction 
1140: 24 3a 3a 62 74 0a 20 20 65 76 61 6c 20 62 74 72  $::bt.  eval btr
1150: 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61 20 24  ee_update_meta $
1160: 3a 3a 62 74 20 24 6d 32 0a 20 20 62 74 72 65 65  ::bt $m2.  btree
1170: 5f 63 6f 6d 6d 69 74 20 24 3a 3a 62 74 0a 20 20  _commit $::bt.  
1180: 62 74 72 65 65 5f 63 6c 6f 73 65 20 24 3a 3a 62  btree_close $::b
1190: 74 0a 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20  t.  catch {file 
11a0: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
11b0: 64 62 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20  db -permissions 
11c0: 30 34 34 34 7d 0a 20 20 63 61 74 63 68 20 7b 66  0444}.  catch {f
11d0: 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74  ile attributes t
11e0: 65 73 74 2e 64 62 20 2d 72 65 61 64 6f 6e 6c 79  est.db -readonly
11f0: 20 31 7d 0a 20 20 69 66 20 7b 5b 66 69 6c 65 20   1}.  if {[file 
1200: 77 72 69 74 61 62 6c 65 20 74 65 73 74 2e 64 62  writable test.db
1210: 5d 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22  ]} {.    error "
1220: 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  Unable to make t
1230: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1240: 20 74 65 73 74 2e 64 62 20 72 65 61 64 6f 6e 6c   test.db readonl
1250: 79 20 2d 20 72 65 72 75 6e 20 74 68 69 73 20 74  y - rerun this t
1260: 65 73 74 20 61 73 20 61 6e 20 75 6e 70 72 69 76  est as an unpriv
1270: 69 6c 65 67 65 64 20 75 73 65 72 22 0a 20 20 7d  ileged user".  }
1280: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
1290: 20 7b 73 71 6c 69 74 65 20 64 62 20 74 65 73 74   {sqlite db test
12a0: 2e 64 62 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  .db} msg].  lapp
12b0: 65 6e 64 20 72 63 20 24 6d 73 67 0a 7d 20 7b 31  end rc $msg.} {1
12c0: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 70 67 72   {unable to upgr
12d0: 61 64 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ade database to 
12e0: 74 68 65 20 76 65 72 73 69 6f 6e 20 32 2e 36 20  the version 2.6 
12f0: 66 6f 72 6d 61 74 3a 20 61 74 74 65 6d 70 74 20  format: attempt 
1300: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
1310: 6e 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 64  nly database}}.d
1320: 6f 5f 74 65 73 74 20 76 65 72 73 69 6f 6e 2d 32  o_test version-2
1330: 2e 32 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65  .2 {.  file dele
1340: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
1350: 62 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  b.  set fd [open
1360: 20 74 65 73 74 2e 64 62 20 77 5d 0a 20 20 73 65   test.db w].  se
1370: 74 20 74 78 74 20 22 54 68 69 73 20 69 73 20 6e  t txt "This is n
1380: 6f 74 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ot a valid datab
1390: 61 73 65 20 66 69 6c 65 5c 6e 22 0a 20 20 77 68  ase file\n".  wh
13a0: 69 6c 65 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  ile {[string len
13b0: 67 74 68 20 24 74 78 74 5d 3c 34 30 39 32 7d 20  gth $txt]<4092} 
13c0: 7b 61 70 70 65 6e 64 20 74 78 74 20 24 74 78 74  {append txt $txt
13d0: 7d 0a 20 20 70 75 74 73 20 24 66 64 20 24 74 78  }.  puts $fd $tx
13e0: 74 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  t.  close $fd.  
13f0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73  set rc [catch {s
1400: 71 6c 69 74 65 20 64 62 20 74 65 73 74 2e 64 62  qlite db test.db
1410: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
1420: 20 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64   rc $msg.} {1 {d
1430: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
1440: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d  ge is malformed}
1450: 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.