/ Hex Artifact Content
Login

Artifact f04b9f236e51d4db701bdebe8ac01318c83102a8:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c  /*.** This modul
0010: 65 20 69 6e 74 65 72 66 61 63 65 73 20 53 51 4c  e interfaces SQL
0020: 69 74 65 20 74 6f 20 74 68 65 20 47 6f 6f 67 6c  ite to the Googl
0030: 65 20 4f 53 53 2d 46 75 7a 7a 2c 20 66 75 7a 7a  e OSS-Fuzz, fuzz
0040: 65 72 20 61 73 20 61 20 73 65 72 76 69 63 65 2e  er as a service.
0050: 0a 2a 2a 20 28 68 74 74 70 73 3a 2f 2f 67 69 74  .** (https://git
0060: 68 75 62 2e 63 6f 6d 2f 67 6f 6f 67 6c 65 2f 6f  hub.com/google/o
0070: 73 73 2d 66 75 7a 7a 29 0a 2a 2f 0a 23 69 6e 63  ss-fuzz).*/.#inc
0080: 6c 75 64 65 20 3c 73 74 64 64 65 66 2e 68 3e 0a  lude <stddef.h>.
0090: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6e 74  #include <stdint
00a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h>.#include "sq
00b0: 6c 69 74 65 33 2e 68 22 0a 0a 2f 2a 20 52 65 74  lite3.h"../* Ret
00c0: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
00d0: 72 65 61 6c 2d 77 6f 72 6c 64 20 74 69 6d 65 20  real-world time 
00e0: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  in milliseconds 
00f0: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 4a 75 6c  since the.** Jul
0100: 69 61 6e 20 65 70 6f 63 68 20 28 2d 34 37 31 34  ian epoch (-4714
0110: 2d 31 31 2d 32 34 29 2e 0a 2a 2f 0a 73 74 61 74  -11-24)..*/.stat
0120: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
0130: 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29   timeOfDay(void)
0140: 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
0150: 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73  e3_vfs *clockVfs
0160: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
0170: 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63  int64 t;.  if( c
0180: 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f  lockVfs==0 ) clo
0190: 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ckVfs = sqlite3_
01a0: 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
01b0: 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65  f( clockVfs->iVe
01c0: 72 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63  rsion>=2 && cloc
01d0: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
01e0: 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20  meInt64!=0 ){.  
01f0: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
0200: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c  rentTimeInt64(cl
0210: 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d  ockVfs, &t);.  }
0220: 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65  else{.    double
0230: 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   r;.    clockVfs
0240: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63  ->xCurrentTime(c
0250: 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20  lockVfs, &r);.  
0260: 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69    t = (sqlite3_i
0270: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
0280: 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  .0);.  }.  retur
0290: 6e 20 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n t;.}..#ifndef 
02a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
02b0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
02c0: 0a 2a 2a 20 50 72 6f 67 72 65 73 73 20 68 61 6e  .** Progress han
02d0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  dler callback..*
02e0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
02f0: 74 20 69 73 20 74 68 65 20 63 75 74 6f 66 66 2d  t is the cutoff-
0300: 74 69 6d 65 20 61 66 74 65 72 20 77 68 69 63 68  time after which
0310: 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20   all processing 
0320: 73 68 6f 75 6c 64 0a 2a 2a 20 73 74 6f 70 2e 20  should.** stop. 
0330: 20 53 6f 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a   So return non-z
0340: 65 72 6f 20 69 66 20 74 68 65 20 63 75 74 2d 6f  ero if the cut-o
0350: 66 66 20 74 69 6d 65 20 69 73 20 65 78 63 65 65  ff time is excee
0360: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
0370: 6e 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  nt progress_hand
0380: 6c 65 72 28 76 6f 69 64 20 2a 70 52 65 74 75 72  ler(void *pRetur
0390: 6e 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  n) {.  sqlite3_i
03a0: 6e 74 36 34 20 69 43 75 74 6f 66 66 54 69 6d 65  nt64 iCutoffTime
03b0: 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
03c0: 36 34 2a 29 70 52 65 74 75 72 6e 3b 0a 20 20 72  64*)pReturn;.  r
03d0: 65 74 75 72 6e 20 74 69 6d 65 4f 66 44 61 79 28  eturn timeOfDay(
03e0: 29 3e 3d 69 43 75 74 6f 66 66 54 69 6d 65 3b 0a  )>=iCutoffTime;.
03f0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0400: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c  Callback for sql
0410: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
0420: 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 5f  static int exec_
0430: 68 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43  handler(void *pC
0440: 6e 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  nt, int argc, ch
0450: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
0460: 2a 2a 6e 61 6d 65 76 29 7b 0a 20 20 69 6e 74 20  **namev){.  int 
0470: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 20 29 7b  i;.  if( argv ){
0480: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0490: 61 72 67 63 3b 20 69 2b 2b 29 20 73 71 6c 69 74  argc; i++) sqlit
04a0: 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f  e3_free(sqlite3_
04b0: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72  mprintf("%s", ar
04c0: 67 76 5b 69 5d 29 29 3b 0a 20 20 7d 0a 20 20 72  gv[i]));.  }.  r
04d0: 65 74 75 72 6e 20 28 28 2a 28 69 6e 74 2a 29 70  eturn ((*(int*)p
04e0: 43 6e 74 29 2d 2d 29 3c 3d 30 3b 0a 7d 0a 0a 2f  Cnt)--)<=0;.}../
04f0: 2a 0a 2a 2a 20 4d 61 69 6e 20 65 6e 74 72 79 20  *.** Main entry 
0500: 70 6f 69 6e 74 2e 20 20 54 68 65 20 66 75 7a 7a  point.  The fuzz
0510: 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 69 73 20  er invokes this 
0520: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 65 61  function with ea
0530: 63 68 0a 2a 2a 20 66 75 7a 7a 65 64 20 69 6e 70  ch.** fuzzed inp
0540: 75 74 2e 0a 2a 2f 0a 69 6e 74 20 4c 4c 56 4d 46  ut..*/.int LLVMF
0550: 75 7a 7a 65 72 54 65 73 74 4f 6e 65 49 6e 70 75  uzzerTestOneInpu
0560: 74 28 63 6f 6e 73 74 20 75 69 6e 74 38 5f 74 2a  t(const uint8_t*
0570: 20 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 73 69   data, size_t si
0580: 7a 65 29 20 7b 0a 20 20 69 6e 74 20 65 78 65 63  ze) {.  int exec
0590: 43 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Cnt = 0;        
05a0: 20 2f 2a 20 41 62 6f 72 74 20 72 6f 77 20 63 61   /* Abort row ca
05b0: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 63 6f 75 6e  llback when coun
05c0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 2a  t reaches zero *
05d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
05e0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  g = 0;       /* 
05f0: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65  Error message re
0600: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
0610: 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 73 71 6c  _exec() */.  sql
0620: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
0630: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
0640: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0650: 20 2a 2f 0a 20 20 75 69 6e 74 38 5f 74 20 75 53   */.  uint8_t uS
0660: 65 6c 65 63 74 6f 72 3b 20 20 20 20 20 20 20 2f  elector;       /
0670: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
0680: 69 6e 70 75 74 20 64 61 74 61 5b 5d 20 2a 2f 0a  input data[] */.
0690: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
06a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
06b0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 76  turn code from v
06c0: 61 72 69 6f 75 73 20 69 6e 74 65 72 66 61 63 65  arious interface
06d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  s */.  char *zSq
06e0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
06f0: 2f 2a 20 5a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  /* Zero-terminat
0700: 65 64 20 63 6f 70 79 20 6f 66 20 64 61 74 61 5b  ed copy of data[
0710: 5d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  ] */.  sqlite3_i
0720: 6e 74 36 34 20 69 43 75 74 6f 66 66 3b 20 20 20  nt64 iCutoff;   
0730: 2f 2a 20 43 75 74 6f 66 66 20 74 69 6d 65 72 20  /* Cutoff timer 
0740: 2a 2f 0a 0a 20 20 69 66 28 20 73 69 7a 65 3c 33  */..  if( size<3
0750: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f   ) return 0;   /
0760: 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66 20 75  * Early out if u
0770: 6e 73 75 66 66 69 63 69 65 6e 74 20 64 61 74 61  nsufficient data
0780: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63   */..  /* Extrac
0790: 74 20 74 68 65 20 73 65 6c 65 63 74 6f 72 20 62  t the selector b
07a0: 79 74 65 20 66 72 6f 6d 20 74 68 65 20 62 65 67  yte from the beg
07b0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  inning of the in
07c0: 70 75 74 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20  put.  But only. 
07d0: 20 2a 2a 20 64 6f 20 74 68 69 73 20 69 66 20 74   ** do this if t
07e0: 68 65 20 73 65 63 6f 6e 64 20 62 79 74 65 20 69  he second byte i
07f0: 73 20 61 20 5c 6e 2e 20 20 49 66 20 74 68 65 20  s a \n.  If the 
0800: 73 65 63 6f 6e 64 20 62 79 74 65 20 69 73 20 6e  second byte is n
0810: 6f 74 20 5c 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e  ot \n,.  ** then
0820: 20 75 73 65 20 61 20 64 65 66 61 75 6c 74 20 73   use a default s
0830: 65 6c 65 63 74 6f 72 20 2a 2f 0a 20 20 69 66 28  elector */.  if(
0840: 20 64 61 74 61 5b 31 5d 3d 3d 27 5c 6e 27 20 29   data[1]=='\n' )
0850: 7b 0a 20 20 20 20 75 53 65 6c 65 63 74 6f 72 20  {.    uSelector 
0860: 3d 20 64 61 74 61 5b 30 5d 3b 20 20 64 61 74 61  = data[0];  data
0870: 20 2b 3d 20 32 3b 20 73 69 7a 65 20 2d 3d 20 32   += 2; size -= 2
0880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
0890: 53 65 6c 65 63 74 6f 72 20 3d 20 30 78 66 64 3b  Selector = 0xfd;
08a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
08b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
08c0: 6e 65 63 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 75  nection.  Only u
08d0: 73 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  se an in-memory 
08e0: 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 72  database. */.  r
08f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
0900: 5f 76 32 28 22 66 75 7a 7a 2e 64 62 22 2c 20 26  _v2("fuzz.db", &
0910: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53  db,.           S
0920: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
0930: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
0940: 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
0950: 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 2c 20  TE_OPEN_MEMORY, 
0960: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
0970: 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 6e 64 65  eturn 0;..#ifnde
0980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
0990: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
09a0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
09b0: 70 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72  progress handler
09c0: 20 65 76 65 72 79 20 35 30 30 20 74 68 6f 75 73   every 500 thous
09d0: 61 6e 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  and instructions
09e0: 20 28 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a   (approximately.
09f0: 20 20 2a 2a 20 32 30 20 74 6f 20 34 30 20 74 69    ** 20 to 40 ti
0a00: 6d 65 73 20 70 65 72 20 73 65 63 6f 6e 64 29 20  mes per second) 
0a10: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
0a20: 69 66 20 77 65 20 61 72 65 20 74 61 6b 69 6e 67  if we are taking
0a30: 20 74 6f 6f 20 6c 6f 6e 67 2e 0a 20 20 2a 2f 0a   too long..  */.
0a40: 20 20 69 43 75 74 6f 66 66 20 3d 20 74 69 6d 65    iCutoff = time
0a50: 4f 66 44 61 79 28 29 20 2b 20 31 30 30 30 30 3b  OfDay() + 10000;
0a60: 20 20 2f 2a 20 4e 6f 77 20 2b 20 31 30 20 73 65    /* Now + 10 se
0a70: 63 6f 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  conds */.  sqlit
0a80: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
0a90: 6c 65 72 28 64 62 2c 20 35 30 30 30 30 30 2c 20  ler(db, 500000, 
0aa0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
0ab0: 2c 20 28 76 6f 69 64 2a 29 26 69 43 75 74 6f 66  , (void*)&iCutof
0ac0: 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  f);.#endif..  /*
0ad0: 20 42 69 74 20 31 20 6f 66 20 74 68 65 20 73 65   Bit 1 of the se
0ae0: 6c 65 63 74 6f 72 20 65 6e 61 62 6c 65 73 20 66  lector enables f
0af0: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
0b00: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  raints */.  sqli
0b10: 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
0b20: 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
0b30: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 75  G_ENABLE_FKEY, u
0b40: 53 65 6c 65 63 74 6f 72 26 31 2c 20 26 72 63 29  Selector&1, &rc)
0b50: 3b 0a 20 20 75 53 65 6c 65 63 74 6f 72 20 3e 3e  ;.  uSelector >>
0b60: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 52 65 6d 61 69  = 1;..  /* Remai
0b70: 6e 69 6e 67 20 62 69 74 73 20 6f 66 20 74 68 65  ning bits of the
0b80: 20 73 65 6c 65 63 74 6f 72 20 64 65 74 65 72 6d   selector determ
0b90: 69 6e 65 20 61 20 6c 69 6d 69 74 20 6f 6e 20 74  ine a limit on t
0ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
0bb0: 2a 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  * output rows */
0bc0: 0a 20 20 65 78 65 63 43 6e 74 20 3d 20 75 53 65  .  execCnt = uSe
0bd0: 6c 65 63 74 6f 72 20 2b 20 31 3b 0a 0a 20 20 2f  lector + 1;..  /
0be0: 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 2e 20 20  * Run the SQL.  
0bf0: 54 68 65 20 73 71 6c 69 74 65 5f 65 78 65 63 28  The sqlite_exec(
0c00: 29 20 69 6e 74 65 72 66 61 63 65 20 65 78 70 65  ) interface expe
0c10: 63 74 73 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69  cts a zero-termi
0c20: 6e 61 74 65 64 0a 20 20 2a 2a 20 73 74 72 69 6e  nated.  ** strin
0c30: 67 2c 20 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70  g, so make a cop
0c40: 79 2e 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73  y. */.  zSql = s
0c50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
0c60: 25 2e 2a 73 22 2c 20 28 69 6e 74 29 73 69 7a 65  %.*s", (int)size
0c70: 2c 20 64 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  , data);.  sqlit
0c80: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
0c90: 2c 20 65 78 65 63 5f 68 61 6e 64 6c 65 72 2c 20  , exec_handler, 
0ca0: 28 76 6f 69 64 2a 29 26 65 78 65 63 43 6e 74 2c  (void*)&execCnt,
0cb0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f   &zErrMsg);..  /
0cc0: 2a 20 43 6c 65 61 6e 75 70 20 61 6e 64 20 72 65  * Cleanup and re
0cd0: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
0ce0: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
0cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
0d00: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
0d10: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65  _close(db);.  re
0d20: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.