/ Hex Artifact Content
Login

Artifact c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8:


0000: 23 20 32 30 31 35 2d 30 31 2d 33 30 0a 23 0a 23  # 2015-01-30.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 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 74 65 73 74   implements test
0180: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
0190: 72 61 72 79 2e 0a 23 0a 23 20 54 68 65 20 66 6f  rary..#.# The fo
01a0: 63 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65  cus of this file
01b0: 20 69 73 20 61 64 64 69 6e 67 20 65 78 74 72 61   is adding extra
01c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
01d0: 73 79 6d 62 6f 6c 20 74 61 62 6c 65 0a 23 20 75  symbol table.# u
01e0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73  sing sqlite3_tes
01f0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
0200: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
0210: 45 52 29 20 61 6e 64 20 76 65 72 69 66 79 69 6e  ER) and verifyin
0220: 67 20 74 68 61 74 0a 23 20 53 51 4c 69 74 65 20  g that.# SQLite 
0230: 68 61 6e 64 6c 65 73 20 74 68 6f 73 65 20 61 73  handles those as
0240: 20 65 78 70 65 63 74 65 64 2e 0a 23 0a 0a 73 65   expected..#..se
0250: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0260: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0270: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0280: 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74  tester.tcl.set t
0290: 65 73 74 70 72 65 66 69 78 20 69 6d 70 6f 73 74  estprefix impost
02a0: 65 72 0a 0a 23 20 43 72 65 61 74 65 20 61 20 62  er..# Create a b
02b0: 75 6e 63 68 20 6f 66 20 64 61 74 61 20 74 6f 20  unch of data to 
02c0: 73 6f 72 74 20 61 67 61 69 6e 73 74 0a 23 0a 64  sort against.#.d
02d0: 6f 5f 74 65 73 74 20 69 6d 70 6f 73 74 65 72 2d  o_test imposter-
02e0: 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.0 {.  execsql 
02f0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0300: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
0310: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
0320: 63 2c 20 64 20 4e 4f 54 20 4e 55 4c 4c 29 3b 0a  c, d NOT NULL);.
0330: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
0340: 20 74 31 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20   t1b ON t1(b);. 
0350: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
0360: 20 49 4e 44 45 58 20 74 31 63 20 4f 4e 20 74 31   INDEX t1c ON t1
0370: 28 63 29 3b 0a 20 20 20 20 57 49 54 48 20 52 45  (c);.    WITH RE
0380: 43 55 52 53 49 56 45 20 63 28 69 29 20 41 53 20  CURSIVE c(i) AS 
0390: 28 56 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e  (VALUES(1) UNION
03a0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b 31 20   ALL SELECT i+1 
03b0: 46 52 4f 4d 20 63 20 57 48 45 52 45 20 69 3c 33  FROM c WHERE i<3
03c0: 30 29 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  0).      INSERT 
03d0: 49 4e 54 4f 20 74 31 28 61 2c 62 2c 63 2c 64 29  INTO t1(a,b,c,d)
03e0: 20 53 45 4c 45 43 54 20 69 2c 31 30 30 30 2b 69   SELECT i,1000+i
03f0: 2c 32 30 30 30 2b 69 2c 33 30 30 30 2b 69 20 46  ,2000+i,3000+i F
0400: 52 4f 4d 20 63 3b 0a 20 20 7d 0a 20 20 73 65 74  ROM c;.  }.  set
0410: 20 74 31 5f 72 6f 6f 74 20 5b 64 62 20 6f 6e 65   t1_root [db one
0420: 20 7b 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67   {SELECT rootpag
0430: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
0440: 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d  ster WHERE name=
0450: 27 74 31 27 7d 5d 0a 20 20 73 65 74 20 74 31 62  't1'}].  set t1b
0460: 5f 72 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 7b 53  _root [db one {S
0470: 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
0480: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0490: 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 31  r WHERE name='t1
04a0: 62 27 7d 5d 0a 20 20 73 65 74 20 74 31 63 5f 72  b'}].  set t1c_r
04b0: 6f 6f 74 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c  oot [db one {SEL
04c0: 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
04d0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
04e0: 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 31 63 27  WHERE name='t1c'
04f0: 7d 5d 0a 0a 20 20 23 20 43 72 65 61 74 65 20 61  }]..  # Create a
0500: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
0510: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
0520: 61 6d 65 20 62 2d 74 72 65 65 20 61 73 20 74 31  ame b-tree as t1
0530: 20 62 75 74 20 77 68 69 63 68 20 64 6f 65 73 0a   but which does.
0540: 20 20 23 20 6e 6f 74 20 68 61 76 65 20 74 68 65    # not have the
0550: 20 69 6e 64 65 78 65 73 0a 20 20 23 0a 20 20 73   indexes.  #.  s
0560: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
0570: 72 6f 6c 20 53 51 4c 49 54 45 5f 54 45 53 54 43  rol SQLITE_TESTC
0580: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 64 62 20  TRL_IMPOSTER db 
0590: 6d 61 69 6e 20 31 20 24 74 31 5f 72 6f 6f 74 0a  main 1 $t1_root.
05a0: 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54    db eval {CREAT
05b0: 45 20 54 41 42 4c 45 20 78 74 31 28 61 2c 62 2c  E TABLE xt1(a,b,
05c0: 63 2c 64 29 7d 0a 0a 20 20 23 20 41 6e 64 20 63  c,d)}..  # And c
05d0: 72 65 61 74 65 20 61 6e 20 69 6d 70 6f 73 74 65  reate an imposte
05e0: 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  r table for the 
05f0: 74 31 63 20 69 6e 64 65 78 2e 0a 20 20 73 71 6c  t1c index..  sql
0600: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
0610: 6c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l SQLITE_TESTCTR
0620: 4c 5f 49 4d 50 4f 53 54 45 52 20 64 62 20 6d 61  L_IMPOSTER db ma
0630: 69 6e 20 31 20 24 74 31 63 5f 72 6f 6f 74 0a 20  in 1 $t1c_root. 
0640: 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45   db eval {CREATE
0650: 20 54 41 42 4c 45 20 78 74 31 63 28 63 2c 72 6f   TABLE xt1c(c,ro
0660: 77 69 64 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  wid,PRIMARY KEY(
0670: 63 2c 72 6f 77 69 64 29 29 57 49 54 48 4f 55 54  c,rowid))WITHOUT
0680: 20 52 4f 57 49 44 3b 7d 0a 0a 20 20 23 20 47 6f   ROWID;}..  # Go
0690: 20 6f 75 74 20 6f 66 20 69 6d 70 6f 73 74 65 72   out of imposter
06a0: 20 6d 6f 64 65 20 66 6f 72 20 6e 6f 77 2e 0a 20   mode for now.. 
06b0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
06c0: 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f 54 45 53  ntrol SQLITE_TES
06d0: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 64  TCTRL_IMPOSTER d
06e0: 62 20 6d 61 69 6e 20 30 20 30 0a 0a 20 20 23 20  b main 0 0..  # 
06f0: 43 72 65 61 74 65 20 74 72 69 67 67 65 72 73 20  Create triggers 
0700: 74 6f 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65  to record change
0710: 73 20 74 6f 20 78 74 31 2e 0a 20 20 23 0a 20 20  s to xt1..  #.  
0720: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52  db eval {.    CR
0730: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
0740: 63 68 6e 67 6c 6f 67 28 64 65 73 63 20 54 45 58  chnglog(desc TEX
0750: 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  T);.    CREATE T
0760: 45 4d 50 20 54 52 49 47 47 45 52 20 78 74 31 5f  EMP TRIGGER xt1_
0770: 64 65 6c 20 41 46 54 45 52 20 44 45 4c 45 54 45  del AFTER DELETE
0780: 20 4f 4e 20 78 74 31 20 42 45 47 49 4e 0a 20 20   ON xt1 BEGIN.  
0790: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
07a0: 63 68 6e 67 6c 6f 67 20 56 41 4c 55 45 53 28 0a  chnglog VALUES(.
07b0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
07c0: 66 28 27 44 45 4c 45 54 45 20 74 31 3a 20 72 6f  f('DELETE t1: ro
07d0: 77 69 64 3d 25 64 2c 20 61 3d 25 73 2c 20 62 3d  wid=%d, a=%s, b=
07e0: 25 73 2c 20 63 3d 25 73 2c 20 64 3d 25 73 27 2c  %s, c=%s, d=%s',
07f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0800: 20 20 20 6f 6c 64 2e 72 6f 77 69 64 2c 20 71 75     old.rowid, qu
0810: 6f 74 65 28 6f 6c 64 2e 61 29 2c 20 71 75 6f 74  ote(old.a), quot
0820: 65 28 6f 6c 64 2e 62 29 2c 20 71 75 6f 74 65 28  e(old.b), quote(
0830: 6f 6c 64 2e 63 29 2c 0a 20 20 20 20 20 20 20 20  old.c),.        
0840: 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 28            quote(
0850: 6f 6c 64 2e 64 29 29 29 3b 0a 20 20 20 20 45 4e  old.d)));.    EN
0860: 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45  D;.    CREATE TE
0870: 4d 50 20 54 52 49 47 47 45 52 20 78 74 31 5f 69  MP TRIGGER xt1_i
0880: 6e 73 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  ns AFTER INSERT 
0890: 4f 4e 20 78 74 31 20 42 45 47 49 4e 0a 20 20 20  ON xt1 BEGIN.   
08a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
08b0: 68 6e 67 6c 6f 67 20 56 41 4c 55 45 53 28 0a 20  hnglog VALUES(. 
08c0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
08d0: 28 27 49 4e 53 45 52 54 20 74 31 3a 20 20 72 6f  ('INSERT t1:  ro
08e0: 77 69 64 3d 25 64 2c 20 61 3d 25 73 2c 20 62 3d  wid=%d, a=%s, b=
08f0: 25 73 2c 20 63 3d 25 73 2c 20 64 3d 25 73 27 2c  %s, c=%s, d=%s',
0900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0910: 20 20 20 6e 65 77 2e 72 6f 77 69 64 2c 20 71 75     new.rowid, qu
0920: 6f 74 65 28 6e 65 77 2e 61 29 2c 20 71 75 6f 74  ote(new.a), quot
0930: 65 28 6e 65 77 2e 62 29 2c 20 71 75 6f 74 65 28  e(new.b), quote(
0940: 6e 65 77 2e 63 29 2c 0a 20 20 20 20 20 20 20 20  new.c),.        
0950: 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 28            quote(
0960: 6e 65 77 2e 64 29 29 29 3b 0a 20 20 20 20 45 4e  new.d)));.    EN
0970: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54  D;.  }.} {}..# T
0980: 68 65 20 78 74 31 20 74 61 62 6c 65 20 68 61 73  he xt1 table has
0990: 20 73 65 70 61 72 61 74 65 20 78 74 31 2e 72 6f   separate xt1.ro
09a0: 77 69 64 20 61 6e 64 20 78 74 31 2e 61 20 63 6f  wid and xt1.a co
09b0: 6c 75 6d 6e 73 2e 20 20 54 68 65 20 78 74 31 2e  lumns.  The xt1.
09c0: 72 6f 77 69 64 0a 23 20 63 6f 6c 75 6d 6e 20 63  rowid.# column c
09d0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 31  orresponds to t1
09e0: 2e 72 6f 77 69 64 20 61 6e 64 20 74 31 2e 61 2c  .rowid and t1.a,
09f0: 20 62 75 74 20 74 68 65 20 78 74 31 2e 61 20 63   but the xt1.a c
0a00: 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 0a  olumn is always.
0a10: 23 20 4e 55 4c 4c 0a 23 0a 64 6f 5f 65 78 65 63  # NULL.#.do_exec
0a20: 73 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74 65  sql_test imposte
0a30: 72 2d 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  r-1.1 {.  SELECT
0a40: 20 72 6f 77 69 64 20 46 52 4f 4d 20 78 74 31 20   rowid FROM xt1 
0a50: 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54 20 4e  WHERE a IS NOT N
0a60: 55 4c 4c 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  ULL;.} {}.do_exe
0a70: 63 73 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74  csql_test impost
0a80: 65 72 2d 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  er-1.2 {.  SELEC
0a90: 54 20 61 2c 62 2c 63 2c 64 20 46 52 4f 4d 20 74  T a,b,c,d FROM t
0aa0: 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
0ab0: 72 6f 77 69 64 2c 62 2c 63 2c 64 20 46 52 4f 4d  rowid,b,c,d FROM
0ac0: 20 78 74 31 3b 0a 20 20 53 45 4c 45 43 54 20 72   xt1;.  SELECT r
0ad0: 6f 77 69 64 2c 62 2c 63 2c 64 20 46 52 4f 4d 20  owid,b,c,d FROM 
0ae0: 78 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43  xt1 EXCEPT SELEC
0af0: 54 20 61 2c 62 2c 63 2c 64 20 46 52 4f 4d 20 74  T a,b,c,d FROM t
0b00: 31 3b 0a 7d 20 7b 7d 0a 0a 0a 23 20 4d 61 6b 65  1;.} {}...# Make
0b10: 20 63 68 61 6e 67 65 73 20 76 69 61 20 74 68 65   changes via the
0b20: 20 78 74 31 20 73 68 61 64 6f 77 20 74 61 62 6c   xt1 shadow tabl
0b30: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6e 6f  e.  This will no
0b40: 74 20 75 70 64 61 74 65 20 74 68 65 0a 23 20 69  t update the.# i
0b50: 6e 64 65 78 65 73 20 6f 6e 20 74 31 20 6e 6f 72  ndexes on t1 nor
0b60: 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69 71 75   check the uniqu
0b70: 65 6e 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74  eness constraint
0b80: 20 6f 6e 20 74 31 2e 63 20 6e 6f 72 20 63 68 65   on t1.c nor che
0b90: 63 6b 0a 23 20 74 68 65 20 4e 4f 54 20 4e 55 4c  ck.# the NOT NUL
0ba0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  L constraint on 
0bb0: 74 31 2e 64 2c 20 72 65 73 75 6c 74 69 6e 67 20  t1.d, resulting 
0bc0: 69 6e 20 61 20 6c 6f 67 69 63 61 6c 6c 79 20 69  in a logically i
0bd0: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 23 20 64 61  nconsistent.# da
0be0: 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 65 78 65  tabase..#.do_exe
0bf0: 63 73 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74  csql_test impost
0c00: 65 72 2d 31 2e 33 20 7b 0a 20 20 44 45 4c 45 54  er-1.3 {.  DELET
0c10: 45 20 46 52 4f 4d 20 78 74 31 20 57 48 45 52 45  E FROM xt1 WHERE
0c20: 20 72 6f 77 69 64 3d 35 3b 0a 20 20 49 4e 53 45   rowid=5;.  INSE
0c30: 52 54 20 49 4e 54 4f 20 78 74 31 28 72 6f 77 69  RT INTO xt1(rowi
0c40: 64 2c 61 2c 62 2c 63 2c 64 29 20 56 41 4c 55 45  d,a,b,c,d) VALUE
0c50: 53 28 39 39 2c 27 68 65 6c 6c 6f 27 2c 31 30 39  S(99,'hello',109
0c60: 39 2c 32 30 32 32 2c 4e 55 4c 4c 29 3b 0a 20 20  9,2022,NULL);.  
0c70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 68  SELECT * FROM ch
0c80: 6e 67 6c 6f 67 20 4f 52 44 45 52 20 42 59 20 72  nglog ORDER BY r
0c90: 6f 77 69 64 3b 0a 7d 20 5b 6c 69 73 74 20 5c 0a  owid;.} [list \.
0ca0: 20 20 7b 44 45 4c 45 54 45 20 74 31 3a 20 72 6f    {DELETE t1: ro
0cb0: 77 69 64 3d 35 2c 20 61 3d 4e 55 4c 4c 2c 20 62  wid=5, a=NULL, b
0cc0: 3d 31 30 30 35 2c 20 63 3d 32 30 30 35 2c 20 64  =1005, c=2005, d
0cd0: 3d 33 30 30 35 7d 20 5c 0a 20 20 7b 49 4e 53 45  =3005} \.  {INSE
0ce0: 52 54 20 74 31 3a 20 20 72 6f 77 69 64 3d 39 39  RT t1:  rowid=99
0cf0: 2c 20 61 3d 27 68 65 6c 6c 6f 27 2c 20 62 3d 31  , a='hello', b=1
0d00: 30 39 39 2c 20 63 3d 32 30 32 32 2c 20 64 3d 4e  099, c=2022, d=N
0d10: 55 4c 4c 7d 20 5c 0a 5d 0a 0a 64 6f 5f 65 78 65  ULL} \.]..do_exe
0d20: 63 73 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74  csql_test impost
0d30: 65 72 2d 31 2e 34 61 20 7b 0a 20 20 50 52 41 47  er-1.4a {.  PRAG
0d40: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0d50: 63 6b 3b 0a 7d 20 7b 2f 4e 55 4c 4c 20 76 61 6c  ck;.} {/NULL val
0d60: 75 65 20 69 6e 20 74 31 2e 64 2f 7d 0a 64 6f 5f  ue in t1.d/}.do_
0d70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6d 70  execsql_test imp
0d80: 6f 73 74 65 72 2d 31 2e 34 62 20 7b 0a 20 20 50  oster-1.4b {.  P
0d90: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
0da0: 63 68 65 63 6b 3b 0a 7d 20 7b 2f 72 6f 77 20 23  check;.} {/row #
0db0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e   missing from in
0dc0: 64 65 78 20 74 31 62 2f 7d 0a 64 6f 5f 65 78 65  dex t1b/}.do_exe
0dd0: 63 73 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74  csql_test impost
0de0: 65 72 2d 31 2e 34 63 20 7b 0a 20 20 50 52 41 47  er-1.4c {.  PRAG
0df0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0e00: 63 6b 3b 0a 7d 20 7b 2f 72 6f 77 20 23 20 6d 69  ck;.} {/row # mi
0e10: 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78  ssing from index
0e20: 20 74 31 63 2f 7d 0a 0a 23 20 43 6c 65 61 6e 75   t1c/}..# Cleanu
0e30: 70 20 74 68 65 20 63 6f 72 72 75 70 74 69 6f 6e  p the corruption
0e40: 2e 0a 23 20 54 68 65 6e 20 64 65 6d 6f 6e 73 74  ..# Then demonst
0e50: 72 61 74 65 20 74 68 61 74 20 74 68 65 20 78 74  rate that the xt
0e60: 31 63 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  1c imposter tabl
0e70: 65 20 63 61 6e 20 69 6e 73 65 72 74 20 6e 6f 6e  e can insert non
0e80: 2d 75 6e 69 71 75 65 0a 23 20 61 6e 64 20 4e 55  -unique.# and NU
0e90: 4c 4c 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74  LL values into t
0ea0: 68 65 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e  he UNIQUE index.
0eb0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
0ec0: 73 74 20 69 6d 70 6f 73 74 65 72 2d 32 2e 30 20  st imposter-2.0 
0ed0: 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  {.  DELETE FROM 
0ee0: 74 31 3b 0a 20 20 57 49 54 48 20 52 45 43 55 52  t1;.  WITH RECUR
0ef0: 53 49 56 45 20 63 28 69 29 20 41 53 20 28 56 41  SIVE c(i) AS (VA
0f00: 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c  LUES(1) UNION AL
0f10: 4c 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f  L SELECT i+1 FRO
0f20: 4d 20 63 20 57 48 45 52 45 20 69 3c 31 30 29 0a  M c WHERE i<10).
0f30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0f40: 31 28 61 2c 62 2c 63 2c 64 29 20 53 45 4c 45 43  1(a,b,c,d) SELEC
0f50: 54 20 69 2c 69 2c 69 2c 69 20 46 52 4f 4d 20 63  T i,i,i,i FROM c
0f60: 3b 0a 20 20 55 50 44 41 54 45 20 78 74 31 63 20  ;.  UPDATE xt1c 
0f70: 53 45 54 20 63 3d 4e 55 4c 4c 20 57 48 45 52 45  SET c=NULL WHERE
0f80: 20 72 6f 77 69 64 3d 35 3b 0a 20 20 50 52 41 47   rowid=5;.  PRAG
0f90: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0fa0: 63 6b 3b 0a 7d 20 7b 2f 72 6f 77 20 23 20 6d 69  ck;.} {/row # mi
0fb0: 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78  ssing from index
0fc0: 20 74 31 63 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73   t1c/}..do_execs
0fd0: 71 6c 5f 74 65 73 74 20 69 6d 70 6f 73 74 65 72  ql_test imposter
0fe0: 2d 32 2e 31 20 7b 0a 20 20 44 45 4c 45 54 45 20  -2.1 {.  DELETE 
0ff0: 46 52 4f 4d 20 74 31 3b 0a 20 20 57 49 54 48 20  FROM t1;.  WITH 
1000: 52 45 43 55 52 53 49 56 45 20 63 28 69 29 20 41  RECURSIVE c(i) A
1010: 53 20 28 56 41 4c 55 45 53 28 31 29 20 55 4e 49  S (VALUES(1) UNI
1020: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b  ON ALL SELECT i+
1030: 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20 69  1 FROM c WHERE i
1040: 3c 31 30 29 0a 20 20 20 49 4e 53 45 52 54 20 49  <10).   INSERT I
1050: 4e 54 4f 20 74 31 28 61 2c 62 2c 63 2c 64 29 20  NTO t1(a,b,c,d) 
1060: 53 45 4c 45 43 54 20 69 2c 69 2c 69 2c 69 20 46  SELECT i,i,i,i F
1070: 52 4f 4d 20 63 3b 0a 20 20 55 50 44 41 54 45 20  ROM c;.  UPDATE 
1080: 78 74 31 63 20 53 45 54 20 63 3d 39 39 20 57 48  xt1c SET c=99 WH
1090: 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 35 2c  ERE rowid IN (5,
10a0: 37 2c 39 29 3b 0a 20 20 53 45 4c 45 43 54 20 63  7,9);.  SELECT c
10b0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
10c0: 59 20 63 3b 0a 7d 20 7b 31 20 32 20 33 20 34 20  Y c;.} {1 2 3 4 
10d0: 36 20 38 20 31 30 20 39 39 20 39 39 20 39 39 7d  6 8 10 99 99 99}
10e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
10f0: 20 69 6d 70 6f 73 74 65 72 2d 32 2e 32 20 7b 0a   imposter-2.2 {.
1100: 20 20 55 50 44 41 54 45 20 78 74 31 20 53 45 54    UPDATE xt1 SET
1110: 20 63 3d 39 39 20 57 48 45 52 45 20 72 6f 77 69   c=99 WHERE rowi
1120: 64 20 49 4e 20 28 35 2c 37 2c 39 29 3b 0a 20 20  d IN (5,7,9);.  
1130: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
1140: 5f 63 68 65 63 6b 3b 0a 7d 20 7b 2f 6e 6f 6e 2d  _check;.} {/non-
1150: 75 6e 69 71 75 65 20 65 6e 74 72 79 20 69 6e 20  unique entry in 
1160: 69 6e 64 65 78 20 74 31 63 2f 7d 0a 0a 23 20 45  index t1c/}..# E
1170: 72 61 73 65 20 74 68 65 20 69 6d 70 6f 73 74 65  rase the imposte
1180: 72 20 74 61 62 6c 65 73 0a 23 0a 64 6f 5f 74 65  r tables.#.do_te
1190: 73 74 20 69 6d 70 6f 73 74 65 72 2d 33 2e 31 20  st imposter-3.1 
11a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
11b0: 5f 63 6f 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f  _control SQLITE_
11c0: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
11d0: 52 20 64 62 20 6d 61 69 6e 20 30 20 31 0a 20 20  R db main 0 1.  
11e0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 44 45  db eval {.    DE
11f0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
1200: 52 45 20 72 6f 77 69 64 20 49 4e 20 28 35 2c 37  RE rowid IN (5,7
1210: 2c 39 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ,9);.    PRAGMA 
1220: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
1230: 0a 20 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 0a 66 69  .  }.} {ok}...fi
1240: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.