/ Hex Artifact Content
Login

Artifact 27cb5566a6e5f2d76f9d4aa2eca45524401fd61e:


0000: 23 20 32 30 30 38 20 41 75 67 75 73 74 20 30 31  # 2008 August 01
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 2a 2a 0a 23 0a 23 20 54 68 69 73 20  ******.#.# This 
0170: 74 65 73 74 20 73 63 72 69 70 74 20 63 68 65 63  test script chec
0180: 6b 73 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  ks malloc failur
0190: 65 73 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75  es in WHERE clau
01a0: 73 65 20 61 6e 61 6c 79 73 69 73 2e 0a 23 20 0a  se analysis..# .
01b0: 23 20 24 49 64 3a 20 6d 61 6c 6c 6f 63 4b 2e 74  # $Id: mallocK.t
01c0: 65 73 74 2c 76 20 31 2e 33 20 32 30 30 39 2f 30  est,v 1.3 2009/0
01d0: 31 2f 30 38 20 32 31 3a 30 30 3a 30 33 20 64 72  1/08 21:00:03 dr
01e0: 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73  h Exp $..set tes
01f0: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0200: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0210: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0220: 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65  r.tcl.source $te
0230: 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d  stdir/malloc_com
0240: 6d 6f 6e 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  mon.tcl.set test
0250: 70 72 65 66 69 78 20 6d 61 6c 6c 6f 63 4b 0a 0a  prefix mallocK..
0260: 73 65 74 20 73 71 6c 20 7b 53 45 4c 45 43 54 20  set sql {SELECT 
0270: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
0280: 45 52 45 20 28 61 3d 31 20 4f 52 20 61 3d 32 29  ERE (a=1 OR a=2)
0290: 7d 0a 66 6f 72 20 7b 73 65 74 20 78 20 31 7d 20  }.for {set x 1} 
02a0: 7b 24 78 3c 35 7d 20 7b 69 6e 63 72 20 78 7d 20  {$x<5} {incr x} 
02b0: 7b 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22  {.  append sql "
02c0: 20 41 4e 44 20 62 3d 79 22 0a 20 20 64 6f 5f 6d   AND b=y".  do_m
02d0: 61 6c 6c 6f 63 5f 74 65 73 74 20 6d 61 6c 6c 6f  alloc_test mallo
02e0: 63 4b 2d 31 2e 24 78 20 2d 73 71 6c 62 6f 64 79  cK-1.$x -sqlbody
02f0: 20 24 73 71 6c 20 2d 73 71 6c 70 72 65 70 20 7b   $sql -sqlprep {
0300: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0310: 45 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20 43  E t1(a,b);.    C
0320: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
0330: 2c 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 65 74 20  ,y);.  }.}..set 
0340: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
0350: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 47 4c  OM t1 WHERE a GL
0360: 4f 42 20 27 78 79 7a 2a 27 20 41 4e 44 20 28 61  OB 'xyz*' AND (a
0370: 3d 31 20 4f 52 20 61 3d 32 29 7d 0a 66 6f 72 20  =1 OR a=2)}.for 
0380: 7b 73 65 74 20 78 20 31 7d 20 7b 24 78 3c 35 7d  {set x 1} {$x<5}
0390: 20 7b 69 6e 63 72 20 78 7d 20 7b 0a 20 20 61 70   {incr x} {.  ap
03a0: 70 65 6e 64 20 73 71 6c 20 22 20 41 4e 44 20 62  pend sql " AND b
03b0: 21 3d 24 78 22 0a 20 20 64 6f 5f 6d 61 6c 6c 6f  !=$x".  do_mallo
03c0: 63 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 4b 2d 32  c_test mallocK-2
03d0: 2e 24 78 20 2d 73 71 6c 62 6f 64 79 20 24 73 71  .$x -sqlbody $sq
03e0: 6c 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 20  l -sqlprep {.   
03f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0400: 28 61 2c 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 65  (a,b);.  }.}..se
0410: 74 20 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20  t sql {SELECT * 
0420: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
0430: 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20 31 30  BETWEEN 5 AND 10
0440: 7d 0a 66 6f 72 20 7b 73 65 74 20 78 20 31 7d 20  }.for {set x 1} 
0450: 7b 24 78 3c 35 7d 20 7b 69 6e 63 72 20 78 7d 20  {$x<5} {incr x} 
0460: 7b 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22  {.  append sql "
0470: 20 41 4e 44 20 62 3d 24 78 22 0a 20 20 64 6f 5f   AND b=$x".  do_
0480: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 6d 61 6c 6c  malloc_test mall
0490: 6f 63 4b 2d 33 2e 24 78 20 2d 73 71 6c 62 6f 64  ocK-3.$x -sqlbod
04a0: 79 20 24 73 71 6c 20 2d 73 71 6c 70 72 65 70 20  y $sql -sqlprep 
04b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
04c0: 4c 45 20 74 31 28 61 2c 62 29 3b 0a 20 20 7d 0a  LE t1(a,b);.  }.
04d0: 7d 0a 0a 73 65 74 20 73 71 6c 20 7b 53 45 4c 45  }..set sql {SELE
04e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
04f0: 52 45 20 62 3d 30 7d 0a 66 6f 72 20 7b 73 65 74  RE b=0}.for {set
0500: 20 78 20 31 7d 20 7b 24 78 3c 35 7d 20 7b 69 6e   x 1} {$x<5} {in
0510: 63 72 20 78 7d 20 7b 0a 20 20 73 65 74 20 74 65  cr x} {.  set te
0520: 72 6d 20 22 28 62 3d 24 78 22 0a 20 20 66 6f 72  rm "(b=$x".  for
0530: 20 7b 73 65 74 20 79 20 30 7d 20 7b 24 79 3c 24   {set y 0} {$y<$
0540: 78 7d 20 7b 69 6e 63 72 20 79 7d 20 7b 0a 20 20  x} {incr y} {.  
0550: 20 20 61 70 70 65 6e 64 20 74 65 72 6d 20 22 20    append term " 
0560: 41 4e 44 20 61 21 3d 24 79 22 0a 20 20 7d 0a 20  AND a!=$y".  }. 
0570: 20 61 70 70 65 6e 64 20 73 71 6c 20 22 20 4f 52   append sql " OR
0580: 20 24 74 65 72 6d 29 22 0a 20 20 64 6f 5f 6d 61   $term)".  do_ma
0590: 6c 6c 6f 63 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  lloc_test malloc
05a0: 4b 2d 34 2e 24 78 20 2d 73 71 6c 62 6f 64 79 20  K-4.$x -sqlbody 
05b0: 24 73 71 6c 20 2d 73 71 6c 70 72 65 70 20 7b 0a  $sql -sqlprep {.
05c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
05d0: 20 74 31 28 61 2c 62 29 3b 0a 20 20 7d 0a 7d 0a   t1(a,b);.  }.}.
05e0: 0a 69 66 63 61 70 61 62 6c 65 20 76 74 61 62 20  .ifcapable vtab 
05f0: 7b 0a 20 20 73 65 74 20 73 71 6c 20 7b 53 45 4c  {.  set sql {SEL
0600: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
0610: 45 52 45 20 61 20 4d 41 54 43 48 20 27 78 79 7a  ERE a MATCH 'xyz
0620: 27 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 78 20  '}.  for {set x 
0630: 31 7d 20 7b 24 78 3c 35 7d 20 7b 69 6e 63 72 20  1} {$x<5} {incr 
0640: 78 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  x} {.    append 
0650: 73 71 6c 20 22 20 41 4e 44 20 62 21 3d 24 78 22  sql " AND b!=$x"
0660: 0a 20 20 20 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74  .    do_malloc_t
0670: 65 73 74 20 6d 61 6c 6c 6f 63 4b 2d 35 2e 24 78  est mallocK-5.$x
0680: 20 2d 73 71 6c 62 6f 64 79 20 24 73 71 6c 20 2d   -sqlbody $sql -
0690: 74 63 6c 70 72 65 70 20 7b 0a 20 20 20 20 20 20  tclprep {.      
06a0: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f  register_echo_mo
06b0: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f  dule [sqlite3_co
06c0: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
06d0: 20 64 62 5d 0a 20 20 20 20 20 20 64 62 20 65 76   db].      db ev
06e0: 61 6c 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45  al {.        CRE
06f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
0700: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
0710: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0720: 74 32 20 55 53 49 4e 47 20 65 63 68 6f 28 74 31  t2 USING echo(t1
0730: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0740: 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .  }.}..#-------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 4f  --.# Test that O
07a0: 4f 4d 20 65 72 72 6f 72 73 20 61 72 65 20 63 6f  OM errors are co
07b0: 72 72 65 63 74 6c 79 20 68 61 6e 64 6c 65 64 20  rrectly handled 
07c0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
07d0: 20 75 73 65 73 20 73 74 61 74 34 0a 23 20 64 61   uses stat4.# da
07e0: 74 61 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ta to estimate t
07f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
0800: 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 73  s visited by a s
0810: 6b 69 70 2d 73 63 61 6e 20 72 61 6e 67 65 20 71  kip-scan range q
0820: 75 65 72 79 2e 0a 23 0a 61 64 64 5f 61 6c 69 67  uery..#.add_alig
0830: 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
0840: 74 69 6f 6e 73 20 64 62 0a 64 6f 5f 65 78 65 63  tions db.do_exec
0850: 73 71 6c 5f 74 65 73 74 20 36 2e 30 20 7b 0a 20  sql_test 6.0 {. 
0860: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
0870: 28 61 20 54 45 58 54 2c 20 62 20 54 45 58 54 20  (a TEXT, b TEXT 
0880: 43 4f 4c 4c 41 54 45 20 75 74 66 31 36 5f 61 6c  COLLATE utf16_al
0890: 69 67 6e 65 64 2c 20 63 29 3b 0a 20 20 49 4e 53  igned, c);.  INS
08a0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
08b0: 45 53 28 27 6f 6e 65 27 2c 20 27 2e 2e 2e 2e 2e  ES('one', '.....
08c0: 27 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 0);.  INSERT 
08d0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
08e0: 6f 6e 65 27 2c 20 27 2e 2e 2e 2e 78 27 2c 20 31  one', '....x', 1
08f0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0900: 20 74 33 20 56 41 4c 55 45 53 28 27 6f 6e 65 27   t3 VALUES('one'
0910: 2c 20 27 2e 2e 2e 78 2e 27 2c 20 32 29 3b 0a 20  , '...x.', 2);. 
0920: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
0930: 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 2e  VALUES('one', '.
0940: 2e 2e 78 78 27 2c 20 33 29 3b 0a 20 20 49 4e 53  ..xx', 3);.  INS
0950: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
0960: 45 53 28 27 6f 6e 65 27 2c 20 27 2e 2e 78 2e 2e  ES('one', '..x..
0970: 27 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 4);.  INSERT 
0980: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0990: 6f 6e 65 27 2c 20 27 2e 2e 78 2e 78 27 2c 20 35  one', '..x.x', 5
09a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
09b0: 20 74 33 20 56 41 4c 55 45 53 28 27 6f 6e 65 27   t3 VALUES('one'
09c0: 2c 20 27 2e 2e 78 78 2e 27 2c 20 36 29 3b 0a 20  , '..xx.', 6);. 
09d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
09e0: 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 2e  VALUES('one', '.
09f0: 2e 78 78 78 27 2c 20 37 29 3b 0a 20 20 49 4e 53  .xxx', 7);.  INS
0a00: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
0a10: 45 53 28 27 6f 6e 65 27 2c 20 27 2e 78 2e 2e 2e  ES('one', '.x...
0a20: 27 2c 20 38 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 8);.  INSERT 
0a30: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0a40: 6f 6e 65 27 2c 20 27 2e 78 2e 2e 78 27 2c 20 39  one', '.x..x', 9
0a50: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0a60: 20 74 33 20 56 41 4c 55 45 53 28 27 6f 6e 65 27   t3 VALUES('one'
0a70: 2c 20 27 2e 78 2e 78 2e 27 2c 20 31 30 29 3b 0a  , '.x.x.', 10);.
0a80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0a90: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
0aa0: 2e 78 2e 78 78 27 2c 20 31 31 29 3b 0a 20 20 49  .x.xx', 11);.  I
0ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0ac0: 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 2e 78 78  LUES('one', '.xx
0ad0: 2e 2e 27 2c 20 31 32 29 3b 0a 20 20 49 4e 53 45  ..', 12);.  INSE
0ae0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0af0: 53 28 27 6f 6e 65 27 2c 20 27 2e 78 78 2e 78 27  S('one', '.xx.x'
0b00: 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 13);.  INSERT 
0b10: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0b20: 6f 6e 65 27 2c 20 27 2e 78 78 78 2e 27 2c 20 31  one', '.xxx.', 1
0b30: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
0b40: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 6f 6e 65  O t3 VALUES('one
0b50: 27 2c 20 27 2e 78 78 78 78 27 2c 20 31 35 29 3b  ', '.xxxx', 15);
0b60: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
0b70: 74 33 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c  t3 VALUES('two',
0b80: 20 27 78 2e 2e 2e 2e 27 2c 20 31 36 29 3b 0a 20   'x....', 16);. 
0b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
0ba0: 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 27 78  VALUES('two', 'x
0bb0: 2e 2e 2e 78 27 2c 20 31 37 29 3b 0a 20 20 49 4e  ...x', 17);.  IN
0bc0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
0bd0: 55 45 53 28 27 74 77 6f 27 2c 20 27 78 2e 2e 78  UES('two', 'x..x
0be0: 2e 27 2c 20 31 38 29 3b 0a 20 20 49 4e 53 45 52  .', 18);.  INSER
0bf0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
0c00: 28 27 74 77 6f 27 2c 20 27 78 2e 2e 78 78 27 2c  ('two', 'x..xx',
0c10: 20 31 39 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   19);.  INSERT I
0c20: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 74  NTO t3 VALUES('t
0c30: 77 6f 27 2c 20 27 78 2e 78 2e 2e 27 2c 20 32 30  wo', 'x.x..', 20
0c40: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0c50: 20 74 33 20 56 41 4c 55 45 53 28 27 74 77 6f 27   t3 VALUES('two'
0c60: 2c 20 27 78 2e 78 2e 78 27 2c 20 32 31 29 3b 0a  , 'x.x.x', 21);.
0c70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0c80: 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 27   VALUES('two', '
0c90: 78 2e 78 78 2e 27 2c 20 32 32 29 3b 0a 20 20 49  x.xx.', 22);.  I
0ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
0cb0: 4c 55 45 53 28 27 74 77 6f 27 2c 20 27 78 2e 78  LUES('two', 'x.x
0cc0: 78 78 27 2c 20 32 33 29 3b 0a 20 20 49 4e 53 45  xx', 23);.  INSE
0cd0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0ce0: 53 28 27 74 77 6f 27 2c 20 27 78 78 2e 2e 2e 27  S('two', 'xx...'
0cf0: 2c 20 32 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 24);.  INSERT 
0d00: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0d10: 74 77 6f 27 2c 20 27 78 78 2e 2e 78 27 2c 20 32  two', 'xx..x', 2
0d20: 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  5);.  INSERT INT
0d30: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 74 77 6f  O t3 VALUES('two
0d40: 27 2c 20 27 78 78 2e 78 2e 27 2c 20 32 36 29 3b  ', 'xx.x.', 26);
0d50: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0d60: 33 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20  3 VALUES('two', 
0d70: 27 78 78 2e 78 78 27 2c 20 32 37 29 3b 0a 20 20  'xx.xx', 27);.  
0d80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
0d90: 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 27 78 78  ALUES('two', 'xx
0da0: 78 2e 2e 27 2c 20 32 38 29 3b 0a 20 20 49 4e 53  x..', 28);.  INS
0db0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
0dc0: 45 53 28 27 74 77 6f 27 2c 20 27 78 78 78 2e 78  ES('two', 'xxx.x
0dd0: 27 2c 20 32 39 29 3b 0a 20 20 49 4e 53 45 52 54  ', 29);.  INSERT
0de0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
0df0: 27 74 77 6f 27 2c 20 27 78 78 78 78 2e 27 2c 20  'two', 'xxxx.', 
0e00: 33 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  30);.  INSERT IN
0e10: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 74 77  TO t3 VALUES('tw
0e20: 6f 27 2c 20 27 78 78 78 78 78 27 2c 20 33 31 29  o', 'xxxxx', 31)
0e30: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
0e40: 20 74 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t3 SELECT * FRO
0e50: 4d 20 74 33 3b 0a 0a 20 20 43 52 45 41 54 45 20  M t3;..  CREATE 
0e60: 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 33 28 61  INDEX i3 ON t3(a
0e70: 2c 20 62 29 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b  , b);.  ANALYZE;
0e80: 0a 0a 20 20 53 45 4c 45 43 54 20 27 78 27 20 3e  ..  SELECT 'x' >
0e90: 20 27 2e 27 3b 0a 7d 20 7b 31 7d 0a 0a 69 66 63   '.';.} {1}..ifc
0ea0: 61 70 61 62 6c 65 20 73 74 61 74 34 20 7b 0a 20  apable stat4 {. 
0eb0: 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 36 2e 31   do_eqp_test 6.1
0ec0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 44 49   {.    SELECT DI
0ed0: 53 54 49 4e 43 54 20 63 20 46 52 4f 4d 20 74 33  STINCT c FROM t3
0ee0: 20 57 48 45 52 45 20 62 20 42 45 54 57 45 45 4e   WHERE b BETWEEN
0ef0: 20 27 2e 78 78 2e 2e 27 20 41 4e 44 20 27 2e 78   '.xx..' AND '.x
0f00: 78 78 78 27 3b 0a 20 20 7d 20 7b 0a 20 20 20 20  xxx';.  } {.    
0f10: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
0f20: 42 4c 45 20 74 33 20 55 53 49 4e 47 20 49 4e 44  BLE t3 USING IND
0f30: 45 58 20 69 33 20 28 41 4e 59 28 61 29 20 41 4e  EX i3 (ANY(a) AN
0f40: 44 20 62 3e 3f 20 41 4e 44 20 62 3c 3f 29 7d 20  D b>? AND b<?)} 
0f50: 0a 20 20 20 20 30 20 30 20 30 20 7b 55 53 45 20  .    0 0 0 {USE 
0f60: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
0f70: 44 49 53 54 49 4e 43 54 7d 0a 20 20 7d 0a 7d 0a  DISTINCT}.  }.}.
0f80: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
0f90: 74 20 36 20 2d 66 61 75 6c 74 73 20 6f 6f 6d 2a  t 6 -faults oom*
0fa0: 20 2d 62 6f 64 79 20 7b 0a 20 20 64 62 20 63 61   -body {.  db ca
0fb0: 63 68 65 20 66 6c 75 73 68 0a 20 20 64 62 20 65  che flush.  db e
0fc0: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 44 49 53  val { SELECT DIS
0fd0: 54 49 4e 43 54 20 63 20 46 52 4f 4d 20 74 33 20  TINCT c FROM t3 
0fe0: 57 48 45 52 45 20 62 20 42 45 54 57 45 45 4e 20  WHERE b BETWEEN 
0ff0: 27 2e 78 78 2e 2e 27 20 41 4e 44 20 27 2e 78 78  '.xx..' AND '.xx
1000: 78 78 27 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a  xx' }.} -test {.
1010: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
1020: 72 65 73 75 6c 74 20 7b 30 20 7b 31 32 20 31 33  result {0 {12 13
1030: 20 31 34 20 31 35 7d 7d 20 0a 7d 0a 0a 64 6f 5f   14 15}} .}..do_
1040: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 31  execsql_test 7.1
1050: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
1060: 45 20 78 31 28 61 20 49 4e 54 45 47 45 52 20 50  E x1(a INTEGER P
1070: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1080: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
1090: 73 74 20 37 2e 32 20 2d 66 61 75 6c 74 73 20 6f  st 7.2 -faults o
10a0: 6f 6d 2a 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78  om* -body {.  ex
10b0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
10c0: 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 61   FROM x1 WHERE a
10d0: 20 3d 20 28 53 45 4c 45 43 54 20 31 29 20 7d 0a   = (SELECT 1) }.
10e0: 7d 20 2d 74 65 73 74 20 7b 0a 20 20 66 61 75 6c  } -test {.  faul
10f0: 74 73 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74  tsim_test_result
1100: 20 5b 6c 69 73 74 20 30 20 7b 7d 5d 0a 7d 0a 0a   [list 0 {}].}..
1110: 72 65 73 65 74 5f 64 62 0a 0a 70 72 6f 63 20 69  reset_db..proc i
1120: 73 71 72 74 20 7b 69 7d 20 7b 20 65 78 70 72 20  sqrt {i} { expr 
1130: 7b 20 69 6e 74 28 73 71 72 74 28 24 69 29 29 20  { int(sqrt($i)) 
1140: 7d 20 7d 0a 64 62 20 66 75 6e 63 20 69 73 71 72  } }.db func isqr
1150: 74 20 69 73 71 72 74 0a 0a 64 6f 5f 65 78 65 63  t isqrt..do_exec
1160: 73 71 6c 5f 74 65 73 74 20 38 2e 30 20 7b 0a 20  sql_test 8.0 {. 
1170: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
1180: 20 3d 20 27 75 74 66 2d 31 36 27 3b 0a 20 20 43   = 'utf-16';.  C
1190: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 78  REATE TABLE x2(x
11a0: 20 54 45 58 54 2c 20 79 20 54 45 58 54 29 3b 0a   TEXT, y TEXT);.
11b0: 20 20 57 49 54 48 20 64 61 74 61 28 69 29 20 41    WITH data(i) A
11c0: 53 20 28 0a 20 20 20 20 53 45 4c 45 43 54 20 31  S (.    SELECT 1
11d0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
11e0: 54 20 69 2b 31 20 46 52 4f 4d 20 64 61 74 61 0a  T i+1 FROM data.
11f0: 20 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e 54    ).  INSERT INT
1200: 4f 20 78 32 20 53 45 4c 45 43 54 20 69 73 71 72  O x2 SELECT isqr
1210: 74 28 69 29 2c 20 69 73 71 72 74 28 69 29 20 46  t(i), isqrt(i) F
1220: 52 4f 4d 20 64 61 74 61 20 4c 49 4d 49 54 20 34  ROM data LIMIT 4
1230: 30 30 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  00;.  CREATE IND
1240: 45 58 20 78 32 78 20 4f 4e 20 78 32 28 78 29 3b  EX x2x ON x2(x);
1250: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
1260: 78 32 79 20 4f 4e 20 78 32 28 79 29 3b 0a 20 20  x2y ON x2(y);.  
1270: 41 4e 41 4c 59 5a 45 3b 0a 20 20 44 45 4c 45 54  ANALYZE;.  DELET
1280: 45 20 46 52 4f 4d 20 78 32 3b 0a 7d 0a 0a 70 72  E FROM x2;.}..pr
1290: 6f 63 20 73 74 72 20 7b 61 7d 20 7b 20 72 65 74  oc str {a} { ret
12a0: 75 72 6e 20 24 61 20 7d 0a 64 62 20 66 75 6e 63  urn $a }.db func
12b0: 20 73 74 72 20 2d 64 65 74 65 72 6d 69 6e 69 73   str -determinis
12c0: 74 69 63 20 73 74 72 0a 0a 64 6f 5f 66 61 75 6c  tic str..do_faul
12d0: 74 73 69 6d 5f 74 65 73 74 20 38 20 2d 66 61 75  tsim_test 8 -fau
12e0: 6c 74 73 20 6f 6f 6d 2a 20 2d 62 6f 64 79 20 7b  lts oom* -body {
12f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
1300: 45 43 54 20 2a 20 46 52 4f 4d 20 78 32 20 57 48  ECT * FROM x2 WH
1310: 45 52 45 20 78 20 3d 20 73 74 72 28 27 31 39 27  ERE x = str('19'
1320: 29 20 41 4e 44 20 79 20 3d 20 73 74 72 28 27 34  ) AND y = str('4
1330: 27 29 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20  ') }.} -test {. 
1340: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
1350: 65 73 75 6c 74 20 5b 6c 69 73 74 20 30 20 7b 7d  esult [list 0 {}
1360: 5d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  ].}...finish_tes
1370: 74 0a                                            t.