/ Hex Artifact Content
Login

Artifact 5bd59290ab42cabbfb2e0ad1683a480f0d8e8693:


0000: 23 20 32 30 30 37 20 4d 61 79 20 31 30 0a 23 0a  # 2007 May 10.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01a0: 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20   The.# focus of 
01b0: 74 68 69 73 20 66 69 6c 65 20 69 73 20 67 65 6e  this file is gen
01c0: 65 72 61 74 69 6e 67 20 73 65 6d 69 2d 72 61 6e  erating semi-ran
01d0: 64 6f 6d 20 73 74 72 69 6e 67 73 20 6f 66 20 53  dom strings of S
01e0: 51 4c 0a 23 20 28 61 2e 6b 2e 61 2e 20 22 66 75  QL.# (a.k.a. "fu
01f0: 7a 7a 22 29 20 61 6e 64 20 73 65 6e 64 69 6e 67  zz") and sending
0200: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 70 61 72   it into the par
0210: 73 65 72 20 74 6f 20 74 72 79 20 74 6f 20 67 65  ser to try to ge
0220: 6e 65 72 61 74 65 0a 23 20 65 72 72 6f 72 73 2e  nerate.# errors.
0230: 0a 23 0a 23 20 24 49 64 3a 20 66 75 7a 7a 2e 74  .#.# $Id: fuzz.t
0240: 65 73 74 2c 76 20 31 2e 37 20 32 30 30 37 2f 30  est,v 1.7 2007/0
0250: 35 2f 31 31 20 31 36 3a 35 38 3a 30 34 20 64 61  5/11 16:58:04 da
0260: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
0270: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0280: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0290: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
02a0: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 73  ir/tester.tcl..s
02b0: 65 74 20 3a 3a 52 45 50 45 41 54 53 20 32 30 0a  et ::REPEATS 20.
02c0: 73 65 74 20 3a 3a 52 45 50 45 41 54 53 20 35 30  set ::REPEATS 50
02d0: 30 30 0a 0a 70 72 6f 63 20 66 75 7a 7a 20 7b 54  00..proc fuzz {T
02e0: 65 6d 70 6c 61 74 65 4c 69 73 74 7d 20 7b 0a 20  emplateList} {. 
02f0: 20 73 65 74 20 6e 20 5b 6c 6c 65 6e 67 74 68 20   set n [llength 
0300: 24 54 65 6d 70 6c 61 74 65 4c 69 73 74 5d 0a 20  $TemplateList]. 
0310: 20 73 65 74 20 69 20 5b 65 78 70 72 20 7b 69 6e   set i [expr {in
0320: 74 28 72 61 6e 64 28 29 2a 24 6e 29 7d 5d 0a 20  t(rand()*$n)}]. 
0330: 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c   return [uplevel
0340: 20 31 20 73 75 62 73 74 20 2d 6e 6f 76 61 72 20   1 subst -novar 
0350: 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 54  [list [lindex $T
0360: 65 6d 70 6c 61 74 65 4c 69 73 74 20 24 69 5d 5d  emplateList $i]]
0370: 5d 0a 7d 0a 0a 23 20 46 75 7a 7a 79 20 67 65 6e  ].}..# Fuzzy gen
0380: 65 72 61 74 69 6f 6e 20 70 72 69 6d 69 74 69 76  eration primitiv
0390: 65 73 3a 0a 23 0a 23 20 20 20 20 20 4c 69 74 65  es:.#.#     Lite
03a0: 72 61 6c 0a 23 20 20 20 20 20 55 6e 61 72 79 4f  ral.#     UnaryO
03b0: 70 0a 23 20 20 20 20 20 42 69 6e 61 72 79 4f 70  p.#     BinaryOp
03c0: 0a 23 20 20 20 20 20 45 78 70 72 0a 23 20 20 20  .#     Expr.#   
03d0: 20 20 54 61 62 6c 65 0a 23 20 20 20 20 20 53 65    Table.#     Se
03e0: 6c 65 63 74 0a 23 20 20 20 20 20 49 6e 73 65 72  lect.#     Inser
03f0: 74 0a 23 0a 0a 23 20 52 65 74 75 72 6e 73 20 61  t.#..# Returns a
0400: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
0410: 74 69 6e 67 20 61 6e 20 53 51 4c 20 6c 69 74 65  ting an SQL lite
0420: 72 61 6c 2e 0a 23 0a 70 72 6f 63 20 4c 69 74 65  ral..#.proc Lite
0430: 72 61 6c 20 7b 7d 20 7b 0a 20 20 73 65 74 20 54  ral {} {.  set T
0440: 65 6d 70 6c 61 74 65 4c 69 73 74 20 7b 0a 20 20  emplateList {.  
0450: 20 20 34 35 36 20 30 20 2d 34 35 36 20 31 20 2d    456 0 -456 1 -
0460: 31 20 0a 20 20 20 20 32 31 34 37 34 38 33 36 34  1 .    214748364
0470: 38 20 32 31 34 37 34 38 33 36 34 37 20 32 31 34  8 2147483647 214
0480: 37 34 38 33 36 34 39 20 2d 32 31 34 37 34 38 33  7483649 -2147483
0490: 36 34 37 20 2d 32 31 34 37 34 38 33 36 34 38 20  647 -2147483648 
04a0: 2d 32 31 34 37 34 38 33 36 34 39 0a 20 20 20 20  -2147483649.    
04b0: 27 54 68 65 27 20 27 66 69 72 73 74 27 20 27 65  'The' 'first' 'e
04c0: 78 70 65 72 69 6d 65 6e 74 73 27 20 27 69 6e 27  xperiments' 'in'
04d0: 20 27 68 61 72 64 77 61 72 65 27 20 27 66 61 75   'hardware' 'fau
04e0: 6c 74 27 20 27 69 6e 6a 65 63 74 69 6f 6e 27 0a  lt' 'injection'.
04f0: 20 20 20 20 7a 65 72 6f 62 6c 6f 62 28 31 30 30      zeroblob(100
0500: 30 29 0a 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20  0).    NULL.    
0510: 35 36 2e 31 20 2d 35 36 2e 31 0a 20 20 20 20 31  56.1 -56.1.    1
0520: 32 33 34 35 36 37 38 39 2e 31 32 33 34 35 36 37  23456789.1234567
0530: 38 39 39 0a 20 20 7d 0a 20 20 66 75 7a 7a 20 24  899.  }.  fuzz $
0540: 54 65 6d 70 6c 61 74 65 4c 69 73 74 0a 7d 0a 0a  TemplateList.}..
0550: 23 20 52 65 74 75 72 6e 73 20 61 20 73 74 72 69  # Returns a stri
0560: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  ng containing an
0570: 20 53 51 4c 20 75 6e 61 72 79 20 6f 70 65 72 61   SQL unary opera
0580: 74 6f 72 20 28 65 2e 67 2e 20 22 2b 22 20 6f 72  tor (e.g. "+" or
0590: 20 22 4e 4f 54 22 29 2e 0a 23 0a 70 72 6f 63 20   "NOT")..#.proc 
05a0: 55 6e 61 72 79 4f 70 20 7b 7d 20 7b 0a 20 20 73  UnaryOp {} {.  s
05b0: 65 74 20 54 65 6d 70 6c 61 74 65 4c 69 73 74 20  et TemplateList 
05c0: 7b 2b 20 2d 20 4e 4f 54 20 7e 7d 0a 20 20 66 75  {+ - NOT ~}.  fu
05d0: 7a 7a 20 24 54 65 6d 70 6c 61 74 65 4c 69 73 74  zz $TemplateList
05e0: 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 73 20 61 20  .}..# Returns a 
05f0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
0600: 67 20 61 6e 20 53 51 4c 20 62 69 6e 61 72 79 20  g an SQL binary 
0610: 6f 70 65 72 61 74 6f 72 20 28 65 2e 67 2e 20 22  operator (e.g. "
0620: 2a 22 20 6f 72 20 22 2f 22 29 2e 0a 23 0a 70 72  *" or "/")..#.pr
0630: 6f 63 20 42 69 6e 61 72 79 4f 70 20 7b 7d 20 7b  oc BinaryOp {} {
0640: 0a 20 20 73 65 74 20 54 65 6d 70 6c 61 74 65 4c  .  set TemplateL
0650: 69 73 74 20 7b 0a 20 20 20 20 7c 7c 20 2a 20 2f  ist {.    || * /
0660: 20 25 20 2b 20 2d 20 3c 3c 20 3e 3e 20 26 20 7c   % + - << >> & |
0670: 20 3c 20 3c 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20   < <= > >= = == 
0680: 21 3d 20 3c 3e 20 41 4e 44 20 4f 52 0a 20 20 20  != <> AND OR.   
0690: 20 4c 49 4b 45 20 47 4c 4f 42 20 7b 4e 4f 54 20   LIKE GLOB {NOT 
06a0: 4c 49 4b 45 7d 0a 20 20 7d 0a 20 20 66 75 7a 7a  LIKE}.  }.  fuzz
06b0: 20 24 54 65 6d 70 6c 61 74 65 4c 69 73 74 0a 7d   $TemplateList.}
06c0: 0a 0a 23 20 52 65 74 75 72 6e 20 74 68 65 20 63  ..# Return the c
06d0: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
06e0: 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  an SQL expressio
06f0: 6e 2e 0a 23 0a 73 65 74 20 3a 3a 45 78 70 72 44  n..#.set ::ExprD
0700: 65 70 74 68 20 30 0a 70 72 6f 63 20 45 78 70 72  epth 0.proc Expr
0710: 20 7b 20 7b 63 20 7b 7d 7d 20 7d 20 7b 0a 20 20   { {c {}} } {.  
0720: 69 6e 63 72 20 3a 3a 45 78 70 72 44 65 70 74 68  incr ::ExprDepth
0730: 0a 0a 20 20 73 65 74 20 54 65 6d 70 6c 61 74 65  ..  set Template
0740: 4c 69 73 74 20 5b 63 6f 6e 63 61 74 20 24 63 20  List [concat $c 
0750: 7b 5b 4c 69 74 65 72 61 6c 5d 7d 5d 0a 20 20 69  {[Literal]}].  i
0760: 66 20 7b 24 3a 3a 45 78 70 72 44 65 70 74 68 20  f {$::ExprDepth 
0770: 3c 20 35 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65  < 5} {.    lappe
0780: 6e 64 20 54 65 6d 70 6c 61 74 65 4c 69 73 74 20  nd TemplateList 
0790: 5c 0a 20 20 20 20 20 20 7b 5b 45 78 70 72 20 24  \.      {[Expr $
07a0: 63 5d 20 5b 42 69 6e 61 72 79 4f 70 5d 20 5b 45  c] [BinaryOp] [E
07b0: 78 70 72 20 24 63 5d 7d 20 5c 0a 20 20 20 20 20  xpr $c]} \.     
07c0: 20 7b 5b 55 6e 61 72 79 4f 70 5d 20 5b 45 78 70   {[UnaryOp] [Exp
07d0: 72 20 24 63 5d 7d 20 20 20 20 20 20 20 20 20 20  r $c]}          
07e0: 20 20 5c 0a 20 20 20 20 20 20 7b 5b 45 78 70 72    \.      {[Expr
07f0: 20 24 63 5d 20 49 53 4e 55 4c 4c 7d 20 20 20 20   $c] ISNULL}    
0800: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0810: 20 20 20 7b 5b 45 78 70 72 20 24 63 5d 20 4e 4f     {[Expr $c] NO
0820: 54 4e 55 4c 4c 7d 20 20 20 20 20 20 20 20 20 20  TNULL}          
0830: 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 43 41 53      \.      {CAS
0840: 54 28 5b 45 78 70 72 20 24 63 5d 20 41 53 20 62  T([Expr $c] AS b
0850: 6c 6f 62 29 7d 20 20 20 20 20 20 20 20 5c 0a 20  lob)}        \. 
0860: 20 20 20 20 20 7b 43 41 53 54 28 5b 45 78 70 72       {CAST([Expr
0870: 20 24 63 5d 20 41 53 20 74 65 78 74 29 7d 20 20   $c] AS text)}  
0880: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 43        \.      {C
0890: 41 53 54 28 5b 45 78 70 72 20 24 63 5d 20 41 53  AST([Expr $c] AS
08a0: 20 69 6e 74 65 67 65 72 29 7d 20 20 20 20 20 5c   integer)}     \
08b0: 0a 20 20 20 20 20 20 7b 43 41 53 54 28 5b 45 78  .      {CAST([Ex
08c0: 70 72 20 24 63 5d 20 41 53 20 72 65 61 6c 29 7d  pr $c] AS real)}
08d0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
08e0: 7b 61 62 73 28 5b 45 78 70 72 5d 29 7d 20 20 20  {abs([Expr])}   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 5c 0a 20 20 20 20 20 20 7b 63 6f 61 6c 65 73   \.      {coales
0910: 63 65 28 5b 45 78 70 72 5d 2c 20 5b 45 78 70 72  ce([Expr], [Expr
0920: 5d 29 7d 20 20 20 20 20 20 20 5c 0a 20 20 20 20  ])}       \.    
0930: 20 20 7b 68 65 78 28 5b 45 78 70 72 5d 29 7d 20    {hex([Expr])} 
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 5c 0a 20 20 20 20 20 20 7b 6c 65 6e 67     \.      {leng
0960: 74 68 28 5b 45 78 70 72 5d 29 7d 20 20 20 20 20  th([Expr])}     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0980: 20 20 20 20 7b 6c 6f 77 65 72 28 5b 45 78 70 72      {lower([Expr
0990: 5d 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ])}             
09a0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 75 70       \.      {up
09b0: 70 65 72 28 5b 45 78 70 72 5d 29 7d 20 20 20 20  per([Expr])}    
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
09d0: 20 20 20 20 20 20 7b 71 75 6f 74 65 28 5b 45 78        {quote([Ex
09e0: 70 72 5d 29 7d 20 20 20 20 20 20 20 20 20 20 20  pr])}           
09f0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b         \.      {
0a00: 72 61 6e 64 6f 6d 28 29 7d 20 20 20 20 20 20 20  random()}       
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 5c 0a 20 20 20 20 20 20 7b 72 61 6e 64 6f 6d 62  \.      {randomb
0a30: 6c 6f 62 28 6d 69 6e 28 6d 61 78 28 5b 45 78 70  lob(min(max([Exp
0a40: 72 5d 2c 31 29 2c 20 35 30 30 29 29 7d 20 20 20  r],1), 500))}   
0a50: 5c 0a 20 20 20 20 20 20 7b 74 79 70 65 6f 66 28  \.      {typeof(
0a60: 5b 45 78 70 72 5d 29 7d 20 20 20 20 20 20 20 20  [Expr])}        
0a70: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
0a80: 20 7b 73 75 62 73 74 72 28 5b 45 78 70 72 5d 2c   {substr([Expr],
0a90: 5b 45 78 70 72 5d 2c 5b 45 78 70 72 5d 29 7d 20  [Expr],[Expr])} 
0aa0: 20 20 5c 0a 20 20 20 20 20 20 7b 43 41 53 45 20    \.      {CASE 
0ab0: 57 48 45 4e 20 5b 45 78 70 72 20 24 63 5d 20 54  WHEN [Expr $c] T
0ac0: 48 45 4e 20 5b 45 78 70 72 20 24 63 5d 20 45 4c  HEN [Expr $c] EL
0ad0: 53 45 20 5b 45 78 70 72 20 24 63 5d 20 45 4e 44  SE [Expr $c] END
0ae0: 7d 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20  }       \.      
0af0: 7b 5b 4c 69 74 65 72 61 6c 5d 7d 20 7b 5b 4c 69  {[Literal]} {[Li
0b00: 74 65 72 61 6c 5d 7d 20 7b 5b 4c 69 74 65 72 61  teral]} {[Litera
0b10: 6c 5d 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 3a  l]}.  }.  if {$:
0b20: 3a 53 65 6c 65 63 74 44 65 70 74 68 20 3c 20 31  :SelectDepth < 1
0b30: 30 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64  0} {.    lappend
0b40: 20 54 65 6d 70 6c 61 74 65 4c 69 73 74 20 5c 0a   TemplateList \.
0b50: 20 20 20 20 20 20 7b 28 5b 53 65 6c 65 63 74 20        {([Select 
0b60: 31 5d 29 7d 20 20 20 20 20 20 20 20 20 20 20 20  1])}            
0b70: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0b80: 20 20 20 7b 5b 45 78 70 72 20 24 63 5d 20 49 4e     {[Expr $c] IN
0b90: 20 28 5b 53 65 6c 65 63 74 20 31 5d 29 7d 20 20   ([Select 1])}  
0ba0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
0bb0: 7b 5b 45 78 70 72 20 24 63 5d 20 4e 4f 54 20 49  {[Expr $c] NOT I
0bc0: 4e 20 28 5b 53 65 6c 65 63 74 20 31 5d 29 7d 20  N ([Select 1])} 
0bd0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 45 58       \.      {EX
0be0: 49 53 54 53 20 28 5b 53 65 6c 65 63 74 20 31 5d  ISTS ([Select 1]
0bf0: 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )}              
0c00: 20 20 5c 0a 20 20 7d 20 0a 20 20 73 65 74 20 72    \.  } .  set r
0c10: 65 73 20 5b 66 75 7a 7a 20 24 54 65 6d 70 6c 61  es [fuzz $Templa
0c20: 74 65 4c 69 73 74 5d 0a 20 20 69 6e 63 72 20 3a  teList].  incr :
0c30: 3a 45 78 70 72 44 65 70 74 68 20 2d 31 0a 20 20  :ExprDepth -1.  
0c40: 72 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a 0a 23  return $res.}..#
0c50: 20 52 65 74 75 72 6e 20 61 20 76 61 6c 69 64 20   Return a valid 
0c60: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 23 0a 73 65  table name..#.se
0c70: 74 20 3a 3a 54 61 62 6c 65 4c 69 73 74 20 5b 6c  t ::TableList [l
0c80: 69 73 74 5d 0a 70 72 6f 63 20 54 61 62 6c 65 20  ist].proc Table 
0c90: 7b 7d 20 7b 0a 20 20 73 65 74 20 54 65 6d 70 6c  {} {.  set Templ
0ca0: 61 74 65 4c 69 73 74 20 5b 63 6f 6e 63 61 74 20  ateList [concat 
0cb0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 24 3a  sqlite_master $:
0cc0: 3a 54 61 62 6c 65 4c 69 73 74 5d 0a 20 20 66 75  :TableList].  fu
0cd0: 7a 7a 20 24 54 65 6d 70 6c 61 74 65 4c 69 73 74  zz $TemplateList
0ce0: 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20 61 20 53  .}..# Return a S
0cf0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
0d00: 0a 23 0a 73 65 74 20 3a 3a 53 65 6c 65 63 74 44  .#.set ::SelectD
0d10: 65 70 74 68 20 30 0a 73 65 74 20 3a 3a 43 6f 6c  epth 0.set ::Col
0d20: 75 6d 6e 4c 69 73 74 20 5b 6c 69 73 74 5d 0a 70  umnList [list].p
0d30: 72 6f 63 20 53 65 6c 65 63 74 20 7b 7b 69 73 45  roc Select {{isE
0d40: 78 70 72 20 30 7d 7d 20 7b 0a 20 20 69 6e 63 72  xpr 0}} {.  incr
0d50: 20 3a 3a 53 65 6c 65 63 74 44 65 70 74 68 0a 20   ::SelectDepth. 
0d60: 20 73 65 74 20 54 65 6d 70 6c 61 74 65 4c 69 73   set TemplateLis
0d70: 74 20 7b 0a 20 20 20 20 20 20 7b 53 45 4c 45 43  t {.      {SELEC
0d80: 54 20 5b 45 78 70 72 5d 7d 0a 20 20 20 20 20 20  T [Expr]}.      
0d90: 7b 53 45 4c 45 43 54 20 5b 4c 69 74 65 72 61 6c  {SELECT [Literal
0da0: 5d 7d 0a 20 20 7d 0a 20 20 69 66 20 7b 24 3a 3a  ]}.  }.  if {$::
0db0: 53 65 6c 65 63 74 44 65 70 74 68 20 3c 20 35 7d  SelectDepth < 5}
0dc0: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 54   {.    lappend T
0dd0: 65 6d 70 6c 61 74 65 4c 69 73 74 20 5c 0a 20 20  emplateList \.  
0de0: 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20 5b 45        {SELECT [E
0df0: 78 70 72 5d 20 46 52 4f 4d 20 28 5b 53 65 6c 65  xpr] FROM ([Sele
0e00: 63 74 5d 29 7d 20 20 20 20 20 20 20 20 20 20 20  ct])}           
0e10: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 7b       \.        {
0e20: 53 45 4c 45 43 54 20 5b 45 78 70 72 20 24 3a 3a  SELECT [Expr $::
0e30: 43 6f 6c 75 6d 6e 4c 69 73 74 5d 20 46 52 4f 4d  ColumnList] FROM
0e40: 20 5b 54 61 62 6c 65 5d 7d 20 20 20 20 20 5c 0a   [Table]}     \.
0e50: 0a 20 20 20 20 69 66 20 7b 30 20 3d 3d 20 24 69  .    if {0 == $i
0e60: 73 45 78 70 72 7d 20 7b 0a 20 20 20 20 20 20 6c  sExpr} {.      l
0e70: 61 70 70 65 6e 64 20 54 65 6d 70 6c 61 74 65 4c  append TemplateL
0e80: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0eb0: 20 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20          {SELECT 
0ec0: 5b 45 78 70 72 5d 2c 20 5b 45 78 70 72 5d 20 46  [Expr], [Expr] F
0ed0: 52 4f 4d 20 28 5b 53 65 6c 65 63 74 5d 29 20 4f  ROM ([Select]) O
0ee0: 52 44 45 52 20 42 59 20 5b 45 78 70 72 5d 7d 20  RDER BY [Expr]} 
0ef0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 7b 53 45   \.          {SE
0f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 5b 53 65  LECT * FROM ([Se
0f10: 6c 65 63 74 5d 29 20 4f 52 44 45 52 20 42 59 20  lect]) ORDER BY 
0f20: 5b 45 78 70 72 5d 7d 20 20 20 20 20 20 20 20 20  [Expr]}         
0f30: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
0f40: 20 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    {SELECT * FROM
0f50: 20 5b 54 61 62 6c 65 5d 7d 20 20 20 20 20 20 20   [Table]}       
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0f80: 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20 2a         {SELECT *
0f90: 20 46 52 4f 4d 20 5b 54 61 62 6c 65 5d 20 57 48   FROM [Table] WH
0fa0: 45 52 45 20 5b 45 78 70 72 20 24 3a 3a 43 6f 6c  ERE [Expr $::Col
0fb0: 75 6d 6e 4c 69 73 74 5d 7d 20 20 20 20 20 20 20  umnList]}       
0fc0: 5c 0a 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  \.{SELECT * FROM
0fd0: 20 5b 54 61 62 6c 65 5d 2c 5b 54 61 62 6c 65 5d   [Table],[Table]
0fe0: 20 41 53 20 74 32 20 57 48 45 52 45 20 5b 45 78   AS t2 WHERE [Ex
0ff0: 70 72 20 24 3a 3a 43 6f 6c 75 6d 6e 4c 69 73 74  pr $::ColumnList
1000: 5d 20 4c 49 4d 49 54 20 31 7d 0a 20 20 20 20 7d  ] LIMIT 1}.    }
1010: 0a 20 20 7d 20 0a 20 20 73 65 74 20 72 65 73 20  .  } .  set res 
1020: 5b 66 75 7a 7a 20 24 54 65 6d 70 6c 61 74 65 4c  [fuzz $TemplateL
1030: 69 73 74 5d 0a 20 20 69 6e 63 72 20 3a 3a 53 65  ist].  incr ::Se
1040: 6c 65 63 74 44 65 70 74 68 20 2d 31 0a 20 20 73  lectDepth -1.  s
1050: 65 74 20 72 65 73 0a 7d 0a 0a 23 20 47 65 6e 65  et res.}..# Gene
1060: 72 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  rate and return 
1070: 61 20 66 75 7a 7a 79 20 49 4e 53 45 52 54 20 73  a fuzzy INSERT s
1080: 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 70 72 6f 63  tatement..#.proc
1090: 20 49 6e 73 65 72 74 20 7b 7d 20 7b 0a 20 20 73   Insert {} {.  s
10a0: 65 74 20 54 65 6d 70 6c 61 74 65 4c 69 73 74 20  et TemplateList 
10b0: 7b 0a 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20  {.      {INSERT 
10c0: 49 4e 54 4f 20 5b 54 61 62 6c 65 5d 20 56 41 4c  INTO [Table] VAL
10d0: 55 45 53 28 5b 45 78 70 72 5d 2c 20 5b 45 78 70  UES([Expr], [Exp
10e0: 72 5d 2c 20 5b 45 78 70 72 5d 29 3b 7d 0a 20 20  r], [Expr]);}.  
10f0: 20 20 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f      {INSERT INTO
1100: 20 5b 54 61 62 6c 65 5d 20 56 41 4c 55 45 53 28   [Table] VALUES(
1110: 5b 45 78 70 72 5d 2c 20 5b 45 78 70 72 5d 2c 20  [Expr], [Expr], 
1120: 5b 45 78 70 72 5d 2c 20 5b 45 78 70 72 5d 29 3b  [Expr], [Expr]);
1130: 7d 0a 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20  }.      {INSERT 
1140: 49 4e 54 4f 20 5b 54 61 62 6c 65 5d 20 56 41 4c  INTO [Table] VAL
1150: 55 45 53 28 5b 45 78 70 72 5d 2c 20 5b 45 78 70  UES([Expr], [Exp
1160: 72 5d 29 3b 7d 0a 20 20 7d 0a 20 20 66 75 7a 7a  r]);}.  }.  fuzz
1170: 20 24 54 65 6d 70 6c 61 74 65 4c 69 73 74 0a 7d   $TemplateList.}
1180: 0a 0a 70 72 6f 63 20 43 6f 6c 75 6d 6e 20 7b 7d  ..proc Column {}
1190: 20 7b 0a 20 20 66 75 7a 7a 20 24 3a 3a 43 6f 6c   {.  fuzz $::Col
11a0: 75 6d 6e 4c 69 73 74 0a 7d 0a 0a 23 20 47 65 6e  umnList.}..# Gen
11b0: 65 72 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  erate and return
11c0: 20 61 20 66 75 7a 7a 79 20 55 50 44 41 54 45 20   a fuzzy UPDATE 
11d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 70 72 6f  statement..#.pro
11e0: 63 20 55 70 64 61 74 65 20 7b 7d 20 7b 0a 20 20  c Update {} {.  
11f0: 73 65 74 20 54 65 6d 70 6c 61 74 65 4c 69 73 74  set TemplateList
1200: 20 7b 0a 20 20 20 20 7b 55 50 44 41 54 45 20 5b   {.    {UPDATE [
1210: 54 61 62 6c 65 5d 20 0a 20 20 20 20 20 53 45 54  Table] .     SET
1220: 20 5b 43 6f 6c 75 6d 6e 5d 20 3d 20 5b 45 78 70   [Column] = [Exp
1230: 72 20 24 3a 3a 43 6f 6c 75 6d 6e 4c 69 73 74 5d  r $::ColumnList]
1240: 20 0a 20 20 20 20 20 57 48 45 52 45 20 5b 45 78   .     WHERE [Ex
1250: 70 72 20 24 3a 3a 43 6f 6c 75 6d 6e 4c 69 73 74  pr $::ColumnList
1260: 5d 7d 0a 20 20 7d 0a 20 20 66 75 7a 7a 20 24 54  ]}.  }.  fuzz $T
1270: 65 6d 70 6c 61 74 65 4c 69 73 74 0a 7d 0a 0a 70  emplateList.}..p
1280: 72 6f 63 20 44 65 6c 65 74 65 20 7b 7d 20 7b 0a  roc Delete {} {.
1290: 20 20 73 65 74 20 54 65 6d 70 6c 61 74 65 4c 69    set TemplateLi
12a0: 73 74 20 7b 0a 20 20 20 20 7b 44 45 4c 45 54 45  st {.    {DELETE
12b0: 20 46 52 4f 4d 20 5b 54 61 62 6c 65 5d 20 57 48   FROM [Table] WH
12c0: 45 52 45 20 5b 45 78 70 72 20 24 3a 3a 43 6f 6c  ERE [Expr $::Col
12d0: 75 6d 6e 4c 69 73 74 5d 7d 0a 20 20 7d 0a 20 20  umnList]}.  }.  
12e0: 66 75 7a 7a 20 24 54 65 6d 70 6c 61 74 65 4c 69  fuzz $TemplateLi
12f0: 73 74 0a 7d 0a 0a 70 72 6f 63 20 53 74 61 74 65  st.}..proc State
1300: 6d 65 6e 74 20 7b 7d 20 7b 0a 20 20 73 65 74 20  ment {} {.  set 
1310: 54 65 6d 70 6c 61 74 65 4c 69 73 74 20 7b 0a 20  TemplateList {. 
1320: 20 20 20 7b 5b 55 70 64 61 74 65 5d 7d 0a 20 20     {[Update]}.  
1330: 20 20 7b 5b 49 6e 73 65 72 74 5d 7d 0a 20 20 20    {[Insert]}.   
1340: 20 7b 5b 53 65 6c 65 63 74 5d 7d 0a 20 20 20 20   {[Select]}.    
1350: 7b 5b 44 65 6c 65 74 65 5d 7d 0a 20 20 7d 0a 20  {[Delete]}.  }. 
1360: 20 66 75 7a 7a 20 24 54 65 6d 70 6c 61 74 65 4c   fuzz $TemplateL
1370: 69 73 74 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23  ist.}..#########
1380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
13c0: 0a 73 65 74 20 3a 3a 6c 6f 67 20 5b 6f 70 65 6e  .set ::log [open
13d0: 20 66 75 7a 7a 79 2e 6c 6f 67 20 77 5d 0a 0a 23   fuzzy.log w]..#
13e0: 20 0a 23 20 55 73 61 67 65 3a 20 64 6f 5f 66 75   .# Usage: do_fu
13f0: 7a 7a 79 5f 74 65 73 74 20 3c 74 65 73 74 6e 61  zzy_test <testna
1400: 6d 65 3e 20 3f 3c 6f 70 74 69 6f 6e 73 3e 3f 0a  me> ?<options>?.
1410: 23 20 0a 23 20 20 20 20 20 2d 74 65 6d 70 6c 61  # .#     -templa
1420: 74 65 0a 23 20 20 20 20 20 2d 65 72 72 6f 72 6c  te.#     -errorl
1430: 69 73 74 0a 23 20 20 20 20 20 0a 70 72 6f 63 20  ist.#     .proc 
1440: 64 6f 5f 66 75 7a 7a 79 5f 74 65 73 74 20 7b 74  do_fuzzy_test {t
1450: 65 73 74 6e 61 6d 65 20 61 72 67 73 7d 20 7b 0a  estname args} {.
1460: 20 20 73 65 74 20 3a 3a 66 75 7a 7a 79 6f 70 74    set ::fuzzyopt
1470: 73 28 2d 65 72 72 6f 72 6c 69 73 74 29 20 5b 6c  s(-errorlist) [l
1480: 69 73 74 5d 0a 20 20 61 72 72 61 79 20 73 65 74  ist].  array set
1490: 20 3a 3a 66 75 7a 7a 79 6f 70 74 73 20 24 61 72   ::fuzzyopts $ar
14a0: 67 73 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a 66  gs.  lappend ::f
14b0: 75 7a 7a 79 6f 70 74 73 28 2d 65 72 72 6f 72 6c  uzzyopts(-errorl
14c0: 69 73 74 29 20 7b 70 61 72 73 65 72 20 73 74 61  ist) {parser sta
14d0: 63 6b 20 6f 76 65 72 66 6c 6f 77 7d 20 7b 4f 52  ck overflow} {OR
14e0: 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 7d 0a 0a  DER BY column}..
14f0: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
1500: 20 7b 24 69 69 20 3c 20 24 3a 3a 52 45 50 45 41   {$ii < $::REPEA
1510: 54 53 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a  TS} {incr ii} {.
1520: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 7b 74 65      do_test ${te
1530: 73 74 6e 61 6d 65 7d 2e 24 69 69 20 7b 0a 20 20  stname}.$ii {.  
1540: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 20 5b 73      set ::sql [s
1550: 75 62 73 74 20 24 3a 3a 66 75 7a 7a 79 6f 70 74  ubst $::fuzzyopt
1560: 73 28 2d 74 65 6d 70 6c 61 74 65 29 5d 0a 20 20  s(-template)].  
1570: 20 20 20 20 70 75 74 73 20 24 3a 3a 6c 6f 67 20      puts $::log 
1580: 24 3a 3a 73 71 6c 0a 20 20 20 20 20 20 66 6c 75  $::sql.      flu
1590: 73 68 20 24 3a 3a 6c 6f 67 0a 20 20 20 20 20 20  sh $::log.      
15a0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 65  set rc [catch {e
15b0: 78 65 63 73 71 6c 20 24 3a 3a 73 71 6c 7d 20 6d  xecsql $::sql} m
15c0: 73 67 5d 0a 20 20 20 20 20 20 73 65 74 20 65 20  sg].      set e 
15d0: 31 0a 20 20 20 20 20 20 69 66 20 7b 24 72 63 7d  1.      if {$rc}
15e0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 65   {.        set e
15f0: 20 30 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   0.        forea
1600: 63 68 20 65 72 72 6f 72 20 24 3a 3a 66 75 7a 7a  ch error $::fuzz
1610: 79 6f 70 74 73 28 2d 65 72 72 6f 72 6c 69 73 74  yopts(-errorlist
1620: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ) {.          if
1630: 20 7b 30 20 3d 3d 20 5b 73 74 72 69 6e 67 20 66   {0 == [string f
1640: 69 72 73 74 20 24 65 72 72 6f 72 20 24 6d 73 67  irst $error $msg
1650: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]} {.           
1660: 20 73 65 74 20 65 20 31 0a 20 20 20 20 20 20 20   set e 1.       
1670: 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20 20       break.     
1680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16a0: 66 20 7b 24 65 20 3d 3d 20 30 7d 20 7b 0a 20 20  f {$e == 0} {.  
16b0: 20 20 20 20 20 20 70 75 74 73 20 22 22 0a 20 20        puts "".  
16c0: 20 20 20 20 20 20 70 75 74 73 20 24 3a 3a 73 71        puts $::sq
16d0: 6c 0a 20 20 20 20 20 20 20 20 70 75 74 73 20 24  l.        puts $
16e0: 6d 73 67 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  msg.      }.    
16f0: 20 20 73 65 74 20 65 0a 20 20 20 20 7d 20 7b 31    set e.    } {1
1700: 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.  }.}..#------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
1750: 73 65 20 74 65 73 74 73 20 63 61 75 73 65 64 20  se tests caused 
1760: 65 72 72 6f 72 73 20 74 68 61 74 20 77 65 72 65  errors that were
1770: 20 66 69 72 73 74 20 63 61 75 67 68 74 20 62 79   first caught by
1780: 20 74 68 65 20 74 65 73 74 73 0a 23 20 69 6e 20   the tests.# in 
1790: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 79 20  this file. They 
17a0: 61 72 65 20 73 74 69 6c 6c 20 68 65 72 65 2e 0a  are still here..
17b0: 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 31 2e 31  do_test fuzz-1.1
17c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
17d0: 20 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20     SELECT 'abc' 
17e0: 4c 49 4b 45 20 58 27 41 42 43 44 27 3b 0a 20 20  LIKE X'ABCD';.  
17f0: 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  }.} {0}.do_test 
1800: 66 75 7a 7a 2d 31 2e 32 20 7b 0a 20 20 65 78 65  fuzz-1.2 {.  exe
1810: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1820: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 7a 65 72  T 'abc' LIKE zer
1830: 6f 62 6c 6f 62 28 31 30 29 3b 0a 20 20 7d 0a 7d  oblob(10);.  }.}
1840: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 7a   {0}.do_test fuz
1850: 7a 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  z-1.3 {.  execsq
1860: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 7a  l {.    SELECT z
1870: 65 72 6f 62 6c 6f 62 28 31 30 29 20 4c 49 4b 45  eroblob(10) LIKE
1880: 20 27 61 62 63 27 3b 0a 20 20 7d 0a 7d 20 7b 30   'abc';.  }.} {0
1890: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 31  }.do_test fuzz-1
18a0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
18b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 28 2d 20 2d  .    SELECT (- -
18c0: 32 31 29 20 25 20 4e 4f 54 20 28 34 35 36 20 4c  21) % NOT (456 L
18d0: 49 4b 45 20 7a 65 72 6f 62 6c 6f 62 28 31 30 29  IKE zeroblob(10)
18e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f  );.  }.} {0}.do_
18f0: 74 65 73 74 20 66 75 7a 7a 2d 31 2e 35 20 7b 0a  test fuzz-1.5 {.
1900: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1910: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 28  SELECT (SELECT (
1920: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
1930: 28 53 45 4c 45 43 54 20 2d 32 31 34 37 34 38 33  (SELECT -2147483
1940: 36 34 38 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  648) FROM (SELEC
1950: 54 20 31 29 20 4f 52 44 45 52 20 42 59 20 31 0a  T 1) ORDER BY 1.
1960: 20 20 20 20 29 29 0a 20 20 7d 0a 7d 20 7b 2d 32      )).  }.} {-2
1970: 31 34 37 34 38 33 36 34 38 7d 0a 64 6f 5f 74 65  147483648}.do_te
1980: 73 74 20 66 75 7a 7a 2d 31 2e 36 20 7b 0a 20 20  st fuzz-1.6 {.  
1990: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
19a0: 4c 45 43 54 20 27 61 62 63 27 2c 20 7a 65 72 6f  LECT 'abc', zero
19b0: 62 6c 6f 62 28 31 29 20 46 52 4f 4d 20 28 53 45  blob(1) FROM (SE
19c0: 4c 45 43 54 20 31 29 20 4f 52 44 45 52 20 42 59  LECT 1) ORDER BY
19d0: 20 31 0a 20 20 7d 0a 7d 20 5b 65 78 65 63 73 71   1.  }.} [execsq
19e0: 6c 20 7b 53 45 4c 45 43 54 20 27 61 62 63 27 2c  l {SELECT 'abc',
19f0: 20 7a 65 72 6f 62 6c 6f 62 28 31 29 7d 5d 0a 0a   zeroblob(1)}]..
1a00: 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 31 2e 37  do_test fuzz-1.7
1a10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1a20: 20 20 20 53 45 4c 45 43 54 20 28 20 53 45 4c 45     SELECT ( SELE
1a30: 43 54 20 7a 65 72 6f 62 6c 6f 62 28 31 30 30 30  CT zeroblob(1000
1a40: 29 20 46 52 4f 4d 20 28 20 0a 20 20 20 20 20 20  ) FROM ( .      
1a50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
1a60: 45 4c 45 43 54 20 27 66 69 72 73 74 27 29 20 4f  ELECT 'first') O
1a70: 52 44 45 52 20 42 59 20 4e 4f 54 20 27 69 6e 27  RDER BY NOT 'in'
1a80: 29 20 0a 20 20 20 20 29 0a 20 20 7d 0a 7d 20 5b  ) .    ).  }.} [
1a90: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1aa0: 7a 65 72 6f 62 6c 6f 62 28 31 30 30 30 29 7d 5d  zeroblob(1000)}]
1ab0: 0a 0a 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 31  ..do_test fuzz-1
1ac0: 2e 38 20 7b 0a 20 20 23 20 50 72 6f 62 6c 65 6d  .8 {.  # Problem
1ad0: 73 20 77 69 74 68 20 6f 70 63 6f 64 65 20 4f 50  s with opcode OP
1ae0: 5f 54 6f 54 65 78 74 20 28 64 69 64 20 6e 6f 74  _ToText (did not
1af0: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 4d 45 4d   account for MEM
1b00: 5f 5a 65 72 6f 29 2e 0a 20 20 23 20 41 6c 73 6f  _Zero)..  # Also
1b10: 20 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 29   MemExpandBlob()
1b20: 20 77 61 73 20 6d 61 72 6b 69 6e 67 20 65 78 70   was marking exp
1b30: 61 6e 64 65 64 20 62 6c 6f 62 73 20 61 73 20 6e  anded blobs as n
1b40: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 20  ul-terminated.. 
1b50: 20 23 20 54 68 65 79 20 61 72 65 20 6e 6f 74 2e   # They are not.
1b60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1b70: 20 53 45 4c 45 43 54 20 43 41 53 54 28 7a 65 72   SELECT CAST(zer
1b80: 6f 62 6c 6f 62 28 31 30 30 30 29 20 41 53 20 74  oblob(1000) AS t
1b90: 65 78 74 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d  ext);.  }.} {{}}
1ba0: 0a 0a 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 31  ..do_test fuzz-1
1bb0: 2e 39 20 7b 0a 20 20 23 20 54 68 69 73 20 77 61  .9 {.  # This wa
1bc0: 73 20 63 61 75 73 69 6e 67 20 61 20 4e 55 4c 4c  s causing a NULL
1bd0: 20 70 6f 69 6e 74 65 72 20 64 65 72 65 66 65 72   pointer derefer
1be0: 65 6e 63 65 20 6f 66 20 45 78 70 72 2e 70 4c 69  ence of Expr.pLi
1bf0: 73 74 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  st..  execsql {.
1c00: 20 20 20 20 53 45 4c 45 43 54 20 31 20 46 52 4f      SELECT 1 FRO
1c10: 4d 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  M (SELECT * FROM
1c20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
1c30: 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 29 0a 20  HERE random()). 
1c40: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
1c50: 20 66 75 7a 7a 2d 31 2e 31 30 20 7b 0a 20 20 23   fuzz-1.10 {.  #
1c60: 20 42 75 67 20 69 6e 20 63 61 6c 63 75 6c 61 74   Bug in calculat
1c70: 69 6f 6e 20 6f 66 20 50 61 72 73 65 2e 63 6b 4f  ion of Parse.ckO
1c80: 66 66 73 65 74 20 63 61 75 73 69 6e 67 20 61 6e  ffset causing an
1c90: 20 61 73 73 65 72 74 28 29 20 0a 20 20 23 20 74   assert() .  # t
1ca0: 6f 20 66 61 69 6c 2e 20 50 72 6f 62 61 62 6c 79  o fail. Probably
1cb0: 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 65 78 65   harmless..  exe
1cc0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1cd0: 54 20 63 6f 61 6c 65 73 63 65 28 31 2c 20 73 75  T coalesce(1, su
1ce0: 62 73 74 72 28 20 31 2c 20 32 2c 20 6c 65 6e 67  bstr( 1, 2, leng
1cf0: 74 68 28 27 69 6e 27 20 49 4e 20 28 53 45 4c 45  th('in' IN (SELE
1d00: 43 54 20 31 29 29 29 29 0a 20 20 7d 0a 7d 20 7b  CT 1)))).  }.} {
1d10: 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1}..#-----------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d  -----.# Test som
1d60: 65 20 66 75 7a 7a 69 6c 79 20 67 65 6e 65 72 61  e fuzzily genera
1d70: 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ted expressions.
1d80: 0a 23 0a 64 6f 5f 66 75 7a 7a 79 5f 74 65 73 74  .#.do_fuzzy_test
1d90: 20 66 75 7a 7a 2d 32 20 2d 74 65 6d 70 6c 61 74   fuzz-2 -templat
1da0: 65 20 20 7b 20 53 45 4c 45 43 54 20 5b 45 78 70  e  { SELECT [Exp
1db0: 72 5d 20 7d 0a 0a 64 6f 5f 74 65 73 74 20 66 75  r] }..do_test fu
1dc0: 7a 7a 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  zz-3.1 {.  execs
1dd0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1de0: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
1df0: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
1e00: 41 42 4c 45 20 64 65 66 28 61 2c 20 62 2c 20 63  ABLE def(a, b, c
1e10: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
1e20: 42 4c 45 20 67 68 69 28 61 2c 20 62 2c 20 63 29  BLE ghi(a, b, c)
1e30: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 73 65 74 20 3a  ;.  }.} {}.set :
1e40: 3a 54 61 62 6c 65 4c 69 73 74 20 20 5b 6c 69 73  :TableList  [lis
1e50: 74 20 61 62 63 20 64 65 66 20 67 68 69 5d 0a 0a  t abc def ghi]..
1e60: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 0a 23 20 54 65 73 74 20 73 6f 6d 65 20 66 75  -.# Test some fu
1eb0: 7a 7a 69 6c 79 20 67 65 6e 65 72 61 74 65 64 20  zzily generated 
1ec0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ed0: 73 2e 0a 23 0a 64 6f 5f 66 75 7a 7a 79 5f 74 65  s..#.do_fuzzy_te
1ee0: 73 74 20 66 75 7a 7a 2d 33 2e 32 20 2d 74 65 6d  st fuzz-3.2 -tem
1ef0: 70 6c 61 74 65 20 20 7b 5b 53 65 6c 65 63 74 5d  plate  {[Select]
1f00: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 0a 23 20 49 6e 73 65 72 74 20 61 20  ----.# Insert a 
1f50: 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 6f 66 20  small amount of 
1f60: 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 64 61  data into the da
1f70: 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 6e 20  tabase and then 
1f80: 72 75 6e 20 0a 23 20 73 6f 6d 65 20 6d 6f 72 65  run .# some more
1f90: 20 67 65 6e 65 72 61 74 65 64 20 53 45 4c 45 43   generated SELEC
1fa0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 23 0a  T statements..#.
1fb0: 64 6f 5f 74 65 73 74 20 66 75 7a 7a 2d 34 2e 31  do_test fuzz-4.1
1fc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
1fe0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
1ff0: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
2000: 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34  NTO abc VALUES(4
2010: 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53  , 5, 6);.    INS
2020: 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c  ERT INTO abc VAL
2030: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20  UES(7, 8, 9);.  
2040: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
2050: 66 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  f VALUES(1, 2, 3
2060: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2070: 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 34 2c  TO def VALUES(4,
2080: 20 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45   5, 6);.    INSE
2090: 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55  RT INTO def VALU
20a0: 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20  ES(7, 8, 9);.   
20b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 67 68 69   INSERT INTO ghi
20c0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
20d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
20e0: 4f 20 67 68 69 20 56 41 4c 55 45 53 28 34 2c 20  O ghi VALUES(4, 
20f0: 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 6);.    INSER
2100: 54 20 49 4e 54 4f 20 67 68 69 20 56 41 4c 55 45  T INTO ghi VALUE
2110: 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20  S(7, 8, 9);.    
2120: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
2130: 5f 69 20 4f 4e 20 61 62 63 28 61 2c 20 62 2c 20  _i ON abc(a, b, 
2140: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  c);.    CREATE I
2150: 4e 44 45 58 20 64 65 66 5f 69 20 4f 4e 20 64 65  NDEX def_i ON de
2160: 66 28 63 2c 20 61 2c 20 62 29 3b 0a 20 20 20 20  f(c, a, b);.    
2170: 43 52 45 41 54 45 20 49 4e 44 45 58 20 67 68 69  CREATE INDEX ghi
2180: 5f 69 20 4f 4e 20 67 68 69 28 62 2c 20 63 2c 20  _i ON ghi(b, c, 
2190: 61 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  a);.  }.} {}.do_
21a0: 66 75 7a 7a 79 5f 74 65 73 74 20 66 75 7a 7a 2d  fuzzy_test fuzz-
21b0: 34 2e 32 20 2d 74 65 6d 70 6c 61 74 65 20 7b 5b  4.2 -template {[
21c0: 53 65 6c 65 63 74 5d 7d 0a 0a 23 2d 2d 2d 2d 2d  Select]}..#-----
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
2210: 73 74 20 73 6f 6d 65 20 66 75 7a 7a 79 20 49 4e  st some fuzzy IN
2220: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 3a  SERT statements:
2230: 0a 23 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20  .#.do_test      
2240: 20 20 20 66 75 7a 7a 2d 35 2e 31 20 7b 65 78 65     fuzz-5.1 {exe
2250: 63 73 71 6c 20 42 45 47 49 4e 7d 20 7b 7d 0a 64  csql BEGIN} {}.d
2260: 6f 5f 66 75 7a 7a 79 5f 74 65 73 74 20 20 20 66  o_fuzzy_test   f
2270: 75 7a 7a 2d 35 2e 32 20 2d 74 65 6d 70 6c 61 74  uzz-5.2 -templat
2280: 65 20 20 7b 5b 49 6e 73 65 72 74 5d 7d 20 2d 65  e  {[Insert]} -e
2290: 72 72 6f 72 6c 69 73 74 20 74 61 62 6c 65 0a 69  rrorlist table.i
22a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 66  ntegrity_check f
22b0: 75 7a 7a 2d 35 2e 32 2e 69 6e 74 65 67 72 69 74  uzz-5.2.integrit
22c0: 79 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  y.do_test       
22d0: 20 20 66 75 7a 7a 2d 35 2e 33 20 7b 65 78 65 63    fuzz-5.3 {exec
22e0: 73 71 6c 20 43 4f 4d 4d 49 54 7d 20 7b 7d 0a 69  sql COMMIT} {}.i
22f0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 66  ntegrity_check f
2300: 75 7a 7a 2d 35 2e 34 2e 69 6e 74 65 67 72 69 74  uzz-5.4.integrit
2310: 79 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y..#------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 0a 23 20 4e 6f 77 20 74 68 61 74 20  ----.# Now that 
2360: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 69 6e  there is data in
2370: 20 74 68 65 20 64 61 74 62 61 73 65 2c 20 72 75   the datbase, ru
2380: 6e 20 73 6f 6d 65 20 6d 6f 72 65 20 53 45 4c 45  n some more SELE
2390: 43 54 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73  CT .# statements
23a0: 0a 23 0a 73 65 74 20 3a 3a 43 6f 6c 75 6d 6e 4c  .#.set ::ColumnL
23b0: 69 73 74 20 5b 6c 69 73 74 20 61 20 62 20 63 5d  ist [list a b c]
23c0: 0a 73 65 74 20 45 20 7b 7b 6e 6f 20 73 75 63 68  .set E {{no such
23d0: 20 63 6f 6c 7d 20 7b 61 6d 62 69 67 75 6f 75 73   col} {ambiguous
23e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 7d 7d 0a 64   column name}}.d
23f0: 6f 5f 66 75 7a 7a 79 5f 74 65 73 74 20 66 75 7a  o_fuzzy_test fuz
2400: 7a 2d 36 2e 31 20 2d 74 65 6d 70 6c 61 74 65 20  z-6.1 -template 
2410: 7b 5b 53 65 6c 65 63 74 5d 7d 20 2d 65 72 72 6f  {[Select]} -erro
2420: 72 6c 69 73 74 20 24 45 0a 0a 23 2d 2d 2d 2d 2d  rlist $E..#-----
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75  -----------.# Ru
2470: 6e 20 73 6f 6d 65 20 53 45 4c 45 43 54 73 2c 20  n some SELECTs, 
2480: 49 4e 53 45 52 54 73 2c 20 55 50 44 41 54 45 73  INSERTs, UPDATEs
2490: 20 61 6e 64 20 44 45 4c 45 54 45 73 20 69 6e 20   and DELETEs in 
24a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  a transaction..#
24b0: 0a 73 65 74 20 45 20 7b 7b 6e 6f 20 73 75 63 68  .set E {{no such
24c0: 20 63 6f 6c 7d 20 7b 61 6d 62 69 67 75 6f 75 73   col} {ambiguous
24d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 7d 20 7b 74   column name} {t
24e0: 61 62 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 20  able}}.do_test  
24f0: 20 20 20 20 20 20 20 66 75 7a 7a 2d 37 2e 31 20         fuzz-7.1 
2500: 7b 65 78 65 63 73 71 6c 20 42 45 47 49 4e 7d 20  {execsql BEGIN} 
2510: 7b 7d 0a 64 6f 5f 66 75 7a 7a 79 5f 74 65 73 74  {}.do_fuzzy_test
2520: 20 20 20 66 75 7a 7a 2d 37 2e 32 20 2d 74 65 6d     fuzz-7.2 -tem
2530: 70 6c 61 74 65 20 7b 5b 53 74 61 74 65 6d 65 6e  plate {[Statemen
2540: 74 5d 7d 20 2d 65 72 72 6f 72 6c 69 73 74 20 24  t]} -errorlist $
2550: 45 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  E.integrity_chec
2560: 6b 20 66 75 7a 7a 2d 37 2e 33 2e 69 6e 74 65 67  k fuzz-7.3.integ
2570: 72 69 74 79 0a 64 6f 5f 74 65 73 74 20 20 20 20  rity.do_test    
2580: 20 20 20 20 20 66 75 7a 7a 2d 37 2e 34 20 7b 65       fuzz-7.4 {e
2590: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 7d 20 7b  xecsql COMMIT} {
25a0: 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  }.integrity_chec
25b0: 6b 20 66 75 7a 7a 2d 37 2e 35 2e 69 6e 74 65 67  k fuzz-7.5.integ
25c0: 72 69 74 79 0a 0a 63 6c 6f 73 65 20 24 3a 3a 6c  rity..close $::l
25d0: 6f 67 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     og.finish_test.