/ Hex Artifact Content
Login

Artifact b5f8c4d1af09e98592331d8598d58d7088bdad085703a37cf6b3a12f3b1a3ae8:


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 20 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 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
09a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
09b0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
09c0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
09d0: 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b  char *zLeftover;
09e0: 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
09f0: 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
0a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
0a10: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
0a20: 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
0a30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0a40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
0a50: 20 2a 70 49 6e 73 20 3d 20 30 3b 20 20 20 20 20   *pIns = 0;     
0a60: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20  /* Statement to 
0a70: 69 6e 73 65 72 74 20 69 6e 74 6f 20 64 62 4f 75  insert into dbOu
0a80: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
0a90: 72 20 2a 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20  r *zCol;        
0aa0: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 63 6f 6c     /* Single col
0ab0: 75 6d 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  umn value */.  i
0ac0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0ae0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
0af0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72  olumns */.  char
0b00: 20 7a 4c 69 6e 65 5b 34 30 30 30 5d 3b 20 20 20   zLine[4000];   
0b10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
0b20: 65 74 65 20 72 6f 77 20 76 61 6c 75 65 20 2a 2f  ete row value */
0b30: 0a 0a 20 20 72 75 6e 5f 73 71 6c 28 64 62 4f 75  ..  run_sql(dbOu
0b40: 74 2c 20 22 42 45 47 49 4e 22 29 3b 0a 20 20 72  t, "BEGIN");.  r
0b50: 75 6e 5f 73 71 6c 28 64 62 4f 75 74 2c 20 22 43  un_sql(dbOut, "C
0b60: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
0b70: 4f 54 20 45 58 49 53 54 53 20 73 74 61 67 69 6e  OT EXISTS stagin
0b80: 67 28 78 20 54 45 58 54 29 3b 22 29 3b 0a 20 20  g(x TEXT);");.  
0b90: 72 75 6e 5f 73 71 6c 28 64 62 4f 75 74 2c 20 22  run_sql(dbOut, "
0ba0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
0bb0: 4e 4f 54 20 45 58 49 53 54 53 20 5c 22 77 5c 22  NOT EXISTS \"w\"
0bc0: 28 78 20 54 45 58 54 29 3b 22 2c 20 7a 4f 75 74  (x TEXT);", zOut
0bd0: 54 61 62 29 3b 0a 20 20 70 49 6e 73 20 3d 20 70  Tab);.  pIns = p
0be0: 72 65 70 61 72 65 5f 73 71 6c 28 64 62 4f 75 74  repare_sql(dbOut
0bf0: 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73  , "INSERT INTO s
0c00: 74 61 67 69 6e 67 28 78 29 20 56 41 4c 55 45 53  taging(x) VALUES
0c10: 28 3f 31 29 22 29 3b 0a 20 20 77 68 69 6c 65 28  (?1)");.  while(
0c20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
0c30: 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20  & zSql[0] ){.   
0c40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
0c50: 65 70 61 72 65 5f 76 32 28 64 62 52 75 6e 2c 20  epare_v2(dbRun, 
0c60: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
0c70: 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20  , &zLeftover);. 
0c80: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
0c90: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
0ca0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
0cb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
0cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 21  break;.    if( !
0cd0: 70 53 74 6d 74 20 29 20 63 6f 6e 74 69 6e 75 65  pStmt ) continue
0ce0: 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c  ;.    nCol = sql
0cf0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
0d00: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 75  t(pStmt);.    ru
0d10: 6e 5f 73 71 6c 28 64 62 4f 75 74 2c 20 22 44 45  n_sql(dbOut, "DE
0d20: 4c 45 54 45 20 46 52 4f 4d 20 73 74 61 67 69 6e  LETE FROM stagin
0d30: 67 3b 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  g;");.    while(
0d40: 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
0d50: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 72 63 20 3d  i, j;.      rc =
0d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
0d70: 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tmt);.      for(
0d80: 69 3d 6a 3d 30 3b 20 69 3c 6e 43 6f 6c 20 26 26  i=j=0; i<nCol &&
0d90: 20 6a 3c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29   j<sizeof(zLine)
0da0: 2d 35 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -50; i++){.     
0db0: 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73     int eType = s
0dc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
0dd0: 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
0de0: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
0df0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
0e00: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
0e10: 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 20   "NULL";.       
0e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0e30: 20 20 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20    zCol = (const 
0e40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
0e50: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
0e60: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   i);.        }. 
0e70: 20 20 20 20 20 20 20 69 66 28 20 69 20 29 20 7a         if( i ) z
0e80: 4c 69 6e 65 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b  Line[j++] = ',';
0e90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
0ea0: 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
0eb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
0ec0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
0ed0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 6a 2c 20 7a  zeof(zLine)-j, z
0ee0: 4c 69 6e 65 2b 6a 2c 20 22 27 25 71 27 22 2c 20  Line+j, "'%q'", 
0ef0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zCol);.        }
0f00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
0f10: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0f20: 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 6a  (sizeof(zLine)-j
0f30: 2c 20 7a 4c 69 6e 65 2b 6a 2c 20 22 25 73 22 2c  , zLine+j, "%s",
0f40: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
0f50: 7d 0a 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 28  }.        j += (
0f60: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e 65  int)strlen(zLine
0f70: 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
0f80: 20 20 20 2f 2a 20 44 65 74 65 63 74 20 69 66 20     /* Detect if 
0f90: 61 6e 79 20 72 6f 77 20 69 73 20 74 6f 6f 20 6c  any row is too l
0fa0: 61 72 67 65 20 61 6e 64 20 74 68 72 6f 77 20 61  arge and throw a
0fb0: 6e 20 65 72 72 6f 72 2c 20 62 65 63 61 75 73 65  n error, because
0fc0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a   we will.      *
0fd0: 2a 20 77 61 6e 74 20 74 6f 20 67 6f 20 62 61 63  * want to go bac
0fe0: 6b 20 61 6e 64 20 6c 6f 6f 6b 20 6d 6f 72 65 20  k and look more 
0ff0: 63 6c 6f 73 65 6c 79 20 61 74 20 74 68 61 74 20  closely at that 
1000: 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  case */.      if
1010: 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 7a 4c 69 6e  ( j>=sizeof(zLin
1020: 65 29 2d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  e)-100 ){.      
1030: 20 20 70 72 69 6e 74 66 28 22 45 78 63 65 73 73    printf("Excess
1040: 69 76 65 6c 79 20 6c 6f 6e 67 20 6f 75 74 70 75  ively long outpu
1050: 74 20 6c 69 6e 65 3a 20 25 64 20 62 79 74 65 73  t line: %d bytes
1060: 5c 6e 22 20 2c 6a 29 3b 0a 20 20 20 20 20 20 20  \n" ,j);.       
1070: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1080: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
1090: 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 2c 20  bind_text(pIns, 
10a0: 31 2c 20 7a 4c 69 6e 65 2c 20 6a 2c 20 53 51 4c  1, zLine, j, SQL
10b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
10c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10d0: 65 33 5f 73 74 65 70 28 70 49 6e 73 29 3b 0a 20  e3_step(pIns);. 
10e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
10f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1110: 73 65 74 28 70 49 6e 73 29 3b 0a 20 20 20 20 7d  set(pIns);.    }
1120: 0a 20 20 20 20 72 75 6e 5f 73 71 6c 28 64 62 4f  .    run_sql(dbO
1130: 75 74 2c 0a 20 20 20 20 20 20 22 49 4e 53 45 52  ut,.      "INSER
1140: 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 28 78 29  T INTO \"%w\"(x)
1150: 20 56 41 4c 55 45 53 28 27 23 23 23 20 25 71 20   VALUES('### %q 
1160: 23 23 23 27 29 22 2c 0a 20 20 20 20 20 20 73 71  ###')",.      sq
1170: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
1180: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 75 6e 5f  .    );.    run_
1190: 73 71 6c 28 64 62 4f 75 74 2c 20 0a 20 20 20 20  sql(dbOut, .    
11a0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c    "INSERT INTO \
11b0: 22 25 77 5c 22 28 78 29 20 53 45 4c 45 43 54 20  "%w\"(x) SELECT 
11c0: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 78 2c 63  group_concat(x,c
11d0: 68 61 72 28 31 30 29 29 22 0a 20 20 20 20 20 20  har(10))".      
11e0: 22 20 20 46 52 4f 4d 20 73 74 61 67 69 6e 67 20  "  FROM staging 
11f0: 4f 52 44 45 52 20 42 59 20 78 22 2c 0a 20 20 20  ORDER BY x",.   
1200: 20 20 20 7a 4f 75 74 54 61 62 0a 20 20 20 20 29     zOutTab.    )
1210: 3b 0a 20 20 20 20 72 75 6e 5f 73 71 6c 28 64 62  ;.    run_sql(db
1220: 4f 75 74 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a  Out, "COMMIT");.
1230: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1240: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1250: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
1260: 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
1270: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1280: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1290: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
12a0: 69 7a 65 28 70 49 6e 73 29 3b 0a 20 20 72 65 74  ize(pIns);.  ret
12b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12c0: 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
12d0: 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
12e0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
12f0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1300: 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
1310: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1320: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1330: 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
1340: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1350: 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
1360: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
1370: 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
1380: 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1390: 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
13a0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
13b0: 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
13c0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
13d0: 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
13e0: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
13f0: 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
1400: 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
1410: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1420: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
1430: 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
1440: 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
1450: 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
1460: 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
1470: 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
1480: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
1490: 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
14a0: 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
14b0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
14c0: 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
14d0: 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
14e0: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
14f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
1500: 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1510: 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1520: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
1530: 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
1540: 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1550: 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
1560: 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
1570: 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
1580: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1590: 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
15a0: 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
15b0: 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
15c0: 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
15d0: 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
15e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
15f0: 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
1600: 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  uf==0 ) return 0
1610: 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  ;.  nRead = frea
1620: 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1630: 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1640: 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1650: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1660: 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1680: 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1690: 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
16a0: 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
16b0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
16c0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
16d0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
16e0: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 20  .  int nIn = 0; 
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1700: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1710: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
1720: 20 2a 2a 61 7a 49 6e 20 3d 20 30 3b 20 20 20 20   **azIn = 0;    
1730: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20         /* Names 
1740: 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a  of input files *
1750: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f  /.  sqlite3 *dbO
1760: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ut = 0;        /
1770: 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 68 6f  * Database to ho
1780: 6c 64 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ld results */.  
1790: 73 71 6c 69 74 65 33 20 2a 64 62 52 75 6e 20 3d  sqlite3 *dbRun =
17a0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61   0;        /* Da
17b0: 74 61 62 61 73 65 20 75 73 65 64 20 66 6f 72 20  tabase used for 
17c0: 74 65 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tests */.  int i
17d0: 2c 20 72 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  , rc;..  for(i=1
17e0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
17f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1800: 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  z = argv[i];.   
1810: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
1820: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
1830: 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  +;.    if( strcm
1840: 70 28 7a 2c 22 2d 68 65 6c 70 22 29 3d 3d 30 20  p(z,"-help")==0 
1850: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
1860: 22 55 73 61 67 65 3a 20 25 73 20 46 49 4c 45 4e  "Usage: %s FILEN
1870: 41 4d 45 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76  AME ...\n", argv
1880: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  [0]);.      retu
1890: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
18a0: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
18b0: 2d 27 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  -' ){.      prin
18c0: 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  tf("unknown opti
18d0: 6f 6e 20 5c 22 25 73 5c 22 2e 20 20 55 73 65 20  on \"%s\".  Use 
18e0: 2d 2d 68 65 6c 70 20 66 6f 72 20 64 65 74 61 69  --help for detai
18f0: 6c 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b  ls\n", argv[i]);
1900: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1910: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
1920: 7b 0a 20 20 20 20 20 20 6e 49 6e 2b 2b 3b 0a 20  {.      nIn++;. 
1930: 20 20 20 20 20 61 7a 49 6e 20 3d 20 72 65 61 6c       azIn = real
1940: 6c 6f 63 28 61 7a 49 6e 2c 20 73 69 7a 65 6f 66  loc(azIn, sizeof
1950: 28 61 7a 49 6e 5b 30 5d 29 2a 6e 49 6e 29 3b 0a  (azIn[0])*nIn);.
1960: 20 20 20 20 20 20 69 66 28 20 61 7a 49 6e 3d 3d        if( azIn==
1970: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
1980: 6e 74 66 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ntf("out of memo
1990: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
19a0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d  exit(1);.      }
19b0: 0a 20 20 20 20 20 20 61 7a 49 6e 5b 6e 49 6e 2d  .      azIn[nIn-
19c0: 31 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  1] = argv[i];.  
19d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
19e0: 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
19f0: 3a 22 2c 20 26 64 62 4f 75 74 29 3b 0a 20 20 73  :", &dbOut);.  s
1a00: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
1a10: 6d 6f 72 79 3a 22 2c 20 26 64 62 52 75 6e 29 3b  mory:", &dbRun);
1a20: 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72  .  sqlite3_deser
1a30: 69 61 6c 69 7a 65 28 64 62 52 75 6e 2c 20 22 6d  ialize(dbRun, "m
1a40: 61 69 6e 22 2c 20 64 61 74 61 30 30 31 2c 20 73  ain", data001, s
1a50: 69 7a 65 6f 66 28 64 61 74 61 30 30 31 29 2c 0a  izeof(data001),.
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 61 74        sizeof(dat
1a80: 61 30 30 31 29 2c 20 53 51 4c 49 54 45 5f 44 45  a001), SQLITE_DE
1a90: 53 45 52 49 41 4c 49 5a 45 5f 52 45 41 44 4f 4e  SERIALIZE_READON
1aa0: 4c 59 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  LY);.  for(i=0; 
1ab0: 69 3c 6e 49 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nIn; i++){.   
1ac0: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 72 65   char *zSql = re
1ad0: 61 64 46 69 6c 65 28 61 7a 49 6e 5b 69 5d 2c 20  adFile(azIn[i], 
1ae0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1af0: 73 74 6d 74 20 2a 70 43 6b 3b 0a 20 20 20 20 73  stmt *pCk;.    s
1b00: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1b10: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1b20: 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1b30: 53 2c 20 64 62 52 75 6e 2c 20 30 29 3b 0a 20 20  S, dbRun, 0);.  
1b40: 20 20 72 63 20 3d 20 6f 70 74 66 75 7a 7a 5f 65    rc = optfuzz_e
1b50: 78 65 63 28 64 62 52 75 6e 2c 20 7a 53 71 6c 2c  xec(dbRun, zSql,
1b60: 20 64 62 4f 75 74 2c 20 22 6f 70 74 22 29 3b 0a   dbOut, "opt");.
1b70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1b90: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ba0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1bb0: 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1bc0: 53 2c 20 64 62 52 75 6e 2c 20 30 78 66 66 66 66  S, dbRun, 0xffff
1bd0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 70  );.      rc = op
1be0: 74 66 75 7a 7a 5f 65 78 65 63 28 64 62 52 75 6e  tfuzz_exec(dbRun
1bf0: 2c 20 7a 53 71 6c 2c 20 64 62 4f 75 74 2c 20 22  , zSql, dbOut, "
1c00: 6e 6f 6f 70 74 22 29 3b 0a 20 20 20 20 20 20 69  noopt");.      i
1c10: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1c20: 20 70 72 69 6e 74 66 28 22 4e 6f 6e 2d 6f 70 74   printf("Non-opt
1c30: 69 6d 69 7a 65 64 20 72 75 6e 20 66 61 69 6c 65  imized run faile
1c40: 64 2e 20 20 45 72 72 6f 72 3a 20 25 73 5c 6e 22  d.  Error: %s\n"
1c50: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1c60: 28 64 62 52 75 6e 29 29 3b 0a 20 20 20 20 20 20  (dbRun));.      
1c70: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
1c80: 20 7d 0a 20 20 20 20 20 20 70 43 6b 20 3d 20 70   }.      pCk = p
1c90: 72 65 70 61 72 65 5f 73 71 6c 28 64 62 4f 75 74  repare_sql(dbOut
1ca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 53 45  ,.           "SE
1cb0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 67 72 6f  LECT (SELECT gro
1cc0: 75 70 5f 63 6f 6e 63 61 74 28 78 29 20 46 52 4f  up_concat(x) FRO
1cd0: 4d 20 6f 70 74 29 3d 3d 22 0a 20 20 20 20 20 20  M opt)==".      
1ce0: 20 20 20 20 20 22 20 20 20 20 20 20 20 28 53 45       "       (SE
1cf0: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
1d00: 74 28 78 29 20 46 52 4f 4d 20 6e 6f 6f 70 74 29  t(x) FROM noopt)
1d10: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ");.      rc = s
1d20: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6b 29  qlite3_step(pCk)
1d30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d40: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1d50: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 43 6f        printf("Co
1d60: 6d 70 61 72 69 73 6f 6e 20 66 61 69 6c 65 64 2e  mparison failed.
1d70: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
1d80: 65 72 72 6d 73 67 28 64 62 4f 75 74 29 29 3b 0a  errmsg(dbOut));.
1d90: 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
1da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1db0: 66 28 20 21 73 71 6c 69 74 65 33 5f 63 6f 6c 75  f( !sqlite3_colu
1dc0: 6d 6e 5f 69 6e 74 28 70 43 6b 2c 20 30 29 20 29  mn_int(pCk, 0) )
1dd0: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
1de0: 28 22 4f 70 74 2f 6e 6f 2d 6f 70 74 20 6f 75 74  ("Opt/no-opt out
1df0: 70 75 74 73 20 64 69 66 66 65 72 20 66 6f 72 20  puts differ for 
1e00: 25 73 5c 6e 22 2c 20 61 7a 49 6e 5b 69 5d 29 3b  %s\n", azIn[i]);
1e10: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
1e20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e30: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e40: 28 70 43 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pCk);.    }.   
1e50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1e60: 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ql);.  }.  sqlit
1e70: 65 33 5f 63 6c 6f 73 65 28 64 62 52 75 6e 29 3b  e3_close(dbRun);
1e80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
1e90: 28 64 62 4f 75 74 29 3b 20 20 20 20 0a 20 20 66  (dbOut);    .  f
1ea0: 72 65 65 28 61 7a 49 6e 29 3b 0a 20 20 69 66 28  ree(azIn);.  if(
1eb0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
1ec0: 75 73 65 64 28 29 20 29 7b 0a 20 20 20 20 70 72  used() ){.    pr
1ed0: 69 6e 74 66 28 22 4d 65 6d 6f 72 79 20 6c 65 61  intf("Memory lea
1ee0: 6b 20 6f 66 20 25 6c 6c 64 20 62 79 74 65 73 5c  k of %lld bytes\
1ef0: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  n", sqlite3_memo
1f00: 72 79 5f 75 73 65 64 28 29 29 3b 0a 20 20 20 20  ry_used());.    
1f10: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72  exit(1);.  }.  r
1f20: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.