/ Hex Artifact Content
Login

Artifact 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 33 2d 32 31  /*.** 2018-03-21
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  **.** This progr
0180: 61 6d 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  am attempts to v
0190: 65 72 69 66 79 20 74 68 65 20 63 6f 72 72 65 63  erify the correc
01a0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 53 51 4c  tness of the SQL
01b0: 69 74 65 20 71 75 65 72 79 0a 2a 2a 20 6f 70 74  ite query.** opt
01c0: 69 6d 69 7a 65 72 20 62 79 20 66 75 7a 7a 69 6e  imizer by fuzzin
01d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  g..**.** The inp
01e0: 75 74 20 69 73 20 61 6e 20 53 51 4c 20 73 63 72  ut is an SQL scr
01f0: 69 70 74 2c 20 70 72 65 73 75 6d 61 62 6c 79 20  ipt, presumably 
0200: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 66  generated by a f
0210: 75 7a 7a 65 72 2e 20 20 54 68 65 0a 2a 2a 20 61  uzzer.  The.** a
0220: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
0230: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
0240: 2e 20 20 49 66 20 6e 6f 20 66 69 6c 65 73 20 61  .  If no files a
0250: 72 65 20 6e 61 6d 65 64 2c 20 73 74 61 6e 64 61  re named, standa
0260: 72 64 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 72  rd.** input is r
0270: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
0280: 51 4c 20 73 63 72 69 70 74 20 69 73 20 72 75 6e  QL script is run
0290: 20 74 77 69 63 65 2c 20 6f 6e 63 65 20 77 69 74   twice, once wit
02a0: 68 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 65  h optimization e
02b0: 6e 61 62 6c 65 64 2c 20 61 6e 64 20 61 67 61 69  nabled, and agai
02c0: 6e 0a 2a 2a 20 77 69 74 68 20 6f 70 74 69 6d 69  n.** with optimi
02d0: 7a 61 74 69 6f 6e 20 64 69 73 61 62 6c 65 64 2e  zation disabled.
02e0: 20 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20    If the output 
02f0: 69 73 20 6e 6f 74 20 65 71 75 69 76 61 6c 65 6e  is not equivalen
0300: 74 2c 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 69  t, an error.** i
0310: 73 20 70 72 69 6e 74 65 64 20 61 6e 64 20 74 68  s printed and th
0320: 65 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  e program return
0330: 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 0a  s non-zero..*/..
0340: 2f 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 20 53  /* Include the S
0350: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0360: 6f 6e 2c 20 61 66 74 65 72 20 6d 61 6b 69 6e 67  on, after making
0370: 20 61 70 70 72 6f 70 72 69 61 74 65 20 23 64 65   appropriate #de
0380: 66 69 6e 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  fines..*/.#defin
0390: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  e SQLITE_THREADS
03a0: 41 46 45 20 30 0a 23 64 65 66 69 6e 65 20 53 51  AFE 0.#define SQ
03b0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
03c0: 58 54 45 4e 53 49 4f 4e 20 31 0a 23 64 65 66 69  XTENSION 1.#defi
03d0: 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
03e0: 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 31 0a 23  _DESERIALIZE 1.#
03f0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0400: 2e 63 22 0a 0a 2f 2a 20 43 6f 6e 74 65 6e 74 20  .c"../* Content 
0410: 6f 66 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79  of the read-only
0420: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20 2a   test database *
0430: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 70 74 66  /.#include "optf
0440: 75 7a 7a 2d 64 62 30 31 2e 63 22 0a 0a 2f 2a 0a  uzz-db01.c"../*.
0450: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73 69 6e  ** Prepare a sin
0460: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0470: 74 2e 20 20 50 61 6e 69 63 20 69 66 20 61 6e 79  t.  Panic if any
0480: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
0490: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
04a0: 65 33 5f 73 74 6d 74 20 2a 70 72 65 70 61 72 65  e3_stmt *prepare
04b0: 5f 73 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  _sql(sqlite3 *db
04c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
04d0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
04e0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
04f0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
0500: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
0510: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a 20    va_list ap;.. 
0520: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
0530: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
0540: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
0550: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
0560: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0570: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
0580: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
0590: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
05a0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
05b0: 20 20 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a    printf("Error:
05c0: 20 25 73 5c 6e 53 51 4c 3a 20 25 73 5c 6e 22 2c   %s\nSQL: %s\n",
05d0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
05e0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
05f0: 7a 53 71 6c 29 3b 0a 20 20 20 20 65 78 69 74 28  zSql);.    exit(
0600: 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
0610: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
0620: 72 65 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a  return pStmt;.}.
0630: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 53 51 4c 2e 20  ./*.** Run SQL. 
0640: 20 50 61 6e 69 63 20 69 66 20 61 6e 79 74 68 69   Panic if anythi
0650: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 0a 2a 2f  ng goes wrong.*/
0660: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 75 6e  .static void run
0670: 5f 73 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  _sql(sqlite3 *db
0680: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
0690: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
06a0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
06b0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
06c0: 72 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74  r = 0;.  va_list
06d0: 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74   ap;..  va_start
06e0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
06f0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
0700: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
0710: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
0720: 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ap);.  rc = sqli
0730: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
0740: 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
0750: 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72  .  if( rc || zEr
0760: 72 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  r ){.    printf(
0770: 22 45 72 72 6f 72 3a 20 25 73 5c 6e 73 71 6c 69  "Error: %s\nsqli
0780: 74 65 33 5f 65 72 72 6d 73 67 3a 20 25 73 5c 6e  te3_errmsg: %s\n
0790: 53 51 4c 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  SQL: %s\n",.    
07a0: 20 20 20 20 20 20 20 7a 45 72 72 2c 20 73 71 6c         zErr, sql
07b0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
07c0: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 65 78 69 74   zSql);.    exit
07d0: 28 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (1);.  }.  sqlit
07e0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 7d  e3_free(zSql);.}
07f0: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 6f 6e 65 20  ../*.** Run one 
0800: 6f 72 20 6d 6f 72 65 20 53 51 4c 20 73 74 61 74  or more SQL stat
0810: 65 6d 65 6e 74 73 20 63 6f 6e 74 61 69 6e 65 64  ements contained
0820: 20 69 6e 20 7a 53 71 6c 20 61 67 61 69 6e 73 74   in zSql against
0830: 20 64 61 74 61 62 61 73 65 20 64 62 52 75 6e 2e   database dbRun.
0840: 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e  .** Store the in
0850: 70 75 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  put in database 
0860: 64 62 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  dbOut..*/.static
0870: 20 69 6e 74 20 6f 70 74 66 75 7a 7a 5f 65 78 65   int optfuzz_exe
0880: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
0890: 52 75 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Run,            
08a0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
08b0: 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 53 51   on which the SQ
08c0: 4c 20 65 78 65 63 75 74 65 73 20 2a 2f 0a 20 20  L executes */.  
08d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
08e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
08f0: 68 65 20 53 51 4c 20 74 6f 20 62 65 20 65 78 65  he SQL to be exe
0900: 63 75 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  cuted */.  sqlit
0910: 65 33 20 2a 64 62 4f 75 74 2c 20 20 20 20 20 20  e3 *dbOut,      
0920: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
0930: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
0940: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
0950: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 54 61  nst char *zOutTa
0960: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  b,        /* Sto
0970: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  re results in th
0980: 69 73 20 74 61 62 6c 65 20 6f 66 20 64 62 4f 75  is table of dbOu
0990: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 74  t */.  int *pnSt
09a0: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
09b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
09c0: 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  number of statem
09d0: 65 6e 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ents here */.  i
09e0: 6e 74 20 2a 70 6e 52 6f 77 2c 20 20 20 20 20 20  nt *pnRow,      
09f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
0a00: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
0a10: 66 20 72 6f 77 73 20 68 65 72 65 20 2a 2f 0a 20  f rows here */. 
0a20: 20 69 6e 74 20 62 54 72 61 63 65 20 20 20 20 20   int bTrace     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a40: 50 72 69 6e 74 20 71 75 65 72 79 20 72 65 73 75  Print query resu
0a50: 6c 74 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  lts if true */.)
0a60: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0a70: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
0a80: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
0a90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0aa0: 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20  zLeftover;      
0ab0: 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
0ac0: 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20  cessed SQL */.  
0ad0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0ae0: 74 6d 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54  tmt = 0;    /* T
0af0: 68 65 20 63 75 72 72 65 6e 74 20 53 51 4c 20 73  he current SQL s
0b00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  tatement */.  sq
0b10: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
0b20: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 74 61   = 0;     /* Sta
0b30: 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
0b40: 20 69 6e 74 6f 20 64 62 4f 75 74 20 2a 2f 0a 20   into dbOut */. 
0b50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0b60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
0b70: 53 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 76 61  Single column va
0b80: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  lue */.  int nCo
0b90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0bb0: 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
0bc0: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65   */.  char zLine
0bd0: 5b 34 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20  [4000];         
0be0: 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 72 6f    /* Complete ro
0bf0: 77 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 72 75  w value */..  ru
0c00: 6e 5f 73 71 6c 28 64 62 4f 75 74 2c 20 22 42 45  n_sql(dbOut, "BE
0c10: 47 49 4e 22 29 3b 0a 20 20 72 75 6e 5f 73 71 6c  GIN");.  run_sql
0c20: 28 64 62 4f 75 74 2c 20 22 43 52 45 41 54 45 20  (dbOut, "CREATE 
0c30: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
0c40: 53 54 53 20 73 74 61 67 69 6e 67 28 78 20 54 45  STS staging(x TE
0c50: 58 54 29 22 29 3b 0a 20 20 72 75 6e 5f 73 71 6c  XT)");.  run_sql
0c60: 28 64 62 4f 75 74 2c 20 22 43 52 45 41 54 45 20  (dbOut, "CREATE 
0c70: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
0c80: 53 54 53 20 5c 22 25 77 5c 22 28 78 20 54 45 58  STS \"%w\"(x TEX
0c90: 54 29 22 2c 20 7a 4f 75 74 54 61 62 29 3b 0a 20  T)", zOutTab);. 
0ca0: 20 70 49 6e 73 20 3d 20 70 72 65 70 61 72 65 5f   pIns = prepare_
0cb0: 73 71 6c 28 64 62 4f 75 74 2c 20 22 49 4e 53 45  sql(dbOut, "INSE
0cc0: 52 54 20 49 4e 54 4f 20 73 74 61 67 69 6e 67 28  RT INTO staging(
0cd0: 78 29 20 56 41 4c 55 45 53 28 3f 31 29 22 29 3b  x) VALUES(?1)");
0ce0: 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 2a 70 6e 53  .  *pnRow = *pnS
0cf0: 74 6d 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  tmt = 0;.  while
0d00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
0d10: 26 26 20 7a 53 71 6c 20 26 26 20 7a 53 71 6c 5b  && zSql && zSql[
0d20: 30 5d 20 29 7b 0a 20 20 20 20 7a 4c 65 66 74 6f  0] ){.    zLefto
0d30: 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ver = 0;.    rc 
0d40: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
0d50: 65 5f 76 32 28 64 62 52 75 6e 2c 20 7a 53 71 6c  e_v2(dbRun, zSql
0d60: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
0d70: 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 7a  Leftover);.    z
0d80: 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
0d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
0da0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
0db0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
0dc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0dd0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
0de0: 22 45 72 72 6f 72 20 77 69 74 68 20 5b 25 73 5d  "Error with [%s]
0df0: 5c 6e 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73  \n%s\n", zSql, s
0e00: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
0e10: 52 75 6e 29 29 3b 0a 20 20 20 20 20 20 62 72 65  Run));.      bre
0e20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
0e30: 28 20 21 70 53 74 6d 74 20 29 20 63 6f 6e 74 69  ( !pStmt ) conti
0e40: 6e 75 65 3b 0a 20 20 20 20 28 2a 70 6e 53 74 6d  nue;.    (*pnStm
0e50: 74 29 2b 2b 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  t)++;.    nCol =
0e60: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
0e70: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
0e80: 20 20 72 75 6e 5f 73 71 6c 28 64 62 4f 75 74 2c    run_sql(dbOut,
0e90: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74   "DELETE FROM st
0ea0: 61 67 69 6e 67 3b 22 29 3b 0a 20 20 20 20 77 68  aging;");.    wh
0eb0: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
0ec0: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
0ed0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e  _ROW ){.      in
0ee0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
0ef0: 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 43 6f 6c 20  r(i=j=0; i<nCol 
0f00: 26 26 20 6a 3c 73 69 7a 65 6f 66 28 7a 4c 69 6e  && j<sizeof(zLin
0f10: 65 29 2d 35 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  e)-50; i++){.   
0f20: 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d       int eType =
0f30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
0f40: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  type(pStmt, i);.
0f50: 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
0f60: 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
0f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
0f80: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20   = "NULL";.     
0f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0fa0: 20 20 20 20 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73      zCol = (cons
0fb0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
0fc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
0fd0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, i);.        }
0fe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 20 29  .        if( i )
0ff0: 20 7a 4c 69 6e 65 5b 6a 2b 2b 5d 20 3d 20 27 2c   zLine[j++] = ',
1000: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ';.        if( e
1010: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
1020: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  T ){.          s
1030: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1040: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 6a 2c  sizeof(zLine)-j,
1050: 20 7a 4c 69 6e 65 2b 6a 2c 20 22 27 25 71 27 22   zLine+j, "'%q'"
1060: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
1070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1080: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1090: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
10a0: 2d 6a 2c 20 7a 4c 69 6e 65 2b 6a 2c 20 22 25 73  -j, zLine+j, "%s
10b0: 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", zCol);.      
10c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 20 2b 3d    }.        j +=
10d0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69   (int)strlen(zLi
10e0: 6e 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ne+j);.      }. 
10f0: 20 20 20 20 20 2f 2a 20 44 65 74 65 63 74 20 69       /* Detect i
1100: 66 20 61 6e 79 20 72 6f 77 20 69 73 20 74 6f 6f  f any row is too
1110: 20 6c 61 72 67 65 20 61 6e 64 20 74 68 72 6f 77   large and throw
1120: 20 61 6e 20 65 72 72 6f 72 2c 20 62 65 63 61 75   an error, becau
1130: 73 65 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 20  se we will.     
1140: 20 2a 2a 20 77 61 6e 74 20 74 6f 20 67 6f 20 62   ** want to go b
1150: 61 63 6b 20 61 6e 64 20 6c 6f 6f 6b 20 6d 6f 72  ack and look mor
1160: 65 20 63 6c 6f 73 65 6c 79 20 61 74 20 74 68 61  e closely at tha
1170: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
1180: 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 7a 4c  if( j>=sizeof(zL
1190: 69 6e 65 29 2d 31 30 30 20 29 7b 0a 20 20 20 20  ine)-100 ){.    
11a0: 20 20 20 20 70 72 69 6e 74 66 28 22 45 78 63 65      printf("Exce
11b0: 73 73 69 76 65 6c 79 20 6c 6f 6e 67 20 6f 75 74  ssively long out
11c0: 70 75 74 20 6c 69 6e 65 3a 20 25 64 20 62 79 74  put line: %d byt
11d0: 65 73 5c 6e 22 20 2c 6a 29 3b 0a 20 20 20 20 20  es\n" ,j);.     
11e0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
11f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 54    }.      if( bT
1200: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
1210: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a  printf("%s\n", z
1220: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Line);.      }. 
1230: 20 20 20 20 20 28 2a 70 6e 52 6f 77 29 2b 2b 3b       (*pnRow)++;
1240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
1250: 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 2c 20 31  ind_text(pIns, 1
1260: 2c 20 7a 4c 69 6e 65 2c 20 6a 2c 20 53 51 4c 49  , zLine, j, SQLI
1270: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1280: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1290: 33 5f 73 74 65 70 28 70 49 6e 73 29 3b 0a 20 20  3_step(pIns);.  
12a0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
12b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12d0: 33 5f 72 65 73 65 74 28 70 49 6e 73 29 3b 0a 20  3_reset(pIns);. 
12e0: 20 20 20 7d 0a 20 20 20 20 72 75 6e 5f 73 71 6c     }.    run_sql
12f0: 28 64 62 4f 75 74 2c 0a 20 20 20 20 20 20 22 49  (dbOut,.      "I
1300: 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
1310: 22 28 78 29 20 56 41 4c 55 45 53 28 27 23 23 23  "(x) VALUES('###
1320: 20 25 71 20 23 23 23 27 29 22 2c 0a 20 20 20 20   %q ###')",.    
1330: 20 20 7a 4f 75 74 54 61 62 2c 20 73 71 6c 69 74    zOutTab, sqlit
1340: 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 0a 20 20  e3_sql(pStmt).  
1350: 20 20 29 3b 0a 20 20 20 20 72 75 6e 5f 73 71 6c    );.    run_sql
1360: 28 64 62 4f 75 74 2c 20 0a 20 20 20 20 20 20 22  (dbOut, .      "
1370: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77  INSERT INTO \"%w
1380: 5c 22 28 78 29 20 53 45 4c 45 43 54 20 67 72 6f  \"(x) SELECT gro
1390: 75 70 5f 63 6f 6e 63 61 74 28 78 2c 63 68 61 72  up_concat(x,char
13a0: 28 31 30 29 29 22 0a 20 20 20 20 20 20 22 20 20  (10))".      "  
13b0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
13c0: 52 4f 4d 20 73 74 61 67 69 6e 67 20 4f 52 44 45  ROM staging ORDE
13d0: 52 20 42 59 20 78 29 22 2c 0a 20 20 20 20 20 20  R BY x)",.      
13e0: 7a 4f 75 74 54 61 62 0a 20 20 20 20 29 3b 0a 20  zOutTab.    );. 
13f0: 20 20 20 72 75 6e 5f 73 71 6c 28 64 62 4f 75 74     run_sql(dbOut
1400: 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 20  , "COMMIT");.   
1410: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1420: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
1430: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tmt = 0;.  }.  s
1440: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1450: 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
1460: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 29  3_finalize(pIns)
1470: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1480: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1490: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65   content of file
14a0: 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f   zName into memo
14b0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
14c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
14d0: 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  4().** and retur
14e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14f0: 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63  he buffer. The c
1500: 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1510: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
1520: 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a  .** the memory..
1530: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1540: 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74  er pnByte is not
1550: 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29   NULL, (*pnByte)
1560: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1570: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
1580: 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  * read..**.** Fo
1590: 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61  r convenience, a
15a0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
15b0: 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61  byte is always a
15c0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
15d0: 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d  ata read.** from
15e0: 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
15f0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72   the buffer is r
1600: 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79  eturned. This by
1610: 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
1620: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e  ed in.** the fin
1630: 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e  al value of (*pn
1640: 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63  Byte), if applic
1650: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c  able..**.** NULL
1660: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1670: 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
1680: 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69  ountered. The fi
1690: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e  nal value of *pn
16a0: 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66  Byte.** is undef
16b0: 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
16c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
16d0: 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73  r *readFile(cons
16e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
16f0: 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46  nt *pnByte){.  F
1700: 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
1710: 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
1720: 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65  long nIn;.  size
1730: 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72  _t nRead;.  char
1740: 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e   *pBuf;.  if( in
1750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1760: 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
1770: 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20  EEK_END);.  nIn 
1780: 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
1790: 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75  ewind(in);.  pBu
17a0: 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
17b0: 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20  oc64( nIn+1 );. 
17c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20 72   if( pBuf==0 ) r
17d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64  eturn 0;.  nRead
17e0: 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e   = fread(pBuf, n
17f0: 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63  In, 1, in);.  fc
1800: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20  lose(in);.  if( 
1810: 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20  nRead!=1 ){.    
1820: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
1830: 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  f);.    return 0
1840: 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e  ;.  }.  pBuf[nIn
1850: 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42  ] = 0;.  if( pnB
1860: 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20  yte ) *pnByte = 
1870: 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  nIn;.  return pB
1880: 75 66 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28  uf;.}..int main(
1890: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
18a0: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 6e 49  *argv){.  int nI
18b0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
18c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18d0: 66 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a 2f  f input files */
18e0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 49 6e 20 3d  .  char **azIn =
18f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1900: 20 4e 61 6d 65 73 20 6f 66 20 69 6e 70 75 74 20   Names of input 
1910: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
1920: 65 33 20 2a 64 62 4f 75 74 20 3d 20 30 3b 20 20  e3 *dbOut = 0;  
1930: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1940: 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74  e to hold result
1950: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1960: 64 62 52 75 6e 20 3d 20 30 3b 20 20 20 20 20 20  dbRun = 0;      
1970: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 75 73    /* Database us
1980: 65 64 20 66 6f 72 20 74 65 73 74 73 20 2a 2f 0a  ed for tests */.
1990: 20 20 69 6e 74 20 62 54 72 61 63 65 20 3d 20 30    int bTrace = 0
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19b0: 53 68 6f 77 20 71 75 65 72 79 20 72 65 73 75 6c  Show query resul
19c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 53 68 6f  ts */.  int bSho
19d0: 77 56 61 6c 69 64 20 3d 20 30 3b 20 20 20 20 20  wValid = 0;     
19e0: 20 20 20 2f 2a 20 4a 75 73 74 20 6c 69 73 74 20     /* Just list 
19f0: 69 6e 70 75 74 73 20 74 68 61 74 20 61 72 65 20  inputs that are 
1a00: 76 61 6c 69 64 20 53 51 4c 20 2a 2f 0a 20 20 69  valid SQL */.  i
1a10: 6e 74 20 6e 52 6f 77 2c 20 6e 53 74 6d 74 3b 20  nt nRow, nStmt; 
1a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a30: 62 65 72 20 6f 66 20 72 6f 77 73 20 61 6e 64 20  ber of rows and 
1a40: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
1a50: 69 6e 74 20 69 2c 20 72 63 3b 0a 0a 20 20 66 6f  int i, rc;..  fo
1a60: 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
1a70: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1a80: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
1a90: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
1aa0: 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
1ab0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
1ac0: 73 74 72 63 6d 70 28 7a 2c 22 2d 68 65 6c 70 22  strcmp(z,"-help"
1ad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
1ae0: 69 6e 74 66 28 22 55 73 61 67 65 3a 20 25 73 20  intf("Usage: %s 
1af0: 5b 4f 50 54 49 4f 4e 53 5d 20 46 49 4c 45 4e 41  [OPTIONS] FILENA
1b00: 4d 45 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76 5b  ME ...\n", argv[
1b10: 30 5d 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  0]);.      print
1b20: 66 28 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b  f("Options:\n");
1b30: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
1b40: 20 2d 2d 68 65 6c 70 20 20 20 20 20 20 20 20 20   --help         
1b50: 20 20 20 20 20 20 53 68 6f 77 20 68 69 73 20 6d        Show his m
1b60: 65 73 73 61 67 65 5c 6e 22 29 3b 0a 20 20 20 20  essage\n");.    
1b70: 20 20 70 72 69 6e 74 66 28 22 20 20 2d 2d 6f 75    printf("  --ou
1b80: 74 70 75 74 2d 74 72 61 63 65 20 20 20 20 20 20  tput-trace      
1b90: 20 53 68 6f 77 20 65 61 63 68 20 6c 69 6e 65 20   Show each line 
1ba0: 6f 66 20 53 51 4c 20 6f 75 74 70 75 74 5c 6e 22  of SQL output\n"
1bb0: 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
1bc0: 22 20 20 2d 2d 76 61 6c 69 64 2d 73 71 6c 20 20  "  --valid-sql  
1bd0: 20 20 20 20 20 20 20 20 4c 69 73 74 20 46 49 4c          List FIL
1be0: 45 73 20 74 68 61 74 20 61 72 65 20 76 61 6c 69  Es that are vali
1bf0: 64 20 53 51 4c 5c 6e 22 29 3b 0a 20 20 20 20 20  d SQL\n");.     
1c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1c10: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 74  .    else if( st
1c20: 72 63 6d 70 28 7a 2c 22 2d 6f 75 74 70 75 74 2d  rcmp(z,"-output-
1c30: 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
1c40: 20 20 20 20 62 54 72 61 63 65 20 3d 20 31 3b 0a      bTrace = 1;.
1c50: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
1c60: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 61  f( strcmp(z,"-va
1c70: 6c 69 64 2d 73 71 6c 22 29 3d 3d 30 20 29 7b 0a  lid-sql")==0 ){.
1c80: 20 20 20 20 20 20 62 53 68 6f 77 56 61 6c 69 64        bShowValid
1c90: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1ca0: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
1cb0: 2d 27 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  -' ){.      prin
1cc0: 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  tf("unknown opti
1cd0: 6f 6e 20 5c 22 25 73 5c 22 2e 20 20 55 73 65 20  on \"%s\".  Use 
1ce0: 2d 2d 68 65 6c 70 20 66 6f 72 20 64 65 74 61 69  --help for detai
1cf0: 6c 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b  ls\n", argv[i]);
1d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1d10: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
1d20: 7b 0a 20 20 20 20 20 20 6e 49 6e 2b 2b 3b 0a 20  {.      nIn++;. 
1d30: 20 20 20 20 20 61 7a 49 6e 20 3d 20 72 65 61 6c       azIn = real
1d40: 6c 6f 63 28 61 7a 49 6e 2c 20 73 69 7a 65 6f 66  loc(azIn, sizeof
1d50: 28 61 7a 49 6e 5b 30 5d 29 2a 6e 49 6e 29 3b 0a  (azIn[0])*nIn);.
1d60: 20 20 20 20 20 20 69 66 28 20 61 7a 49 6e 3d 3d        if( azIn==
1d70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
1d80: 6e 74 66 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ntf("out of memo
1d90: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
1da0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d  exit(1);.      }
1db0: 0a 20 20 20 20 20 20 61 7a 49 6e 5b 6e 49 6e 2d  .      azIn[nIn-
1dc0: 31 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  1] = argv[i];.  
1dd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
1de0: 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
1df0: 3a 22 2c 20 26 64 62 4f 75 74 29 3b 0a 20 20 73  :", &dbOut);.  s
1e00: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
1e10: 6d 6f 72 79 3a 22 2c 20 26 64 62 52 75 6e 29 3b  mory:", &dbRun);
1e20: 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72  .  sqlite3_deser
1e30: 69 61 6c 69 7a 65 28 64 62 52 75 6e 2c 20 22 6d  ialize(dbRun, "m
1e40: 61 69 6e 22 2c 20 64 61 74 61 30 30 31 2c 20 73  ain", data001, s
1e50: 69 7a 65 6f 66 28 64 61 74 61 30 30 31 29 2c 0a  izeof(data001),.
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 61 74        sizeof(dat
1e80: 61 30 30 31 29 2c 20 53 51 4c 49 54 45 5f 44 45  a001), SQLITE_DE
1e90: 53 45 52 49 41 4c 49 5a 45 5f 52 45 41 44 4f 4e  SERIALIZE_READON
1ea0: 4c 59 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  LY);.  for(i=0; 
1eb0: 69 3c 6e 49 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nIn; i++){.   
1ec0: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 72 65   char *zSql = re
1ed0: 61 64 46 69 6c 65 28 61 7a 49 6e 5b 69 5d 2c 20  adFile(azIn[i], 
1ee0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1ef0: 73 74 6d 74 20 2a 70 43 6b 3b 0a 20 20 20 20 73  stmt *pCk;.    s
1f00: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 52 75  qlite3_exec(dbRu
1f10: 6e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  n, "ROLLBACK", 0
1f20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1f30: 20 62 53 68 6f 77 56 61 6c 69 64 20 29 7b 0a 20   bShowValid ){. 
1f40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f50: 33 5f 65 78 65 63 28 64 62 52 75 6e 2c 20 7a 53  3_exec(dbRun, zS
1f60: 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
1f70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f80: 54 45 5f 4f 4b 20 29 20 70 72 69 6e 74 66 28 22  TE_OK ) printf("
1f90: 25 73 5c 6e 22 2c 20 61 7a 49 6e 5b 69 5d 29 3b  %s\n", azIn[i]);
1fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1fb0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
1fc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
1fe0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1ff0: 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
2000: 5a 41 54 49 4f 4e 53 2c 20 64 62 52 75 6e 2c 20  ZATIONS, dbRun, 
2010: 30 29 3b 0a 20 20 20 20 69 66 28 20 62 54 72 61  0);.    if( bTra
2020: 63 65 20 29 20 70 72 69 6e 74 66 28 22 25 73 3a  ce ) printf("%s:
2030: 20 4f 70 74 69 6d 69 7a 65 64 5c 6e 22 2c 20 61   Optimized\n", a
2040: 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 72 63 20  zIn[i]);.    rc 
2050: 3d 20 6f 70 74 66 75 7a 7a 5f 65 78 65 63 28 64  = optfuzz_exec(d
2060: 62 52 75 6e 2c 20 7a 53 71 6c 2c 20 64 62 4f 75  bRun, zSql, dbOu
2070: 74 2c 20 22 6f 70 74 22 2c 20 26 6e 53 74 6d 74  t, "opt", &nStmt
2080: 2c 20 26 6e 52 6f 77 2c 20 62 54 72 61 63 65 29  , &nRow, bTrace)
2090: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
20a0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
20b0: 3a 20 6f 70 74 69 6d 69 7a 65 64 20 72 75 6e 20  : optimized run 
20c0: 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 0a 20  failed: %s\n",. 
20d0: 20 20 20 20 20 20 20 20 20 20 20 61 7a 49 6e 5b             azIn[
20e0: 69 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  i], sqlite3_errm
20f0: 73 67 28 64 62 52 75 6e 29 29 3b 0a 20 20 20 20  sg(dbRun));.    
2100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2110: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2120: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2130: 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
2140: 20 64 62 52 75 6e 2c 20 30 78 66 66 66 66 29 3b   dbRun, 0xffff);
2150: 0a 20 20 20 20 20 20 69 66 28 20 62 54 72 61 63  .      if( bTrac
2160: 65 20 29 20 70 72 69 6e 74 66 28 22 25 73 3a 20  e ) printf("%s: 
2170: 4e 6f 6e 2d 6f 70 74 69 6d 69 7a 65 64 5c 6e 22  Non-optimized\n"
2180: 2c 20 61 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20  , azIn[i]);.    
2190: 20 20 72 63 20 3d 20 6f 70 74 66 75 7a 7a 5f 65    rc = optfuzz_e
21a0: 78 65 63 28 64 62 52 75 6e 2c 20 7a 53 71 6c 2c  xec(dbRun, zSql,
21b0: 20 64 62 4f 75 74 2c 20 22 6e 6f 6f 70 74 22 2c   dbOut, "noopt",
21c0: 20 26 6e 53 74 6d 74 2c 20 26 6e 52 6f 77 2c 20   &nStmt, &nRow, 
21d0: 62 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 69  bTrace);.      i
21e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
21f0: 20 70 72 69 6e 74 66 28 22 25 73 3a 20 6e 6f 6e   printf("%s: non
2200: 2d 6f 70 74 69 6d 69 7a 65 64 20 72 75 6e 20 66  -optimized run f
2210: 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 0a 20 20  ailed: %s\n",.  
2220: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 49 6e              azIn
2230: 5b 69 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  [i], sqlite3_err
2240: 6d 73 67 28 64 62 52 75 6e 29 29 3b 0a 20 20 20  msg(dbRun));.   
2250: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
2260: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 6b 20      }.      pCk 
2270: 3d 20 70 72 65 70 61 72 65 5f 73 71 6c 28 64 62  = prepare_sql(db
2280: 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
2290: 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20  "SELECT (SELECT 
22a0: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 78 2c 63  group_concat(x,c
22b0: 68 61 72 28 31 30 29 29 20 46 52 4f 4d 20 6f 70  har(10)) FROM op
22c0: 74 29 3d 3d 22 0a 20 20 20 20 20 20 20 20 20 20  t)==".          
22d0: 20 22 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   "       (SELECT
22e0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 78 2c   group_concat(x,
22f0: 63 68 61 72 28 31 30 29 29 20 46 52 4f 4d 20 6e  char(10)) FROM n
2300: 6f 6f 70 74 29 22 29 3b 0a 20 20 20 20 20 20 72  oopt)");.      r
2310: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
2320: 28 70 43 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  (pCk);.      if(
2330: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
2340: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
2350: 66 28 22 25 73 3a 20 63 6f 6d 70 61 72 69 73 6f  f("%s: compariso
2360: 6e 20 66 61 69 6c 65 64 5c 6e 22 2c 20 73 71 6c  n failed\n", sql
2370: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 4f 75  ite3_errmsg(dbOu
2380: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  t));.        exi
2390: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
23a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
23b0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 6b 2c  _column_int(pCk,
23c0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
23d0: 72 69 6e 74 66 28 22 25 73 3a 20 6f 70 74 2f 6e  rintf("%s: opt/n
23e0: 6f 2d 6f 70 74 20 6f 75 74 70 75 74 73 20 64 69  o-opt outputs di
23f0: 66 66 65 72 5c 6e 22 2c 20 61 7a 49 6e 5b 69 5d  ffer\n", azIn[i]
2400: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6b 20 3d  );.        pCk =
2410: 20 70 72 65 70 61 72 65 5f 73 71 6c 28 64 62 4f   prepare_sql(dbO
2420: 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  ut,.           "
2430: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
2440: 63 61 74 28 78 2c 63 68 61 72 28 31 30 29 29 20  cat(x,char(10)) 
2450: 46 52 4f 4d 20 6f 70 74 20 22 0a 20 20 20 20 20  FROM opt ".     
2460: 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c        "UNION ALL
2470: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 53   ".           "S
2480: 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
2490: 61 74 28 78 2c 63 68 61 72 28 31 30 29 29 20 46  at(x,char(10)) F
24a0: 52 4f 4d 20 6e 6f 6f 70 74 22 29 3b 0a 20 20 20  ROM noopt");.   
24b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
24c0: 70 28 70 43 6b 29 3b 0a 20 20 20 20 20 20 20 20  p(pCk);.        
24d0: 70 72 69 6e 74 66 28 22 6f 70 74 3a 5c 6e 25 73  printf("opt:\n%s
24e0: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
24f0: 75 6d 6e 5f 74 65 78 74 28 70 43 6b 2c 30 29 29  umn_text(pCk,0))
2500: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2510: 33 5f 73 74 65 70 28 70 43 6b 29 3b 0a 20 20 20  3_step(pCk);.   
2520: 20 20 20 20 20 70 72 69 6e 74 66 28 22 6e 6f 6f       printf("noo
2530: 70 74 3a 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69  pt:\n%s\n", sqli
2540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2550: 70 43 6b 2c 30 29 29 3b 0a 20 20 20 20 20 20 20  pCk,0));.       
2560: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
2570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2580: 72 69 6e 74 66 28 22 25 73 3a 20 25 64 20 73 74  rintf("%s: %d st
2590: 6d 74 73 20 25 64 20 72 6f 77 73 20 6f 6b 5c 6e  mts %d rows ok\n
25a0: 22 2c 20 61 7a 49 6e 5b 69 5d 2c 20 6e 53 74 6d  ", azIn[i], nStm
25b0: 74 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  t, nRow);.      
25c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
25d0: 66 69 6e 61 6c 69 7a 65 28 70 43 6b 29 3b 0a 20  finalize(pCk);. 
25e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25f0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
2600: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
2610: 28 64 62 52 75 6e 29 3b 0a 20 20 73 71 6c 69 74  (dbRun);.  sqlit
2620: 65 33 5f 63 6c 6f 73 65 28 64 62 4f 75 74 29 3b  e3_close(dbOut);
2630: 20 20 20 20 0a 20 20 66 72 65 65 28 61 7a 49 6e      .  free(azIn
2640: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2650: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 29  _memory_used() )
2660: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 4d 65  {.    printf("Me
2670: 6d 6f 72 79 20 6c 65 61 6b 20 6f 66 20 25 6c 6c  mory leak of %ll
2680: 64 20 62 79 74 65 73 5c 6e 22 2c 20 73 71 6c 69  d bytes\n", sqli
2690: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
26a0: 29 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ));.    exit(1);
26b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
26c0: 0a 7d 0a                                         .}.