/ Hex Artifact Content
Login

Artifact fedf96bcda329ff56e0eff7bc212c99d29ad0397:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 66 75 6e  *.** Utility fun
03b0: 63 74 69 6f 6e 73 20 75 73 65 64 20 74 68 72 6f  ctions used thro
03c0: 75 67 68 6f 75 74 20 73 71 6c 69 74 65 2e 0a 2a  ughout sqlite..*
03d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03e0: 6f 6e 74 61 69 6e 73 20 66 75 6e 63 74 69 6f 6e  ontains function
03f0: 73 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  s for allocating
0400: 20 6d 65 6d 6f 72 79 2c 20 63 6f 6d 70 61 72 69   memory, compari
0410: 6e 67 0a 2a 2a 20 73 74 72 69 6e 67 73 2c 20 61  ng.** strings, a
0420: 6e 64 20 73 74 75 66 66 20 6c 69 6b 65 20 74 68  nd stuff like th
0430: 61 74 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 75  at..**.** $Id: u
0440: 74 69 6c 2e 63 2c 76 20 31 2e 32 34 20 32 30 30  til.c,v 1.24 200
0450: 31 2f 30 39 2f 31 35 20 31 33 3a 31 35 3a 31 33  1/09/15 13:15:13
0460: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0470: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0480: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h".#include <s
0490: 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdarg.h>.#includ
04a0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a  e <ctype.h>../*.
04b0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 65  ** If malloc() e
04c0: 76 65 72 20 66 61 69 6c 73 2c 20 74 68 69 73 20  ver fails, this 
04d0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
04e0: 67 65 74 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a  gets set to 1..*
04f0: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  * This causes th
0500: 65 20 6c 69 62 72 61 72 79 20 74 6f 20 61 62 6f  e library to abo
0510: 72 74 20 61 6e 64 20 6e 65 76 65 72 20 61 67 61  rt and never aga
0520: 69 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  in function..*/.
0530: 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  int sqlite_mallo
0540: 63 5f 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 2f  c_failed = 0;../
0550: 2a 0a 2a 2a 20 49 66 20 4d 45 4d 4f 52 59 5f 44  *.** If MEMORY_D
0560: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
0570: 20 74 68 65 6e 20 75 73 65 20 76 65 72 73 69 6f   then use versio
0580: 6e 73 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 61  ns of malloc() a
0590: 6e 64 0a 2a 2a 20 66 72 65 65 28 29 20 74 68 61  nd.** free() tha
05a0: 74 20 74 72 61 63 6b 20 6d 65 6d 6f 72 79 20 75  t track memory u
05b0: 73 61 67 65 20 61 6e 64 20 63 68 65 63 6b 20 66  sage and check f
05c0: 6f 72 20 62 75 66 66 65 72 20 6f 76 65 72 72 75  or buffer overru
05d0: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 4d 45  ns..*/.#ifdef ME
05e0: 4d 4f 52 59 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a  MORY_DEBUG../*.*
05f0: 2a 20 46 6f 72 20 6b 65 65 70 69 6e 67 20 74 72  * For keeping tr
0600: 61 63 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ack of the numbe
0610: 72 20 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64  r of mallocs and
0620: 20 66 72 65 65 73 2e 20 20 20 54 68 69 73 0a 2a   frees.   This.*
0630: 2a 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  * is used to che
0640: 63 6b 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c 65  ck for memory le
0650: 61 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  aks..*/.int sqli
0660: 74 65 5f 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  te_nMalloc;     
0670: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0680: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
0690: 63 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  calls */.int sql
06a0: 69 74 65 5f 6e 46 72 65 65 3b 20 20 20 20 20 20  ite_nFree;      
06b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
06c0: 66 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 63  f sqliteFree() c
06d0: 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  alls */.int sqli
06e0: 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 20  te_iMallocFail; 
06f0: 20 20 20 20 2f 2a 20 46 61 69 6c 20 73 71 6c 69      /* Fail sqli
0700: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 66 74 65 72  teMalloc() after
0710: 20 74 68 69 73 20 6d 61 6e 79 20 63 61 6c 6c 73   this many calls
0720: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   */.../*.** Allo
0730: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
0740: 61 6e 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65  and set it to ze
0750: 72 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ro.  Return NULL
0760: 20 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79   if.** no memory
0770: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
0780: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61  /.void *sqliteMa
0790: 6c 6c 6f 63 5f 28 69 6e 74 20 6e 2c 20 63 68 61  lloc_(int n, cha
07a0: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69  r *zFile, int li
07b0: 6e 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  ne){.  void *p;.
07c0: 20 20 69 6e 74 20 2a 70 69 3b 0a 20 20 69 6e 74    int *pi;.  int
07d0: 20 6b 3b 0a 20 20 73 71 6c 69 74 65 5f 6e 4d 61   k;.  sqlite_nMa
07e0: 6c 6c 6f 63 2b 2b 3b 0a 20 20 69 66 28 20 73 71  lloc++;.  if( sq
07f0: 6c 69 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  lite_iMallocFail
0800: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
0810: 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b  e_iMallocFail--;
0820: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 5f  .    if( sqlite_
0830: 69 4d 61 6c 6c 6f 63 46 61 69 6c 3d 3d 30 20 29  iMallocFail==0 )
0840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 6d  {.      sqlite_m
0850: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a  alloc_failed++;.
0860: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0880: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
0890: 0a 20 20 6b 20 3d 20 28 6e 2b 73 69 7a 65 6f 66  .  k = (n+sizeof
08a0: 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f 66 28  (int)-1)/sizeof(
08b0: 69 6e 74 29 3b 0a 20 20 70 69 20 3d 20 6d 61 6c  int);.  pi = mal
08c0: 6c 6f 63 28 20 28 33 2b 6b 29 2a 73 69 7a 65 6f  loc( (3+k)*sizeo
08d0: 66 28 69 6e 74 29 29 3b 0a 20 20 69 66 28 20 70  f(int));.  if( p
08e0: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  i==0 ){.    sqli
08f0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
0900: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
0910: 3b 0a 20 20 7d 0a 20 20 70 69 5b 30 5d 20 3d 20  ;.  }.  pi[0] = 
0920: 30 78 64 65 61 64 31 31 32 32 3b 0a 20 20 70 69  0xdead1122;.  pi
0930: 5b 31 5d 20 3d 20 6e 3b 0a 20 20 70 69 5b 6b 2b  [1] = n;.  pi[k+
0940: 32 5d 20 3d 20 30 78 64 65 61 64 33 33 34 34 3b  2] = 0xdead3344;
0950: 0a 20 20 70 20 3d 20 26 70 69 5b 32 5d 3b 0a 20  .  p = &pi[2];. 
0960: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29   memset(p, 0, n)
0970: 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ;.#if MEMORY_DEB
0980: 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73  UG>1.  fprintf(s
0990: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 25 64  tderr,"malloc %d
09a0: 20 62 79 74 65 73 20 61 74 20 30 78 25 78 20 66   bytes at 0x%x f
09b0: 72 6f 6d 20 25 73 3a 25 64 5c 6e 22 2c 20 6e 2c  rom %s:%d\n", n,
09c0: 20 28 69 6e 74 29 70 2c 20 7a 46 69 6c 65 2c 6c   (int)p, zFile,l
09d0: 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ine);.#endif.  r
09e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
09f0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72  * Free memory pr
0a00: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
0a10: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
0a20: 6c 6f 63 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71  loc().*/.void sq
0a30: 6c 69 74 65 46 72 65 65 5f 28 76 6f 69 64 20 2a  liteFree_(void *
0a40: 70 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  p, char *zFile, 
0a50: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 69 66 28  int line){.  if(
0a60: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 2a 70   p ){.    int *p
0a70: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 20 20 70 69 20  i, k, n;.    pi 
0a80: 3d 20 70 3b 0a 20 20 20 20 70 69 20 2d 3d 20 32  = p;.    pi -= 2
0a90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6e 46 72  ;.    sqlite_nFr
0aa0: 65 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 69  ee++;.    if( pi
0ab0: 5b 30 5d 21 3d 30 78 64 65 61 64 31 31 32 32 20  [0]!=0xdead1122 
0ac0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
0ad0: 28 73 74 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64  (stderr,"Low-end
0ae0: 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69   memory corrupti
0af0: 6f 6e 20 61 74 20 30 78 25 78 5c 6e 22 2c 20 28  on at 0x%x\n", (
0b00: 69 6e 74 29 70 29 3b 0a 20 20 20 20 20 20 72 65  int)p);.      re
0b10: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
0b20: 6e 20 3d 20 70 69 5b 31 5d 3b 0a 20 20 20 20 6b  n = pi[1];.    k
0b30: 20 3d 20 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74   = (n+sizeof(int
0b40: 29 2d 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29  )-1)/sizeof(int)
0b50: 3b 0a 20 20 20 20 69 66 28 20 70 69 5b 6b 2b 32  ;.    if( pi[k+2
0b60: 5d 21 3d 30 78 64 65 61 64 33 33 34 34 20 29 7b  ]!=0xdead3344 ){
0b70: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
0b80: 74 64 65 72 72 2c 22 48 69 67 68 2d 65 6e 64 20  tderr,"High-end 
0b90: 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f  memory corruptio
0ba0: 6e 20 61 74 20 30 78 25 78 5c 6e 22 2c 20 28 69  n at 0x%x\n", (i
0bb0: 6e 74 29 70 29 3b 0a 20 20 20 20 20 20 72 65 74  nt)p);.      ret
0bc0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  urn;.    }.    m
0bd0: 65 6d 73 65 74 28 70 69 2c 20 30 78 66 66 2c 20  emset(pi, 0xff, 
0be0: 28 6b 2b 33 29 2a 73 69 7a 65 6f 66 28 69 6e 74  (k+3)*sizeof(int
0bf0: 29 29 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44  ));.#if MEMORY_D
0c00: 45 42 55 47 3e 31 0a 20 20 20 20 66 70 72 69 6e  EBUG>1.    fprin
0c10: 74 66 28 73 74 64 65 72 72 2c 22 66 72 65 65 20  tf(stderr,"free 
0c20: 25 64 20 62 79 74 65 73 20 61 74 20 30 78 25 78  %d bytes at 0x%x
0c30: 20 66 72 6f 6d 20 25 73 3a 25 64 5c 6e 22 2c 20   from %s:%d\n", 
0c40: 6e 2c 20 28 69 6e 74 29 70 2c 20 7a 46 69 6c 65  n, (int)p, zFile
0c50: 2c 6c 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ,line);.#endif. 
0c60: 20 20 20 66 72 65 65 28 70 69 29 3b 0a 20 20 7d     free(pi);.  }
0c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
0c80: 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74   a prior allocat
0c90: 69 6f 6e 2e 20 20 49 66 20 70 3d 3d 30 2c 20 74  ion.  If p==0, t
0ca0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
0cb0: 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  .** works just l
0cc0: 69 6b 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ike sqliteMalloc
0cd0: 28 29 2e 20 20 49 66 20 6e 3d 3d 30 2c 20 74 68  ().  If n==0, th
0ce0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
0cf0: 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  ** works just li
0d00: 6b 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e  ke sqliteFree().
0d10: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
0d20: 52 65 61 6c 6c 6f 63 5f 28 76 6f 69 64 20 2a 6f  Realloc_(void *o
0d30: 6c 64 50 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ldP, int n, char
0d40: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e   *zFile, int lin
0d50: 65 29 7b 0a 20 20 69 6e 74 20 2a 6f 6c 64 50 69  e){.  int *oldPi
0d60: 2c 20 2a 70 69 2c 20 6b 2c 20 6f 6c 64 4e 2c 20  , *pi, k, oldN, 
0d70: 6f 6c 64 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  oldK;.  void *p;
0d80: 0a 20 20 69 66 28 20 6f 6c 64 50 3d 3d 30 20 29  .  if( oldP==0 )
0d90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
0da0: 69 74 65 4d 61 6c 6c 6f 63 5f 28 6e 2c 7a 46 69  iteMalloc_(n,zFi
0db0: 6c 65 2c 6c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20  le,line);.  }.  
0dc0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
0dd0: 73 71 6c 69 74 65 46 72 65 65 5f 28 6f 6c 64 50  sqliteFree_(oldP
0de0: 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 20 20  ,zFile,line);.  
0df0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
0e00: 20 20 6f 6c 64 50 69 20 3d 20 6f 6c 64 50 3b 0a    oldPi = oldP;.
0e10: 20 20 6f 6c 64 50 69 20 2d 3d 20 32 3b 0a 20 20    oldPi -= 2;.  
0e20: 69 66 28 20 6f 6c 64 50 69 5b 30 5d 21 3d 30 78  if( oldPi[0]!=0x
0e30: 64 65 61 64 31 31 32 32 20 29 7b 0a 20 20 20 20  dead1122 ){.    
0e40: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
0e50: 4c 6f 77 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63  Low-end memory c
0e60: 6f 72 72 75 70 74 69 6f 6e 20 69 6e 20 72 65 61  orruption in rea
0e70: 6c 6c 6f 63 20 61 74 20 30 78 25 78 5c 6e 22 2c  lloc at 0x%x\n",
0e80: 20 28 69 6e 74 29 70 29 3b 0a 20 20 20 20 72 65   (int)p);.    re
0e90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f 6c  turn 0;.  }.  ol
0ea0: 64 4e 20 3d 20 6f 6c 64 50 69 5b 31 5d 3b 0a 20  dN = oldPi[1];. 
0eb0: 20 6f 6c 64 4b 20 3d 20 28 6f 6c 64 4e 2b 73 69   oldK = (oldN+si
0ec0: 7a 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a  zeof(int)-1)/siz
0ed0: 65 6f 66 28 69 6e 74 29 3b 0a 20 20 69 66 28 20  eof(int);.  if( 
0ee0: 6f 6c 64 50 69 5b 6f 6c 64 4b 2b 32 5d 21 3d 30  oldPi[oldK+2]!=0
0ef0: 78 64 65 61 64 33 33 34 34 20 29 7b 0a 20 20 20  xdead3344 ){.   
0f00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0f10: 22 48 69 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79  "High-end memory
0f20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 6e 20 72   corruption in r
0f30: 65 61 6c 6c 6f 63 20 61 74 20 30 78 25 78 5c 6e  ealloc at 0x%x\n
0f40: 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20 20 20 20  ", (int)p);.    
0f50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0f60: 6b 20 3d 20 28 6e 20 2b 20 73 69 7a 65 6f 66 28  k = (n + sizeof(
0f70: 69 6e 74 29 20 2d 20 31 29 2f 73 69 7a 65 6f 66  int) - 1)/sizeof
0f80: 28 69 6e 74 29 3b 0a 20 20 70 69 20 3d 20 6d 61  (int);.  pi = ma
0f90: 6c 6c 6f 63 28 20 28 6b 2b 33 29 2a 73 69 7a 65  lloc( (k+3)*size
0fa0: 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 69 66 28  of(int) );.  if(
0fb0: 20 70 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   pi==0 ){.    sq
0fc0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
0fd0: 65 64 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed++;.    return
0fe0: 20 30 3b 0a 20 20 7d 0a 20 20 70 69 5b 30 5d 20   0;.  }.  pi[0] 
0ff0: 3d 20 30 78 64 65 61 64 31 31 32 32 3b 0a 20 20  = 0xdead1122;.  
1000: 70 69 5b 31 5d 20 3d 20 6e 3b 0a 20 20 70 69 5b  pi[1] = n;.  pi[
1010: 6b 2b 32 5d 20 3d 20 30 78 64 65 61 64 33 33 34  k+2] = 0xdead334
1020: 34 3b 0a 20 20 70 20 3d 20 26 70 69 5b 32 5d 3b  4;.  p = &pi[2];
1030: 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 6f 6c 64  .  memcpy(p, old
1040: 50 2c 20 6e 3e 6f 6c 64 4e 20 3f 20 6f 6c 64 4e  P, n>oldN ? oldN
1050: 20 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3e 6f   : n);.  if( n>o
1060: 6c 64 4e 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ldN ){.    memse
1070: 74 28 26 28 28 63 68 61 72 2a 29 70 29 5b 6f 6c  t(&((char*)p)[ol
1080: 64 4e 5d 2c 20 30 2c 20 6e 2d 6f 6c 64 4e 29 3b  dN], 0, n-oldN);
1090: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 6f 6c  .  }.  memset(ol
10a0: 64 50 69 2c 20 30 2c 20 28 6f 6c 64 4b 2b 33 29  dPi, 0, (oldK+3)
10b0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
10c0: 20 66 72 65 65 28 6f 6c 64 50 69 29 3b 0a 23 69   free(oldPi);.#i
10d0: 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31  f MEMORY_DEBUG>1
10e0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
10f0: 72 2c 22 72 65 61 6c 6c 6f 63 20 25 64 20 74 6f  r,"realloc %d to
1100: 20 25 64 20 62 79 74 65 73 20 61 74 20 30 78 25   %d bytes at 0x%
1110: 78 20 74 6f 20 30 78 25 78 20 61 74 20 25 73 3a  x to 0x%x at %s:
1120: 25 64 5c 6e 22 2c 20 6f 6c 64 4e 2c 20 6e 2c 0a  %d\n", oldN, n,.
1130: 20 20 20 20 28 69 6e 74 29 6f 6c 64 50 2c 20 28      (int)oldP, (
1140: 69 6e 74 29 70 2c 20 7a 46 69 6c 65 2c 20 6c 69  int)p, zFile, li
1150: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ne);.#endif.  re
1160: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1170: 20 4d 61 6b 65 20 61 20 64 75 70 6c 69 63 61 74   Make a duplicat
1180: 65 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  e of a string in
1190: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
11a0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
11b0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6f 72 69  .** Free the ori
11c0: 67 69 6e 61 6c 20 73 74 72 69 6e 67 20 75 73 69  ginal string usi
11d0: 6e 67 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e  ng sqliteFree().
11e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
1200: 20 61 6c 6c 20 73 74 72 69 6e 67 73 20 74 68 61   all strings tha
1210: 74 20 61 72 65 20 70 61 73 73 65 64 20 6f 75 74  t are passed out
1220: 73 69 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 53  side of.** the S
1230: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
1240: 54 68 61 74 20 77 61 79 20 63 6c 69 65 6e 74 73  That way clients
1250: 20 63 61 6e 20 66 72 65 65 20 74 68 65 20 73 74   can free the st
1260: 72 69 6e 67 20 75 73 69 6e 67 20 66 72 65 65 28  ring using free(
1270: 29 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  ).** rather than
1280: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 20   having to call 
1290: 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f  sqliteFree()..*/
12a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 72 52  .void sqliteStrR
12b0: 65 61 6c 6c 6f 63 28 63 68 61 72 20 2a 2a 70 7a  ealloc(char **pz
12c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
12d0: 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 7c 7c 20  .  if( pz==0 || 
12e0: 2a 70 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  *pz==0 ) return;
12f0: 0a 20 20 7a 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63  .  zNew = malloc
1300: 28 20 73 74 72 6c 65 6e 28 2a 70 7a 29 20 2b 20  ( strlen(*pz) + 
1310: 31 20 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 3d  1 );.  if( zNew=
1320: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1330: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b  _malloc_failed++
1340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
1350: 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d  (*pz);.    *pz =
1360: 20 30 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79   0;.  }.  strcpy
1370: 28 7a 4e 65 77 2c 20 2a 70 7a 29 3b 0a 20 20 73  (zNew, *pz);.  s
1380: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a  qliteFree(*pz);.
1390: 20 20 2a 70 7a 20 3d 20 7a 4e 65 77 3b 0a 7d 0a    *pz = zNew;.}.
13a0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
13b0: 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  py of a string i
13c0: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
13d0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
13e0: 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72 20 2a 73  loc().*/.char *s
13f0: 71 6c 69 74 65 53 74 72 44 75 70 5f 28 63 6f 6e  qliteStrDup_(con
1400: 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 68 61 72  st char *z, char
1410: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e   *zFile, int lin
1420: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77  e){.  char *zNew
1430: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f   = sqliteMalloc_
1440: 28 73 74 72 6c 65 6e 28 7a 29 2b 31 2c 20 7a 46  (strlen(z)+1, zF
1450: 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66  ile, line);.  if
1460: 28 20 7a 4e 65 77 20 29 20 73 74 72 63 70 79 28  ( zNew ) strcpy(
1470: 7a 4e 65 77 2c 20 7a 29 3b 0a 20 20 72 65 74 75  zNew, z);.  retu
1480: 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72 20  rn zNew;.}.char 
1490: 2a 73 71 6c 69 74 65 53 74 72 4e 44 75 70 5f 28  *sqliteStrNDup_(
14a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
14b0: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 46 69 6c  nt n, char *zFil
14c0: 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20  e, int line){.  
14d0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
14e0: 69 74 65 4d 61 6c 6c 6f 63 5f 28 6e 2b 31 2c 20  iteMalloc_(n+1, 
14f0: 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 20 20  zFile, line);.  
1500: 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
1510: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20  memcpy(zNew, z, 
1520: 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20  n);.    zNew[n] 
1530: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1540: 6e 20 7a 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69 66  n zNew;.}.#endif
1550: 20 2f 2a 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47   /* MEMORY_DEBUG
1560: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1570: 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e  ollowing version
1580: 73 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  s of malloc() an
1590: 64 20 66 72 65 65 28 29 20 61 72 65 20 66 6f 72  d free() are for
15a0: 20 75 73 65 20 69 6e 20 61 0a 2a 2a 20 6e 6f 72   use in a.** nor
15b0: 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69  mal build..*/.#i
15c0: 66 20 21 64 65 66 69 6e 65 64 28 4d 45 4d 4f 52  f !defined(MEMOR
15d0: 59 5f 44 45 42 55 47 29 0a 0a 2f 2a 0a 2a 2a 20  Y_DEBUG)../*.** 
15e0: 41 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  Allocate new mem
15f0: 6f 72 79 20 61 6e 64 20 73 65 74 20 69 74 20 74  ory and set it t
1600: 6f 20 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  o zero.  Return 
1610: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 20 6d 65  NULL if.** no me
1620: 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mory is availabl
1630: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
1640: 74 65 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b  teMalloc(int n){
1650: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 6d 61 6c  .  void *p = mal
1660: 6c 6f 63 28 6e 29 3b 0a 20 20 69 66 28 20 70 3d  loc(n);.  if( p=
1670: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1680: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b  _malloc_failed++
1690: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16a0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
16b0: 30 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, n);.  return 
16c0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
16d0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
16e0: 6c 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ly obtained from
16f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
1700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 72  */.void sqliteFr
1710: 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69  ee(void *p){.  i
1720: 66 28 20 70 20 29 7b 0a 20 20 20 20 66 72 65 65  f( p ){.    free
1730: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
1740: 2a 20 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72  * Resize a prior
1750: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
1760: 20 70 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73   p==0, then this
1770: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b   routine.** work
1780: 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
1790: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20  teMalloc().  If 
17a0: 6e 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20  n==0, then this 
17b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73  routine.** works
17c0: 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
17d0: 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64  eFree()..*/.void
17e0: 20 2a 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28   *sqliteRealloc(
17f0: 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  void *p, int n){
1800: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
1810: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1820: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 20  Malloc(n);.  }. 
1830: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
1840: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
1850: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1860: 7d 0a 20 20 70 20 3d 20 72 65 61 6c 6c 6f 63 28  }.  p = realloc(
1870: 70 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d  p, n);.  if( p==
1880: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f  0 ){.    sqlite_
1890: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b  malloc_failed++;
18a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
18b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
18c0: 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
18d0: 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  g in memory obta
18e0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18f0: 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72  Malloc().*/.char
1900: 20 2a 73 71 6c 69 74 65 53 74 72 44 75 70 28 63   *sqliteStrDup(c
1910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
1920: 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
1930: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 74 72 6c 65  liteMalloc(strle
1940: 6e 28 7a 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a  n(z)+1);.  if( z
1950: 4e 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65  New ) strcpy(zNe
1960: 77 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, z);.  return 
1970: 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71  zNew;.}.char *sq
1980: 6c 69 74 65 53 74 72 4e 44 75 70 28 63 6f 6e 73  liteStrNDup(cons
1990: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
19a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 20  ){.  char *zNew 
19b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  = sqliteMalloc(n
19c0: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
19d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e  ){.    memcpy(zN
19e0: 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a  ew, z, n);.    z
19f0: 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  New[n] = 0;.  }.
1a00: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
1a10: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
1a20: 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42 55 47  ned(MEMORY_DEBUG
1a30: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  ) */../*.** Crea
1a40: 74 65 20 61 20 73 74 72 69 6e 67 20 66 72 6f 6d  te a string from
1a50: 20 74 68 65 20 32 6e 64 20 61 6e 64 20 73 75 62   the 2nd and sub
1a60: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
1a70: 73 20 28 75 70 20 74 6f 20 74 68 65 0a 2a 2a 20  s (up to the.** 
1a80: 66 69 72 73 74 20 4e 55 4c 4c 20 61 72 67 75 6d  first NULL argum
1a90: 65 6e 74 29 2c 20 73 74 6f 72 65 20 74 68 65 20  ent), store the 
1aa0: 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79  string in memory
1ab0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1ac0: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
1ad0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 6f   and make the po
1ae0: 69 6e 74 65 72 20 69 6e 64 69 63 61 74 65 64 20  inter indicated 
1af0: 62 79 20 74 68 65 20 31 73 74 20 61 72 67 75 6d  by the 1st argum
1b00: 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  ent.** point to 
1b10: 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  that string..*/.
1b20: 76 6f 69 64 20 73 71 6c 69 74 65 53 65 74 53 74  void sqliteSetSt
1b30: 72 69 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20  ring(char **pz, 
1b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72  const char *zFir
1b50: 73 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  st, ...){.  va_l
1b60: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42  ist ap;.  int nB
1b70: 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  yte;.  const cha
1b80: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52  r *z;.  char *zR
1b90: 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 70 7a  esult;..  if( pz
1ba0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1bb0: 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nByte = strlen(z
1bc0: 46 69 72 73 74 29 20 2b 20 31 3b 0a 20 20 76 61  First) + 1;.  va
1bd0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 69 72 73  _start(ap, zFirs
1be0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  t);.  while( (z 
1bf0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
1c00: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
1c10: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74  .    nByte += st
1c20: 72 6c 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76  rlen(z);.  }.  v
1c30: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
1c40: 69 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20  iteFree(*pz);.  
1c50: 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20  *pz = zResult = 
1c60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
1c70: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 52 65  yte );.  if( zRe
1c80: 73 75 6c 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  sult==0 ) return
1c90: 3b 0a 20 20 73 74 72 63 70 79 28 7a 52 65 73 75  ;.  strcpy(zResu
1ca0: 6c 74 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 7a  lt, zFirst);.  z
1cb0: 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c 65 6e  Result += strlen
1cc0: 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 76 61 5f  (zResult);.  va_
1cd0: 73 74 61 72 74 28 61 70 2c 20 7a 46 69 72 73 74  start(ap, zFirst
1ce0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d  );.  while( (z =
1cf0: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1d00: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
1d10: 20 20 20 20 73 74 72 63 70 79 28 7a 52 65 73 75      strcpy(zResu
1d20: 6c 74 2c 20 7a 29 3b 0a 20 20 20 20 7a 52 65 73  lt, z);.    zRes
1d30: 75 6c 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 52  ult += strlen(zR
1d40: 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 76 61  esult);.  }.  va
1d50: 5f 65 6e 64 28 61 70 29 3b 0a 23 69 66 64 65 66  _end(ap);.#ifdef
1d60: 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a 23 69   MEMORY_DEBUG.#i
1d70: 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31  f MEMORY_DEBUG>1
1d80: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
1d90: 72 2c 22 73 74 72 69 6e 67 20 61 74 20 30 78 25  r,"string at 0x%
1da0: 78 20 69 73 20 25 73 5c 6e 22 2c 20 28 69 6e 74  x is %s\n", (int
1db0: 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a 23 65 6e 64  )*pz, *pz);.#end
1dc0: 69 66 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  if.#endif.}../*.
1dd0: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
1de0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 2c 20 62  liteSetString, b
1df0: 75 74 20 65 61 63 68 20 73 74 72 69 6e 67 20 69  ut each string i
1e00: 73 20 6e 6f 77 20 66 6f 6c 6c 6f 77 65 64 20 62  s now followed b
1e10: 79 0a 2a 2a 20 61 20 6c 65 6e 67 74 68 20 69 6e  y.** a length in
1e20: 74 65 67 65 72 20 77 68 69 63 68 20 73 70 65 63  teger which spec
1e30: 69 66 69 65 73 20 68 6f 77 20 6d 75 63 68 20 6f  ifies how much o
1e40: 66 20 74 68 65 20 73 6f 75 72 63 65 20 73 74 72  f the source str
1e50: 69 6e 67 20 0a 2a 2a 20 74 6f 20 63 6f 70 79 20  ing .** to copy 
1e60: 28 69 6e 20 62 79 74 65 73 29 2e 20 20 2d 31 20  (in bytes).  -1 
1e70: 6d 65 61 6e 73 20 75 73 65 20 74 68 65 20 77 68  means use the wh
1e80: 6f 6c 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76  ole string..*/.v
1e90: 6f 69 64 20 73 71 6c 69 74 65 53 65 74 4e 53 74  oid sqliteSetNSt
1ea0: 72 69 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20  ring(char **pz, 
1eb0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ec0: 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ap;.  int nByte;
1ed0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ee0: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  ;.  char *zResul
1ef0: 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  t;.  int n;..  i
1f00: 66 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72  f( pz==0 ) retur
1f10: 6e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  n;.  nByte = 0;.
1f20: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
1f30: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  z);.  while( (z 
1f40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
1f50: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
1f60: 0a 20 20 20 20 6e 20 3d 20 76 61 5f 61 72 67 28  .    n = va_arg(
1f70: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 69 66  ap, int);.    if
1f80: 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n<=0 ) n = str
1f90: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 6e 42 79 74  len(z);.    nByt
1fa0: 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20 76 61  e += n;.  }.  va
1fb0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69  _end(ap);.  sqli
1fc0: 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a  teFree(*pz);.  *
1fd0: 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73  pz = zResult = s
1fe0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
1ff0: 74 65 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  te + 1 );.  if( 
2000: 7a 52 65 73 75 6c 74 3d 3d 30 20 29 20 72 65 74  zResult==0 ) ret
2010: 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  urn;.  va_start(
2020: 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65  ap, pz);.  while
2030: 28 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (z = va_arg(ap
2040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21  , const char*))!
2050: 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61  =0 ){.    n = va
2060: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2070: 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20     if( n<=0 ) n 
2080: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
2090: 20 73 74 72 6e 63 70 79 28 7a 52 65 73 75 6c 74   strncpy(zResult
20a0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 52 65  , z, n);.    zRe
20b0: 73 75 6c 74 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20  sult += n;.  }. 
20c0: 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23   *zResult = 0;.#
20d0: 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ifdef MEMORY_DEB
20e0: 55 47 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45  UG.#if MEMORY_DE
20f0: 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28  BUG>1.  fprintf(
2100: 73 74 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61  stderr,"string a
2110: 74 20 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c  t 0x%x is %s\n",
2120: 20 28 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b   (int)*pz, *pz);
2130: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
2140: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
2150: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
2160: 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65   SQL-style quote
2170: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  d string into a 
2180: 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79  normal string by
2190: 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65   removing.** the
21a0: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
21b0: 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69  s.  The conversi
21c0: 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c  on is done in-pl
21d0: 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ace.  If the.** 
21e0: 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62  input does not b
21f0: 65 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74  egin with a quot
2200: 65 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65  e character, the
2210: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
2220: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  * is a no-op..*/
2230: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 71 75  .void sqliteDequ
2240: 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ote(char *z){.  
2250: 69 6e 74 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74  int quote;.  int
2260: 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 7a 3d 3d   i, j;.  if( z==
2270: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 71 75  0 ) return;.  qu
2280: 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66  ote = z[0];.  if
2290: 28 20 71 75 6f 74 65 21 3d 27 5c 27 27 20 26 26  ( quote!='\'' &&
22a0: 20 71 75 6f 74 65 21 3d 27 22 27 20 29 20 72 65   quote!='"' ) re
22b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 2c  turn;.  for(i=1,
22c0: 20 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29   j=0; z[i]; i++)
22d0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
22e0: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69  quote ){.      i
22f0: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65  f( z[i+1]==quote
2300: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b   ){.        z[j+
2310: 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20  +] = quote;.    
2320: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
2330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
2340: 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  j++] = 0;.      
2350: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2360: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2370: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
2380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2390: 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70   An array to map
23a0: 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20   all upper-case 
23b0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
23c0: 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
23d0: 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73  ing.** lower-cas
23e0: 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2f  e character. .*/
23f0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
2400: 20 63 68 61 72 20 55 70 70 65 72 54 6f 4c 6f 77   char UpperToLow
2410: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  er[] = {.      0
2420: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
2430: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38  ,  5,  6,  7,  8
2440: 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32  ,  9, 10, 11, 12
2450: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
2460: 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31  , 17,.     18, 1
2470: 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32  9, 20, 21, 22, 2
2480: 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32  3, 24, 25, 26, 2
2490: 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33  7, 28, 29, 30, 3
24a0: 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33  1, 32, 33, 34, 3
24b0: 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20  5,.     36, 37, 
24c0: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
24d0: 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20  42, 43, 44, 45, 
24e0: 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20  46, 47, 48, 49, 
24f0: 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a  50, 51, 52, 53,.
2500: 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c       54, 55, 56,
2510: 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c   57, 58, 59, 60,
2520: 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c   61, 62, 63, 64,
2530: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
2540: 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20  101,102,103,.   
2550: 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37   104,105,106,107
2560: 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31  ,108,109,110,111
2570: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
2580: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
2590: 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32  ,120,121,.    12
25a0: 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20 39  2, 91, 92, 93, 9
25b0: 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20 39  4, 95, 96, 97, 9
25c0: 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30  8, 99,100,101,10
25d0: 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31 30  2,103,104,105,10
25e0: 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c 31  6,107,.    108,1
25f0: 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31  09,110,111,112,1
2600: 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31  13,114,115,116,1
2610: 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31  17,118,119,120,1
2620: 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c 31  21,122,123,124,1
2630: 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37 2c  25,.    126,127,
2640: 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c  128,129,130,131,
2650: 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c  132,133,134,135,
2660: 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c  136,137,138,139,
2670: 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c  140,141,142,143,
2680: 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34 36  .    144,145,146
2690: 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35 30  ,147,148,149,150
26a0: 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35 34  ,151,152,153,154
26b0: 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35 38  ,155,156,157,158
26c0: 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20 20  ,159,160,161,.  
26d0: 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 36    162,163,164,16
26e0: 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 36  5,166,167,168,16
26f0: 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31 37  9,170,171,172,17
2700: 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31 37  3,174,175,176,17
2710: 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20 31  7,178,179,.    1
2720: 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c 31  80,181,182,183,1
2730: 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c 31  84,185,186,187,1
2740: 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c 31  88,189,190,191,1
2750: 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c 31  92,193,194,195,1
2760: 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38 2c  96,197,.    198,
2770: 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32 2c  199,200,201,202,
2780: 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36 2c  203,204,205,206,
2790: 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30 2c  207,208,209,210,
27a0: 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34 2c  211,212,213,214,
27b0: 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31 37  215,.    216,217
27c0: 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31  ,218,219,220,221
27d0: 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32 35  ,222,223,224,225
27e0: 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32 39  ,226,227,228,229
27f0: 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33 33  ,230,231,232,233
2800: 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33  ,.    234,235,23
2810: 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34  6,237,238,239,24
2820: 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34  0,241,242,243,24
2830: 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34  4,245,246,247,24
2840: 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a 20  8,249,250,251,. 
2850: 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32     252,253,254,2
2860: 35 35 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  55.};../*.** Thi
2870: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75  s function compu
2880: 74 65 73 20 61 20 68 61 73 68 20 6f 6e 20 74 68  tes a hash on th
2890: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6b 65 79 77  e name of a keyw
28a0: 6f 72 64 2e 0a 2a 2a 20 43 61 73 65 20 69 73 20  ord..** Case is 
28b0: 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74 2e  not significant.
28c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 48 61  .*/.int sqliteHa
28d0: 73 68 4e 6f 43 61 73 65 28 63 6f 6e 73 74 20 63  shNoCase(const c
28e0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
28f0: 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 69    int h = 0;.  i
2900: 6e 74 20 63 3b 0a 20 20 69 66 28 20 6e 3c 3d 30  nt c;.  if( n<=0
2910: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29   ) n = strlen(z)
2920: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
2930: 20 30 20 26 26 20 28 63 20 3d 20 2a 7a 2b 2b 29   0 && (c = *z++)
2940: 21 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  !=0 ){.    h = (
2950: 68 3c 3c 33 29 20 5e 20 68 20 5e 20 55 70 70 65  h<<3) ^ h ^ Uppe
2960: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 7d  rToLower[c];.  }
2970: 0a 20 20 69 66 28 20 68 3c 30 20 29 20 68 20 3d  .  if( h<0 ) h =
2980: 20 2d 68 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b   -h;.  return h;
2990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73  .}../*.** Some s
29a0: 79 73 74 65 6d 73 20 68 61 76 65 20 73 74 72 69  ystems have stri
29b0: 63 6d 70 28 29 2e 20 20 4f 74 68 65 72 73 20 68  cmp().  Others h
29c0: 61 76 65 20 73 74 72 63 61 73 65 63 6d 70 28 29  ave strcasecmp()
29d0: 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a 20 74 68  .  Because.** th
29e0: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73 69 73  ere is no consis
29f0: 74 65 6e 63 79 2c 20 77 65 20 77 69 6c 6c 20 64  tency, we will d
2a00: 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a  efine our own..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 74 72 49  /.int sqliteStrI
2a20: 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Cmp(const char *
2a30: 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61  zLeft, const cha
2a40: 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20 72 65  r *zRight){.  re
2a50: 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20  gister unsigned 
2a60: 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61  char *a, *b;.  a
2a70: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2a80: 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d  r *)zLeft;.  b =
2a90: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
2aa0: 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c  *)zRight;.  whil
2ab0: 65 28 20 2a 61 21 3d 30 20 26 26 20 55 70 70 65  e( *a!=0 && Uppe
2ac0: 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70  rToLower[*a]==Up
2ad0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b  perToLower[*b]){
2ae0: 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72   a++; b++; }.  r
2af0: 65 74 75 72 6e 20 2a 61 20 2d 20 2a 62 3b 0a 7d  eturn *a - *b;.}
2b00: 0a 69 6e 74 20 73 71 6c 69 74 65 53 74 72 4e 49  .int sqliteStrNI
2b10: 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Cmp(const char *
2b20: 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61  zLeft, const cha
2b30: 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e 74 20 4e  r *zRight, int N
2b40: 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e  ){.  register un
2b50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20  signed char *a, 
2b60: 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67  *b;.  a = (unsig
2b70: 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74  ned char *)zLeft
2b80: 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  b = (unsigne
2b90: 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b  d char *)zRight;
2ba0: 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
2bb0: 30 20 26 26 20 2a 61 21 3d 30 20 26 26 20 55 70  0 && *a!=0 && Up
2bc0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d  perToLower[*a]==
2bd0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
2be0: 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20  ){ a++; b++; }. 
2bf0: 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20 30 20   return N<0 ? 0 
2c00: 3a 20 2a 61 20 2d 20 2a 62 3b 0a 7d 0a 0a 2f 2a  : *a - *b;.}../*
2c10: 20 4e 6f 74 65 73 20 6f 6e 20 73 74 72 69 6e 67   Notes on string
2c20: 20 63 6f 6d 70 61 72 69 73 69 6f 6e 73 2e 0a 2a   comparisions..*
2c30: 2a 0a 2a 2a 20 57 65 20 77 61 6e 74 20 74 68 65  *.** We want the
2c40: 20 6d 61 69 6e 20 73 74 72 69 6e 67 20 63 6f 6d   main string com
2c50: 70 61 72 69 73 69 6f 6e 20 66 75 6e 63 74 69 6f  parision functio
2c60: 6e 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69  n used for sorti
2c70: 6e 67 20 74 6f 0a 2a 2a 20 73 6f 72 74 20 62 6f  ng to.** sort bo
2c80: 74 68 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 61  th numbers and a
2c90: 6c 70 68 61 6e 75 6d 65 72 69 63 20 77 6f 72 64  lphanumeric word
2ca0: 73 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  s into the corre
2cb0: 63 74 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20  ct sequence..** 
2cc0: 54 68 65 20 73 61 6d 65 20 72 6f 75 74 69 6e 65  The same routine
2cd0: 20 73 68 6f 75 6c 64 20 64 6f 20 62 6f 74 68 20   should do both 
2ce0: 77 69 74 68 6f 75 74 20 70 72 69 6f 72 20 6b 6e  without prior kn
2cf0: 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 69 63 68  owledge of which
2d00: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 74 65 78 74  .** type of text
2d10: 20 74 68 65 20 69 6e 70 75 74 20 72 65 70 72 65   the input repre
2d20: 73 65 6e 74 73 2e 20 20 49 74 20 73 68 6f 75 6c  sents.  It shoul
2d30: 64 20 65 76 65 6e 20 77 6f 72 6b 20 66 6f 72 20  d even work for 
2d40: 73 74 72 69 6e 67 73 0a 2a 2a 20 77 68 69 63 68  strings.** which
2d50: 20 61 72 65 20 61 20 6d 69 78 74 75 72 65 20 6f   are a mixture o
2d60: 66 20 74 65 78 74 20 61 6e 64 20 6e 75 6d 62 65  f text and numbe
2d70: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 63 63  rs..**.** To acc
2d80: 6f 6d 70 6c 69 73 68 20 74 68 69 73 2c 20 77 65  omplish this, we
2d90: 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61   keep track of a
2da0: 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 77 68   state number wh
2db0: 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 2a 2a 20  ile scanning.** 
2dc0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 2e  the two strings.
2dd0: 20 20 54 68 65 20 73 74 61 74 65 73 20 61 72 65    The states are
2de0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2df0: 2a 2a 20 20 20 20 31 20 20 20 20 20 20 42 65 67  **    1      Beg
2e00: 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a  inning of word.*
2e10: 2a 20 20 20 20 32 20 20 20 20 20 20 41 72 62 69  *    2      Arbi
2e20: 74 72 61 72 79 20 74 65 78 74 0a 2a 2a 20 20 20  trary text.**   
2e30: 20 33 20 20 20 20 20 20 49 6e 74 65 67 65 72 0a   3      Integer.
2e40: 2a 2a 20 20 20 20 34 20 20 20 20 20 20 4e 65 67  **    4      Neg
2e50: 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a  ative integer.**
2e60: 20 20 20 20 35 20 20 20 20 20 20 52 65 61 6c 20      5      Real 
2e70: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 36 20 20  number.**    6  
2e80: 20 20 20 20 4e 65 67 61 74 69 76 65 20 72 65 61      Negative rea
2e90: 6c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  l.**.** The scan
2ea0: 20 62 65 67 69 6e 73 20 69 6e 20 73 74 61 74 65   begins in state
2eb0: 20 31 2c 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   1, beginning of
2ec0: 20 77 6f 72 64 2e 20 20 54 72 61 6e 73 69 74 69   word.  Transiti
2ed0: 6f 6e 73 20 74 6f 20 6f 74 68 65 72 0a 2a 2a 20  ons to other.** 
2ee0: 73 74 61 74 65 73 20 61 72 65 20 64 65 74 65 72  states are deter
2ef0: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
2f00: 65 72 73 20 73 65 65 6e 2c 20 61 73 20 73 68 6f  ers seen, as sho
2f10: 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  wn in the follow
2f20: 69 6e 67 0a 2a 2a 20 63 68 61 72 74 3a 0a 2a 2a  ing.** chart:.**
2f30: 0a 2a 2a 20 20 20 20 20 20 43 75 72 72 65 6e 74  .**      Current
2f40: 20 53 74 61 74 65 20 20 20 20 20 20 20 20 20 43   State         C
2f50: 68 61 72 61 63 74 65 72 20 53 65 65 6e 20 20 4e  haracter Seen  N
2f60: 65 77 20 53 74 61 74 65 0a 2a 2a 20 20 20 20 20  ew State.**     
2f70: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2f80: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
2f90: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
2fb0: 20 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f     0 Beginning o
2fc0: 66 20 77 6f 72 64 20 20 20 22 2d 22 20 20 20 20  f word   "-"    
2fd0: 20 20 20 20 20 20 20 20 20 33 20 4e 65 67 61 74           3 Negat
2fe0: 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ive integer.**  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 64 69 67 69 74 20            digit 
3010: 20 20 20 20 20 20 20 20 20 20 32 20 49 6e 74 65            2 Inte
3020: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ger.**          
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20    space         
3050: 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66    0 Beginning of
3060: 20 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20   word.**        
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
3090: 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79 20      1 Arbitrary 
30a0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  text.**.**      
30b0: 31 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74  1 Arbitrary text
30c0: 20 20 20 20 20 20 73 70 61 63 65 20 20 20 20 20        space     
30d0: 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69 6e        0 Beginnin
30e0: 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20  g of word.**    
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20          digit   
3110: 20 20 20 20 20 20 20 20 32 20 49 6e 74 65 67 65          2 Intege
3120: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
3150: 31 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74  1 Arbitrary text
3160: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 20 49 6e  .**.**      2 In
3170: 74 65 67 65 72 20 20 20 20 20 20 20 20 20 20 20  teger           
3180: 20 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20    space         
3190: 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66    0 Beginning of
31a0: 20 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20   word.**        
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 22 2e 22 20 20 20 20 20 20 20 20 20      "."         
31d0: 20 20 20 20 34 20 52 65 61 6c 20 6e 75 6d 62 65      4 Real numbe
31e0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 64 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20  digit           
3210: 32 20 49 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  2 Integer.**    
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73          otherwis
3240: 65 20 20 20 20 20 20 20 31 20 41 72 62 69 74 72  e       1 Arbitr
3250: 61 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20  ary text.**.**  
3260: 20 20 20 20 33 20 4e 65 67 61 74 69 76 65 20 69      3 Negative i
3270: 6e 74 65 67 65 72 20 20 20 20 73 70 61 63 65 20  nteger    space 
3280: 20 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69            0 Begi
3290: 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a  nning of word.**
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2e 22 20              "." 
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 35 20 4e 65              5 Ne
32d0: 67 61 74 69 76 65 20 52 65 61 6c 20 6e 75 6d 0a  gative Real num.
32e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
3300: 67 69 74 20 20 20 20 20 20 20 20 20 20 20 33 20  git           3 
3310: 4e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  Negative integer
3320: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
3340: 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 31  therwise       1
3350: 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a   Arbitrary text.
3360: 2a 2a 0a 2a 2a 20 20 20 20 20 20 34 20 52 65 61  **.**      4 Rea
3370: 6c 20 6e 75 6d 62 65 72 20 20 20 20 20 20 20 20  l number        
3380: 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20   space          
3390: 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20   0 Beginning of 
33a0: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20     digit        
33d0: 20 20 20 34 20 52 65 61 6c 20 6e 75 6d 62 65 72     4 Real number
33e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
3400: 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 31  therwise       1
3410: 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a   Arbitrary text.
3420: 2a 2a 0a 2a 2a 20 20 20 20 20 20 35 20 4e 65 67  **.**      5 Neg
3430: 61 74 69 76 65 20 72 65 61 6c 20 6e 75 6d 20 20  ative real num  
3440: 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20   space          
3450: 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20   0 Beginning of 
3460: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20     digit        
3490: 20 20 20 35 20 4e 65 67 61 74 69 76 65 20 72 65     5 Negative re
34a0: 61 6c 20 6e 75 6d 0a 2a 2a 20 20 20 20 20 20 20  al num.**       
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20       otherwise  
34d0: 20 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79       1 Arbitrary
34e0: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 6f 20 69   text.**.** To i
34f0: 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 73 74  mplement this st
3500: 61 74 65 20 6d 61 63 68 69 6e 65 2c 20 77 65 20  ate machine, we 
3510: 66 69 72 73 74 20 63 6c 61 73 73 69 66 79 20 65  first classify e
3520: 61 63 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  ach character.**
3530: 20 69 6e 74 6f 20 6f 6e 20 6f 66 20 74 68 65 20   into on of the 
3540: 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 74 65 67 6f  following catego
3550: 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ries:.**.**     
3560: 20 30 20 20 54 65 78 74 0a 2a 2a 20 20 20 20 20   0  Text.**     
3570: 20 31 20 20 53 70 61 63 65 0a 2a 2a 20 20 20 20   1  Space.**    
3580: 20 20 32 20 20 44 69 67 69 74 0a 2a 2a 20 20 20    2  Digit.**   
3590: 20 20 20 33 20 20 22 2d 22 0a 2a 2a 20 20 20 20     3  "-".**    
35a0: 20 20 34 20 20 22 2e 22 0a 2a 2a 0a 2a 2a 20 47    4  ".".**.** G
35b0: 69 76 65 6e 20 61 6e 20 61 72 62 69 74 72 61 72  iven an arbitrar
35c0: 79 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65  y character, the
35d0: 20 61 72 72 61 79 20 63 68 61 72 43 6c 61 73 73   array charClass
35e0: 5b 5d 20 6d 61 70 73 20 74 68 61 74 20 63 68 61  [] maps that cha
35f0: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 6f  racter.** into o
3600: 6e 65 20 6f 66 20 74 68 65 20 61 74 6f 76 65 20  ne of the atove 
3610: 63 61 74 65 67 6f 72 69 65 73 2e 0a 2a 2f 0a 73  categories..*/.s
3620: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3630: 67 6e 65 64 20 63 68 61 72 20 63 68 61 72 43 6c  gned char charCl
3640: 61 73 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ass[] = {.      
3650: 20 20 2f 2a 20 78 30 20 78 31 20 78 32 20 78 33    /* x0 x1 x2 x3
3660: 20 78 34 20 78 35 20 78 36 20 78 37 20 78 38 20   x4 x5 x6 x7 x8 
3670: 78 39 20 78 41 20 78 42 20 78 43 20 78 44 20 78  x9 xA xB xC xD x
3680: 45 20 78 46 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f  E xF */./* 0x */
3690: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
36a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
36b0: 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20   1, 0, 1, 0, 0, 
36c0: 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c  0,./* 1x */   0,
36d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
36e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
36f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a  , 0, 0, 0, 0,./*
3700: 20 32 78 20 2a 2f 20 20 20 31 2c 20 30 2c 20 30   2x */   1, 0, 0
3710: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3720: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3730: 33 2c 20 34 2c 20 30 2c 0a 2f 2a 20 33 78 20 2a  3, 4, 0,./* 3x *
3740: 2f 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20  /   2, 2, 2, 2, 
3750: 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32  2, 2, 2, 2, 2, 2
3760: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3770: 20 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30   0,./* 4x */   0
3780: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3790: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
37a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f  0, 0, 0, 0, 0,./
37b0: 2a 20 35 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20  * 5x */   0, 0, 
37c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
37d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
37e0: 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 36 78 20   0, 0, 0,./* 6x 
37f0: 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  */   0, 0, 0, 0,
3800: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3810: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3820: 2c 20 30 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20  , 0,./* 7x */   
3830: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3850: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
3860: 2f 2a 20 38 78 20 2a 2f 20 20 20 30 2c 20 30 2c  /* 8x */   0, 0,
3870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3890: 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 39 78  , 0, 0, 0,./* 9x
38a0: 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   */   0, 0, 0, 0
38b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
38c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
38d0: 30 2c 20 30 2c 0a 2f 2a 20 41 78 20 2a 2f 20 20  0, 0,./* Ax */  
38e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
38f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3900: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3910: 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30 2c 20 30  ./* Bx */   0, 0
3920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3930: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3940: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 43  0, 0, 0, 0,./* C
3950: 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20  x */   0, 0, 0, 
3960: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3980: 20 30 2c 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20   0, 0,./* Dx */ 
3990: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
39a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
39b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
39c0: 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20  ,./* Ex */   0, 
39d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
39e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
39f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20   0, 0, 0, 0,./* 
3a00: 46 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c  Fx */   0, 0, 0,
3a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3a20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3a30: 2c 20 30 2c 20 30 2c 0a 7d 3b 0a 23 64 65 66 69  , 0, 0,.};.#defi
3a40: 6e 65 20 4e 5f 43 48 41 52 5f 43 4c 41 53 53 20  ne N_CHAR_CLASS 
3a50: 35 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  5../*.** Given t
3a60: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
3a70: 20 6e 75 6d 62 65 72 20 28 30 20 74 68 72 75 20   number (0 thru 
3a80: 35 29 2c 20 74 68 69 73 20 61 72 72 61 79 20 66  5), this array f
3a90: 69 67 75 72 65 73 0a 2a 2a 20 74 68 65 20 6e 65  igures.** the ne
3aa0: 77 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 67  w state number g
3ab0: 69 76 65 6e 20 74 68 65 20 63 68 61 72 61 63 74  iven the charact
3ac0: 65 72 20 63 6c 61 73 73 2e 0a 2a 2f 0a 73 74 61  er class..*/.sta
3ad0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3ae0: 65 64 20 63 68 61 72 20 73 74 61 74 65 4d 61 63  ed char stateMac
3af0: 68 69 6e 65 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 54  hine[] = {. /* T
3b00: 65 78 74 2c 20 20 53 70 61 63 65 2c 20 44 69 67  ext,  Space, Dig
3b10: 69 74 2c 20 22 2d 22 2c 20 22 2e 22 20 2a 2f 0a  it, "-", "." */.
3b20: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 30 2c        1,      0,
3b30: 20 20 20 20 32 2c 20 20 20 20 33 2c 20 20 20 31      2,    3,   1
3b40: 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20  ,      /* State 
3b50: 30 3a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  0: Beginning of 
3b60: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 31 2c  word */.      1,
3b70: 20 20 20 20 20 20 30 2c 20 20 20 20 32 2c 20 20        0,    2,  
3b80: 20 20 31 2c 20 20 20 31 2c 20 20 20 20 20 20 2f    1,   1,      /
3b90: 2a 20 53 74 61 74 65 20 31 3a 20 41 72 62 69 74  * State 1: Arbit
3ba0: 72 61 72 79 20 74 65 78 74 20 2a 2f 0a 20 20 20  rary text */.   
3bb0: 20 20 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20     1,      0,   
3bc0: 20 32 2c 20 20 20 20 31 2c 20 20 20 34 2c 20 20   2,    1,   4,  
3bd0: 20 20 20 20 2f 2a 20 53 74 61 74 65 20 32 3a 20      /* State 2: 
3be0: 49 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  Integer */.     
3bf0: 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20 33   1,      0,    3
3c00: 2c 20 20 20 20 31 2c 20 20 20 35 2c 20 20 20 20  ,    1,   5,    
3c10: 20 20 2f 2a 20 53 74 61 74 65 20 33 3a 20 4e 65    /* State 3: Ne
3c20: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 2a  gative integer *
3c30: 2f 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20 20  /.      1,      
3c40: 30 2c 20 20 20 20 34 2c 20 20 20 20 31 2c 20 20  0,    4,    1,  
3c50: 20 31 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74   1,      /* Stat
3c60: 65 20 34 3a 20 52 65 61 6c 20 6e 75 6d 62 65 72  e 4: Real number
3c70: 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20 20   */.      1,    
3c80: 20 20 30 2c 20 20 20 20 35 2c 20 20 20 20 31 2c    0,    5,    1,
3c90: 20 20 20 31 2c 20 20 20 20 20 20 2f 2a 20 53 74     1,      /* St
3ca0: 61 74 65 20 35 3a 20 4e 65 67 61 74 69 76 65 20  ate 5: Negative 
3cb0: 72 65 61 6c 20 6e 75 6d 20 2a 2f 0a 7d 3b 0a 0a  real num */.};..
3cc0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
3cd0: 64 6f 65 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  does a compariso
3ce0: 6e 20 6f 66 20 74 77 6f 20 73 74 72 69 6e 67 73  n of two strings
3cf0: 2e 20 20 43 61 73 65 20 69 73 20 75 73 65 64 20  .  Case is used 
3d00: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 75 73 65 43 61  only.** if useCa
3d10: 73 65 21 3d 30 2e 20 20 4e 75 6d 62 65 72 73 20  se!=0.  Numbers 
3d20: 63 6f 6d 70 61 72 65 20 69 6e 20 6e 75 6d 65 72  compare in numer
3d30: 69 63 61 6c 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ical order..*/.s
3d40: 74 61 74 69 63 20 69 6e 74 20 70 72 69 76 61 74  tatic int privat
3d50: 65 53 74 72 43 6d 70 28 63 6f 6e 73 74 20 63 68  eStrCmp(const ch
3d60: 61 72 20 2a 61 74 65 78 74 2c 20 63 6f 6e 73 74  ar *atext, const
3d70: 20 63 68 61 72 20 2a 62 74 65 78 74 2c 20 69 6e   char *btext, in
3d80: 74 20 75 73 65 43 61 73 65 29 7b 0a 20 20 72 65  t useCase){.  re
3d90: 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20  gister unsigned 
3da0: 63 68 61 72 20 2a 61 2c 20 2a 62 2c 20 2a 6d 61  char *a, *b, *ma
3db0: 70 2c 20 63 61 2c 20 63 62 3b 0a 20 20 69 6e 74  p, ca, cb;.  int
3dc0: 20 72 65 73 75 6c 74 3b 0a 20 20 72 65 67 69 73   result;.  regis
3dd0: 74 65 72 20 69 6e 74 20 63 63 6c 61 73 73 20 3d  ter int cclass =
3de0: 20 30 3b 0a 0a 20 20 61 20 3d 20 28 75 6e 73 69   0;..  a = (unsi
3df0: 67 6e 65 64 20 63 68 61 72 20 2a 29 61 74 65 78  gned char *)atex
3e00: 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e  t;.  b = (unsign
3e10: 65 64 20 63 68 61 72 20 2a 29 62 74 65 78 74 3b  ed char *)btext;
3e20: 0a 20 20 69 66 28 20 75 73 65 43 61 73 65 20 29  .  if( useCase )
3e30: 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  {.    do{.      
3e40: 69 66 28 20 28 63 61 3d 20 2a 61 2b 2b 29 21 3d  if( (ca= *a++)!=
3e50: 28 63 62 3d 20 2a 62 2b 2b 29 20 29 20 62 72 65  (cb= *b++) ) bre
3e60: 61 6b 3b 0a 20 20 20 20 20 20 63 63 6c 61 73 73  ak;.      cclass
3e70: 20 3d 20 73 74 61 74 65 4d 61 63 68 69 6e 65 5b   = stateMachine[
3e80: 63 63 6c 61 73 73 2a 4e 5f 43 48 41 52 5f 43 4c  cclass*N_CHAR_CL
3e90: 41 53 53 20 2b 20 63 68 61 72 43 6c 61 73 73 5b  ASS + charClass[
3ea0: 63 61 5d 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ca]];.    }while
3eb0: 28 20 63 61 21 3d 30 20 29 3b 0a 20 20 7d 65 6c  ( ca!=0 );.  }el
3ec0: 73 65 7b 0a 20 20 20 20 6d 61 70 20 3d 20 55 70  se{.    map = Up
3ed0: 70 65 72 54 6f 4c 6f 77 65 72 3b 0a 20 20 20 20  perToLower;.    
3ee0: 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 28 63  do{.      if( (c
3ef0: 61 3d 6d 61 70 5b 2a 61 2b 2b 5d 29 21 3d 28 63  a=map[*a++])!=(c
3f00: 62 3d 6d 61 70 5b 2a 62 2b 2b 5d 29 20 29 20 62  b=map[*b++]) ) b
3f10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 63 6c 61  reak;.      ccla
3f20: 73 73 20 3d 20 73 74 61 74 65 4d 61 63 68 69 6e  ss = stateMachin
3f30: 65 5b 63 63 6c 61 73 73 2a 4e 5f 43 48 41 52 5f  e[cclass*N_CHAR_
3f40: 43 4c 41 53 53 20 2b 20 63 68 61 72 43 6c 61 73  CLASS + charClas
3f50: 73 5b 63 61 5d 5d 3b 0a 20 20 20 20 7d 77 68 69  s[ca]];.    }whi
3f60: 6c 65 28 20 63 61 21 3d 30 20 29 3b 0a 20 20 7d  le( ca!=0 );.  }
3f70: 0a 20 20 73 77 69 74 63 68 28 20 63 63 6c 61 73  .  switch( cclas
3f80: 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  s ){.    case 0:
3f90: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
3fa0: 20 20 20 20 20 69 66 28 20 69 73 64 69 67 69 74       if( isdigit
3fb0: 28 63 61 29 20 26 26 20 69 73 64 69 67 69 74 28  (ca) && isdigit(
3fc0: 63 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  cb) ){.        c
3fd0: 63 6c 61 73 73 20 3d 20 32 3b 0a 20 20 20 20 20  class = 2;.     
3fe0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3ff0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4000: 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
4010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77  ;.    }.  }.  sw
4020: 69 74 63 68 28 20 63 63 6c 61 73 73 20 29 7b 0a  itch( cclass ){.
4030: 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
4040: 63 61 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20  case 3: {.      
4050: 69 66 28 20 69 73 64 69 67 69 74 28 63 61 29 20  if( isdigit(ca) 
4060: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
4070: 73 64 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20  sdigit(cb) ){.  
4080: 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 6e 74          int acnt
4090: 2c 20 62 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  , bcnt;.        
40a0: 20 20 61 63 6e 74 20 3d 20 62 63 6e 74 20 3d 20    acnt = bcnt = 
40b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
40c0: 6c 65 28 20 69 73 64 69 67 69 74 28 2a 61 2b 2b  le( isdigit(*a++
40d0: 29 20 29 20 61 63 6e 74 2b 2b 3b 0a 20 20 20 20  ) ) acnt++;.    
40e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
40f0: 69 67 69 74 28 2a 62 2b 2b 29 20 29 20 62 63 6e  igit(*b++) ) bcn
4100: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t++;.          r
4110: 65 73 75 6c 74 20 3d 20 61 63 6e 74 20 2d 20 62  esult = acnt - b
4120: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  cnt;.          i
4130: 66 28 20 72 65 73 75 6c 74 3d 3d 30 20 29 20 72  f( result==0 ) r
4140: 65 73 75 6c 74 20 3d 20 63 61 2d 63 62 3b 0a 20  esult = ca-cb;. 
4150: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4160: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4170: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
4180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
4190: 64 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20 20  digit(cb) ){.   
41a0: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31       result = -1
41b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
41c0: 28 20 63 61 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  ( ca=='.' ){.   
41d0: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 31 3b       result = 1;
41e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
41f0: 20 63 62 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20   cb=='.' ){.    
4200: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b      result = -1;
4210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4220: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 63        result = c
4230: 61 20 2d 20 63 62 3b 0a 20 20 20 20 20 20 20 20  a - cb;.        
4240: 63 63 6c 61 73 73 20 3d 20 32 3b 0a 20 20 20 20  cclass = 2;.    
4250: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 63    }.      if( cc
4260: 6c 61 73 73 3d 3d 33 20 29 20 72 65 73 75 6c 74  lass==3 ) result
4270: 20 3d 20 2d 72 65 73 75 6c 74 3b 0a 20 20 20 20   = -result;.    
4280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4290: 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
42a0: 61 73 65 20 31 3a 0a 20 20 20 20 63 61 73 65 20  ase 1:.    case 
42b0: 34 3a 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  4: {.      resul
42c0: 74 20 3d 20 63 61 20 2d 20 63 62 3b 0a 20 20 20  t = ca - cb;.   
42d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42e0: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
42f0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 63 62 20      result = cb 
4300: 2d 20 63 61 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d  - ca;.    };.  }
4310: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
4320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
4330: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 75  comparison of pu
4340: 72 65 20 6e 75 6d 65 72 69 63 73 2e 20 20 49 66  re numerics.  If
4350: 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 69   either string i
4360: 73 20 6e 6f 74 20 61 20 70 75 72 65 0a 2a 2a 20  s not a pure.** 
4370: 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 72 65  numeric, then re
4380: 74 75 72 6e 20 30 2e 20 20 4f 74 68 65 72 77 69  turn 0.  Otherwi
4390: 73 65 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  se return 1 and 
43a0: 73 65 74 20 2a 70 52 65 73 75 6c 74 20 74 6f 20  set *pResult to 
43b0: 62 65 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  be.** negative, 
43c0: 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
43d0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74   if the first st
43e0: 72 69 6e 67 20 61 72 65 20 6e 75 6d 65 72 69 61  ring are numeria
43f0: 6c 6c 79 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a  lly less than.**
4400: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
4410: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
4420: 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  econd..*/.static
4430: 20 69 6e 74 20 70 72 69 76 61 74 65 43 6f 6d 70   int privateComp
4440: 61 72 65 4e 75 6d 28 63 6f 6e 73 74 20 63 68 61  areNum(const cha
4450: 72 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72  r *a, const char
4460: 20 2a 62 2c 20 69 6e 74 20 2a 70 52 65 73 75 6c   *b, int *pResul
4470: 74 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 64 50  t){.  char *endP
4480: 74 72 3b 0a 20 20 64 6f 75 62 6c 65 20 72 41 2c  tr;.  double rA,
4490: 20 72 42 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d   rB;.  int isNum
44a0: 41 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69 66 28  A, isNumB;.  if(
44b0: 20 69 73 64 69 67 69 74 28 2a 61 29 20 7c 7c 20   isdigit(*a) || 
44c0: 28 28 2a 61 3d 3d 27 2d 27 20 7c 7c 20 2a 61 3d  ((*a=='-' || *a=
44d0: 3d 27 2b 27 29 20 26 26 20 69 73 64 69 67 69 74  ='+') && isdigit
44e0: 28 61 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72  (a[1])) ){.    r
44f0: 41 20 3d 20 73 74 72 74 6f 64 28 61 2c 20 26 65  A = strtod(a, &e
4500: 6e 64 50 74 72 29 3b 0a 20 20 20 20 69 73 4e 75  ndPtr);.    isNu
4510: 6d 41 20 3d 20 2a 65 6e 64 50 74 72 3d 3d 30 3b  mA = *endPtr==0;
4520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
4530: 4e 75 6d 41 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NumA = 0;.  }.  
4540: 69 66 28 20 69 73 64 69 67 69 74 28 2a 62 29 20  if( isdigit(*b) 
4550: 7c 7c 20 28 28 2a 62 3d 3d 27 2d 27 20 7c 7c 20  || ((*b=='-' || 
4560: 2a 62 3d 3d 27 2b 27 29 20 26 26 20 69 73 64 69  *b=='+') && isdi
4570: 67 69 74 28 62 5b 31 5d 29 29 20 29 7b 0a 20 20  git(b[1])) ){.  
4580: 20 20 72 42 20 3d 20 73 74 72 74 6f 64 28 62 2c    rB = strtod(b,
4590: 20 26 65 6e 64 50 74 72 29 3b 0a 20 20 20 20 69   &endPtr);.    i
45a0: 73 4e 75 6d 42 20 3d 20 2a 65 6e 64 50 74 72 3d  sNumB = *endPtr=
45b0: 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
45c0: 20 69 73 4e 75 6d 42 20 3d 20 30 3b 0a 20 20 7d   isNumB = 0;.  }
45d0: 0a 20 20 69 66 28 20 69 73 4e 75 6d 42 3d 3d 30  .  if( isNumB==0
45e0: 20 26 26 20 69 73 4e 75 6d 41 3d 3d 30 20 29 20   && isNumA==0 ) 
45f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4600: 69 73 4e 75 6d 41 21 3d 69 73 4e 75 6d 42 20 29  isNumA!=isNumB )
4610: 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d  {.    *pResult =
4620: 20 20 69 73 4e 75 6d 41 20 2d 20 69 73 4e 75 6d    isNumA - isNum
4630: 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  B;.  }else if( r
4640: 41 3c 72 42 20 29 7b 0a 20 20 20 20 2a 70 52 65  A<rB ){.    *pRe
4650: 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  sult = -1;.  }el
4660: 73 65 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a  se if( rA>rB ){.
4670: 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 31      *pResult = 1
4680: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
4690: 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d  pResult = 0;.  }
46a0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
46b0: 2f 2a 20 54 68 69 73 20 63 6f 6d 70 61 72 69 73  /* This comparis
46c0: 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 77 68  on routine is wh
46d0: 61 74 20 77 65 20 75 73 65 20 66 6f 72 20 63 6f  at we use for co
46e0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
46f0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 6e 20 53 51 4c  ons.** in an SQL
4700: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 28 45   expression.  (E
4710: 78 3a 20 20 6e 61 6d 65 3c 27 48 65 6c 6c 6f 27  x:  name<'Hello'
4720: 20 6f 72 20 76 61 6c 75 65 3c 35 29 2e 20 20 43   or value<5).  C
4730: 6f 6d 70 61 72 65 20 74 77 6f 0a 2a 2a 20 73 74  ompare two.** st
4740: 72 69 6e 67 73 2e 20 20 55 73 65 20 63 61 73 65  rings.  Use case
4750: 20 6f 6e 6c 79 20 61 73 20 61 20 74 69 65 2d 62   only as a tie-b
4760: 72 65 61 6b 65 72 2e 20 20 4e 75 6d 62 65 72 73  reaker.  Numbers
4770: 20 63 6f 6d 70 61 72 65 20 69 6e 0a 2a 2a 20 6e   compare in.** n
4780: 75 6d 65 72 69 63 61 6c 20 6f 72 64 65 72 2e 0a  umerical order..
4790: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6d  */.int sqliteCom
47a0: 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pare(const char 
47b0: 2a 61 74 65 78 74 2c 20 63 6f 6e 73 74 20 63 68  *atext, const ch
47c0: 61 72 20 2a 62 74 65 78 74 29 7b 0a 20 20 69 6e  ar *btext){.  in
47d0: 74 20 72 65 73 75 6c 74 3b 0a 20 20 69 66 28 20  t result;.  if( 
47e0: 21 70 72 69 76 61 74 65 43 6f 6d 70 61 72 65 4e  !privateCompareN
47f0: 75 6d 28 61 74 65 78 74 2c 20 62 74 65 78 74 2c  um(atext, btext,
4800: 20 26 72 65 73 75 6c 74 29 20 7c 7c 20 72 65 73   &result) || res
4810: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ult==0 ){.    re
4820: 73 75 6c 74 20 3d 20 70 72 69 76 61 74 65 53 74  sult = privateSt
4830: 72 43 6d 70 28 61 74 65 78 74 2c 20 62 74 65 78  rCmp(atext, btex
4840: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
4850: 65 73 75 6c 74 3d 3d 30 20 29 20 72 65 73 75 6c  esult==0 ) resul
4860: 74 20 3d 20 70 72 69 76 61 74 65 53 74 72 43 6d  t = privateStrCm
4870: 70 28 61 74 65 78 74 2c 20 62 74 65 78 74 2c 20  p(atext, btext, 
4880: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
4890: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   result;.}../*.*
48a0: 2a 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65  * If you compile
48b0: 20 6a 75 73 74 20 74 68 69 73 20 6f 6e 65 20 66   just this one f
48c0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 2d 44 54  ile with the -DT
48d0: 45 53 54 5f 43 4f 4d 50 41 52 45 3d 31 20 6f 70  EST_COMPARE=1 op
48e0: 74 69 6f 6e 2c 0a 2a 2a 20 69 74 20 67 65 6e 65  tion,.** it gene
48f0: 72 61 74 65 73 20 61 20 70 72 6f 67 72 61 6d 20  rates a program 
4900: 74 6f 20 74 65 73 74 20 74 68 65 20 63 6f 6d 70  to test the comp
4910: 61 72 69 73 6f 6e 73 20 72 6f 75 74 69 6e 65 73  arisons routines
4920: 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 54 45  .  .*/.#ifdef TE
4930: 53 54 5f 43 4f 4d 50 41 52 45 0a 23 69 6e 63 6c  ST_COMPARE.#incl
4940: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
4950: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
4960: 3e 0a 69 6e 74 20 73 6f 72 74 43 6d 70 28 63 6f  >.int sortCmp(co
4970: 6e 73 74 20 63 68 61 72 20 2a 2a 61 2c 20 63 6f  nst char **a, co
4980: 6e 73 74 20 63 68 61 72 20 2a 2a 62 29 7b 0a 20  nst char **b){. 
4990: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 43 6f   return sqliteCo
49a0: 6d 70 61 72 65 28 2a 61 2c 20 2a 62 29 3b 0a 7d  mpare(*a, *b);.}
49b0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
49c0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
49d0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
49e0: 20 6e 2c 20 63 6e 74 3b 0a 20 20 73 74 61 74 69   n, cnt;.  stati
49f0: 63 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  c char *azStr[] 
4a00: 3d 20 7b 0a 20 20 20 20 20 22 61 62 63 22 2c 20  = {.     "abc", 
4a10: 22 61 42 63 22 2c 20 22 61 62 63 64 22 2c 20 22  "aBc", "abcd", "
4a20: 61 42 63 64 22 2c 20 0a 20 20 20 20 20 22 31 32  aBcd", .     "12
4a30: 33 22 2c 20 22 31 32 34 22 2c 20 22 31 32 33 34  3", "124", "1234
4a40: 22 2c 20 22 2d 31 32 33 22 2c 20 22 2d 31 32 34  ", "-123", "-124
4a50: 22 2c 20 22 2d 31 32 33 34 22 2c 20 22 2b 31 32  ", "-1234", "+12
4a60: 34 22 2c 0a 20 20 20 20 20 22 31 32 33 2e 34 35  4",.     "123.45
4a70: 22 2c 20 22 31 32 33 2e 34 35 36 22 2c 20 22 31  ", "123.456", "1
4a80: 32 33 2e 34 36 22 2c 20 22 2d 31 32 33 2e 34 35  23.46", "-123.45
4a90: 22 2c 20 22 2d 31 32 33 2e 34 36 22 2c 20 22 2d  ", "-123.46", "-
4aa0: 31 32 33 2e 34 35 36 22 2c 20 0a 20 20 20 20 20  123.456", .     
4ab0: 22 78 39 22 2c 20 22 78 31 30 22 2c 20 22 78 2d  "x9", "x10", "x-
4ac0: 39 22 2c 20 22 78 2d 31 30 22 2c 20 22 58 39 22  9", "x-10", "X9"
4ad0: 2c 20 22 58 31 30 22 2c 0a 20 20 20 20 20 22 31  , "X10",.     "1
4ae0: 2e 32 33 34 65 2b 30 32 22 2c 20 22 2b 31 32 33  .234e+02", "+123
4af0: 22 2c 20 22 31 2e 32 33 45 32 22 2c 20 22 31 2e  ", "1.23E2", "1.
4b00: 32 33 34 35 65 2b 32 22 2c 20 22 2d 31 2e 32 33  2345e+2", "-1.23
4b10: 34 35 65 32 22 2c 20 22 2b 77 22 0a 20 20 7d 3b  45e2", "+w".  };
4b20: 0a 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 61 7a  .  n = sizeof(az
4b30: 53 74 72 29 2f 73 69 7a 65 6f 66 28 61 7a 53 74  Str)/sizeof(azSt
4b40: 72 5b 30 5d 29 3b 0a 20 20 71 73 6f 72 74 28 61  r[0]);.  qsort(a
4b50: 7a 53 74 72 2c 20 6e 2c 20 73 69 7a 65 6f 66 28  zStr, n, sizeof(
4b60: 61 7a 53 74 72 5b 30 5d 29 2c 20 73 6f 72 74 43  azStr[0]), sortC
4b70: 6d 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mp);.  for(i=0; 
4b80: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  i<n; i++){.    p
4b90: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 7a  rintf("%s\n", az
4ba0: 53 74 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  Str[i]);.  }.  p
4bb0: 72 69 6e 74 66 28 22 53 61 6e 69 74 79 31 2e 2e  rintf("Sanity1..
4bc0: 2e 22 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .");.  fflush(st
4bd0: 64 6f 75 74 29 3b 0a 20 20 63 6e 74 20 3d 20 30  dout);.  cnt = 0
4be0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
4bf0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  -1; i++){.    ch
4c00: 61 72 20 2a 61 20 3d 20 61 7a 53 74 72 5b 69 5d  ar *a = azStr[i]
4c10: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
4c20: 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
4c30: 20 20 63 68 61 72 20 2a 62 20 3d 20 61 7a 53 74    char *b = azSt
4c40: 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[j];.      if( 
4c50: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 2c  sqliteCompare(a,
4c60: 62 29 20 21 3d 20 2d 73 71 6c 69 74 65 43 6f 6d  b) != -sqliteCom
4c70: 70 61 72 65 28 62 2c 61 29 20 29 7b 0a 20 20 20  pare(b,a) ){.   
4c80: 20 20 20 20 20 70 72 69 6e 74 66 28 22 46 61 69       printf("Fai
4c90: 6c 65 64 21 20 20 5c 22 25 73 5c 22 20 76 73 20  led!  \"%s\" vs 
4ca0: 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 2c 20 62 29  \"%s\"\n", a, b)
4cb0: 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a 20  ;.        i = j 
4cc0: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
4cd0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
4ce0: 20 20 7d 0a 20 20 69 66 28 20 69 3c 6e 20 29 7b    }.  if( i<n ){
4cf0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 4f 4b  .    printf(" OK
4d00: 20 28 25 64 29 5c 6e 22 2c 20 63 6e 74 29 3b 0a   (%d)\n", cnt);.
4d10: 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 53 61    }.  printf("Sa
4d20: 6e 69 74 79 32 2e 2e 2e 22 29 3b 0a 20 20 66 66  nity2...");.  ff
4d30: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
4d40: 63 6e 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  cnt = 0;.  for(i
4d50: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
4d60: 20 20 20 63 68 61 72 20 2a 61 20 3d 20 61 7a 53     char *a = azS
4d70: 74 72 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  tr[i];.    for(j
4d80: 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<n; j++){. 
4d90: 20 20 20 20 20 63 68 61 72 20 2a 62 20 3d 20 61       char *b = a
4da0: 7a 53 74 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 66  zStr[j];.      f
4db0: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b  or(k=0; k<n; k++
4dc0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4dd0: 2a 63 20 3d 20 61 7a 53 74 72 5b 6b 5d 3b 0a 20  *c = azStr[k];. 
4de0: 20 20 20 20 20 20 20 69 6e 74 20 78 31 2c 20 78         int x1, x
4df0: 32 2c 20 78 33 2c 20 73 75 63 63 65 73 73 3b 0a  2, x3, success;.
4e00: 20 20 20 20 20 20 20 20 78 31 20 3d 20 73 71 6c          x1 = sql
4e10: 69 74 65 43 6f 6d 70 61 72 65 28 61 2c 62 29 3b  iteCompare(a,b);
4e20: 0a 20 20 20 20 20 20 20 20 78 32 20 3d 20 73 71  .        x2 = sq
4e30: 6c 69 74 65 43 6f 6d 70 61 72 65 28 62 2c 63 29  liteCompare(b,c)
4e40: 3b 0a 20 20 20 20 20 20 20 20 78 33 20 3d 20 73  ;.        x3 = s
4e50: 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 2c 63  qliteCompare(a,c
4e60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
4e70: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1==0 ){.        
4e80: 20 20 73 75 63 63 65 73 73 20 3d 20 78 32 3d 3d    success = x2==
4e90: 78 33 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x3;.        }els
4ea0: 65 20 69 66 28 20 78 31 3c 30 20 29 7b 0a 20 20  e if( x1<0 ){.  
4eb0: 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 20          success 
4ec0: 3d 20 28 78 32 3c 3d 30 20 26 26 20 78 33 3c 3d  = (x2<=0 && x3<=
4ed0: 30 29 20 7c 7c 20 78 32 3e 30 3b 0a 20 20 20 20  0) || x2>0;.    
4ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ef0: 20 20 20 20 20 73 75 63 63 65 73 73 20 3d 20 28       success = (
4f00: 78 32 3e 3d 30 20 26 26 20 78 33 3e 3d 30 29 20  x2>=0 && x3>=0) 
4f10: 7c 7c 20 78 32 3c 30 3b 0a 20 20 20 20 20 20 20  || x2<0;.       
4f20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
4f30: 73 75 63 63 65 73 73 20 29 7b 0a 20 20 20 20 20  success ){.     
4f40: 20 20 20 20 20 70 72 69 6e 74 66 28 22 46 61 69       printf("Fai
4f50: 6c 65 64 21 20 20 5c 22 25 73 5c 22 20 76 73 20  led!  \"%s\" vs 
4f60: 5c 22 25 73 5c 22 20 76 73 20 5c 22 25 73 5c 22  \"%s\" vs \"%s\"
4f70: 5c 6e 22 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 20  \n", a, b, c);. 
4f80: 20 20 20 20 20 20 20 20 20 69 20 3d 20 6a 20 3d           i = j =
4f90: 20 6b 20 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20   k = n+1;.      
4fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6e 74 2b    }.        cnt+
4fb0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
4fc0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 6e 2b 31  .  }.  if( i<n+1
4fd0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4fe0: 20 4f 4b 20 28 25 64 29 5c 6e 22 2c 20 63 6e 74   OK (%d)\n", cnt
4ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5000: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
5010: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5020: 69 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  is used for sort
5030: 69 6e 67 2e 20 20 45 61 63 68 20 6b 65 79 20 69  ing.  Each key i
5040: 73 20 61 20 6c 69 73 74 20 6f 66 20 6f 6e 65 20  s a list of one 
5050: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c 6c 2d  or more.** null-
5060: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
5070: 67 73 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  gs.  The list is
5080: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 74   terminated by t
5090: 77 6f 20 6e 75 6c 6c 73 20 69 6e 0a 2a 2a 20 61  wo nulls in.** a
50a0: 20 72 6f 77 2e 20 20 46 6f 72 20 65 78 61 6d 70   row.  For examp
50b0: 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  le, the followin
50c0: 67 20 74 65 78 74 20 69 73 20 6b 65 79 20 77 69  g text is key wi
50d0: 74 68 20 74 68 72 65 65 20 73 74 72 69 6e 67 73  th three strings
50e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
50f0: 20 20 20 2b 6f 6e 65 5c 30 30 30 2d 74 77 6f 5c     +one\000-two\
5100: 30 30 30 2b 74 68 72 65 65 5c 30 30 30 5c 30 30  000+three\000\00
5110: 30 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 61 72 67  0.**.** Both arg
5120: 75 6d 65 6e 74 73 20 77 69 6c 6c 20 68 61 76 65  uments will have
5130: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
5140: 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 20 54 68   of strings.  Th
5150: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
5160: 74 75 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20  turns negative, 
5170: 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
5180: 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  e if the first a
5190: 72 67 75 6d 65 6e 74 20 69 73 20 6c 65 73 73 0a  rgument is less.
51a0: 2a 2a 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ** than, equal t
51b0: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
51c0: 61 6e 20 74 68 65 20 66 69 72 73 74 2e 20 20 28  an the first.  (
51d0: 52 65 73 75 6c 74 20 69 73 20 61 2d 62 29 2e 0a  Result is a-b)..
51e0: 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 73 74 72 69  **.** Every stri
51f0: 6e 67 20 62 65 67 69 6e 73 20 77 69 74 68 20 65  ng begins with e
5200: 69 74 68 65 72 20 61 20 22 2b 22 20 6f 72 20 22  ither a "+" or "
5210: 2d 22 20 63 68 61 72 61 63 74 65 72 2e 20 20 49  -" character.  I
5220: 66 20 74 68 65 0a 2a 2a 20 63 68 61 72 61 63 74  f the.** charact
5230: 65 72 20 69 73 20 22 2d 22 20 74 68 65 6e 20 74  er is "-" then t
5240: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
5250: 69 73 20 6e 65 67 61 74 65 64 2e 20 20 54 68 69  is negated.  Thi
5260: 73 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20  s is done.** to 
5270: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 73 6f 72 74  implement a sort
5280: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
5290: 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rder..*/.int sql
52a0: 69 74 65 53 6f 72 74 43 6f 6d 70 61 72 65 28 63  iteSortCompare(c
52b0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 2c 20 63 6f  onst char *a, co
52c0: 6e 73 74 20 63 68 61 72 20 2a 62 29 7b 0a 20 20  nst char *b){.  
52d0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 72  int len;.  int r
52e0: 65 73 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  es = 0;..  while
52f0: 28 20 72 65 73 3d 3d 30 20 26 26 20 2a 61 20 26  ( res==0 && *a &
5300: 26 20 2a 62 20 29 7b 0a 20 20 20 20 72 65 73 20  & *b ){.    res 
5310: 3d 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28  = sqliteCompare(
5320: 26 61 5b 31 5d 2c 20 26 62 5b 31 5d 29 3b 0a 20  &a[1], &b[1]);. 
5330: 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
5340: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  .      len = str
5350: 6c 65 6e 28 61 29 20 2b 20 31 3b 0a 20 20 20 20  len(a) + 1;.    
5360: 20 20 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    a += len;.    
5370: 20 20 62 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    b += len;.    
5380: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 2a 61 3d 3d  }.  }.  if( *a==
5390: 27 2d 27 20 29 20 72 65 73 20 3d 20 2d 72 65 73  '-' ) res = -res
53a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
53b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
53c0: 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20 58 20 69 73  _UTF8./*.** X is
53d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
53e0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
53f0: 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  a UTF-8 characte
5400: 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a  r.  Increment.**
5410: 20 58 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f   X so that it po
5420: 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74  ints to the next
5430: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69   character.  Thi
5440: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67  s only works rig
5450: 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74  ht.** if X point
5460: 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  s to a well-form
5470: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
5480: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  .*/.#define sqli
5490: 74 65 4e 65 78 74 43 68 61 72 28 58 29 20 20 77  teNextChar(X)  w
54a0: 68 69 6c 65 28 20 28 30 78 63 30 26 2a 2b 2b 28  hile( (0xc0&*++(
54b0: 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64  X))==0x80 ){}.#d
54c0: 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72  efine sqliteChar
54d0: 56 61 6c 28 58 29 20 20 20 73 71 6c 69 74 65 5f  Val(X)   sqlite_
54e0: 75 74 66 38 5f 74 6f 5f 69 6e 74 28 58 29 0a 0a  utf8_to_int(X)..
54f0: 23 65 6c 73 65 20 2f 2a 20 21 64 65 66 69 6e 65  #else /* !define
5500: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 20 2a  d(SQLITE_UTF8) *
5510: 2f 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 69 73 6f 38  /./*.** For iso8
5520: 38 35 39 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  859 encoding, th
5530: 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72  e next character
5540: 20 69 73 20 6a 75 73 74 20 74 68 65 20 6e 65 78   is just the nex
5550: 74 20 62 79 74 65 2e 0a 2a 2f 0a 23 64 65 66 69  t byte..*/.#defi
5560: 6e 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61  ne sqliteNextCha
5570: 72 28 58 29 20 20 28 2b 2b 28 58 29 29 3b 0a 23  r(X)  (++(X));.#
5580: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61  define sqliteCha
5590: 72 56 61 6c 28 58 29 20 20 20 28 28 69 6e 74 29  rVal(X)   ((int)
55a0: 2a 28 58 29 29 0a 0a 23 65 6e 64 69 66 20 2f 2a  *(X))..#endif /*
55b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
55c0: 55 54 46 38 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  UTF8) */...#ifde
55d0: 66 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 2f 2a  f SQLITE_UTF8./*
55e0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
55f0: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20  UTF-8 character 
5600: 74 6f 20 77 68 69 63 68 20 7a 20 70 6f 69 6e 74  to which z point
5610: 73 20 69 6e 74 6f 20 61 20 33 31 2d 62 69 74 0a  s into a 31-bit.
5620: 2a 2a 20 55 43 53 20 63 68 61 72 61 63 74 65 72  ** UCS character
5630: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
5640: 6b 73 20 72 69 67 68 74 20 69 66 20 7a 20 70 6f  ks right if z po
5650: 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66  ints to a well-f
5660: 6f 72 6d 65 64 0a 2a 2a 20 55 54 46 2d 38 20 73  ormed.** UTF-8 s
5670: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
5680: 20 69 6e 74 20 73 71 6c 69 74 65 5f 75 74 66 38   int sqlite_utf8
5690: 5f 74 6f 5f 69 6e 74 28 63 6f 6e 73 74 20 75 6e  _to_int(const un
56a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b  signed char *z){
56b0: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 73 74 61 74  .  int c;.  stat
56c0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 6e 69  ic const int ini
56d0: 74 56 61 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  tVal[] = {.     
56e0: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
56f0: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
5700: 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c  ,   7,   8,   9,
5710: 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20    10,  11,  12, 
5720: 20 31 33 2c 20 20 31 34 2c 0a 20 20 20 20 20 31   13,  14,.     1
5730: 35 2c 20 20 31 36 2c 20 20 31 37 2c 20 20 31 38  5,  16,  17,  18
5740: 2c 20 20 31 39 2c 20 20 32 30 2c 20 20 32 31 2c  ,  19,  20,  21,
5750: 20 20 32 32 2c 20 20 32 33 2c 20 20 32 34 2c 20    22,  23,  24, 
5760: 20 32 35 2c 20 20 32 36 2c 20 20 32 37 2c 20 20   25,  26,  27,  
5770: 32 38 2c 20 20 32 39 2c 0a 20 20 20 20 20 33 30  28,  29,.     30
5780: 2c 20 20 33 31 2c 20 20 33 32 2c 20 20 33 33 2c  ,  31,  32,  33,
5790: 20 20 33 34 2c 20 20 33 35 2c 20 20 33 36 2c 20    34,  35,  36, 
57a0: 20 33 37 2c 20 20 33 38 2c 20 20 33 39 2c 20 20   37,  38,  39,  
57b0: 34 30 2c 20 20 34 31 2c 20 20 34 32 2c 20 20 34  40,  41,  42,  4
57c0: 33 2c 20 20 34 34 2c 0a 20 20 20 20 20 34 35 2c  3,  44,.     45,
57d0: 20 20 34 36 2c 20 20 34 37 2c 20 20 34 38 2c 20    46,  47,  48, 
57e0: 20 34 39 2c 20 20 35 30 2c 20 20 35 31 2c 20 20   49,  50,  51,  
57f0: 35 32 2c 20 20 35 33 2c 20 20 35 34 2c 20 20 35  52,  53,  54,  5
5800: 35 2c 20 20 35 36 2c 20 20 35 37 2c 20 20 35 38  5,  56,  57,  58
5810: 2c 20 20 35 39 2c 0a 20 20 20 20 20 36 30 2c 20  ,  59,.     60, 
5820: 20 36 31 2c 20 20 36 32 2c 20 20 36 33 2c 20 20   61,  62,  63,  
5830: 36 34 2c 20 20 36 35 2c 20 20 36 36 2c 20 20 36  64,  65,  66,  6
5840: 37 2c 20 20 36 38 2c 20 20 36 39 2c 20 20 37 30  7,  68,  69,  70
5850: 2c 20 20 37 31 2c 20 20 37 32 2c 20 20 37 33 2c  ,  71,  72,  73,
5860: 20 20 37 34 2c 0a 20 20 20 20 20 37 35 2c 20 20    74,.     75,  
5870: 37 36 2c 20 20 37 37 2c 20 20 37 38 2c 20 20 37  76,  77,  78,  7
5880: 39 2c 20 20 38 30 2c 20 20 38 31 2c 20 20 38 32  9,  80,  81,  82
5890: 2c 20 20 38 33 2c 20 20 38 34 2c 20 20 38 35 2c  ,  83,  84,  85,
58a0: 20 20 38 36 2c 20 20 38 37 2c 20 20 38 38 2c 20    86,  87,  88, 
58b0: 20 38 39 2c 0a 20 20 20 20 20 39 30 2c 20 20 39   89,.     90,  9
58c0: 31 2c 20 20 39 32 2c 20 20 39 33 2c 20 20 39 34  1,  92,  93,  94
58d0: 2c 20 20 39 35 2c 20 20 39 36 2c 20 20 39 37 2c  ,  95,  96,  97,
58e0: 20 20 39 38 2c 20 20 39 39 2c 20 31 30 30 2c 20    98,  99, 100, 
58f0: 31 30 31 2c 20 31 30 32 2c 20 31 30 33 2c 20 31  101, 102, 103, 1
5900: 30 34 2c 0a 20 20 20 20 31 30 35 2c 20 31 30 36  04,.    105, 106
5910: 2c 20 31 30 37 2c 20 31 30 38 2c 20 31 30 39 2c  , 107, 108, 109,
5920: 20 31 31 30 2c 20 31 31 31 2c 20 31 31 32 2c 20   110, 111, 112, 
5930: 31 31 33 2c 20 31 31 34 2c 20 31 31 35 2c 20 31  113, 114, 115, 1
5940: 31 36 2c 20 31 31 37 2c 20 31 31 38 2c 20 31 31  16, 117, 118, 11
5950: 39 2c 0a 20 20 20 20 31 32 30 2c 20 31 32 31 2c  9,.    120, 121,
5960: 20 31 32 32 2c 20 31 32 33 2c 20 31 32 34 2c 20   122, 123, 124, 
5970: 31 32 35 2c 20 31 32 36 2c 20 31 32 37 2c 20 31  125, 126, 127, 1
5980: 32 38 2c 20 31 32 39 2c 20 31 33 30 2c 20 31 33  28, 129, 130, 13
5990: 31 2c 20 31 33 32 2c 20 31 33 33 2c 20 31 33 34  1, 132, 133, 134
59a0: 2c 0a 20 20 20 20 31 33 35 2c 20 31 33 36 2c 20  ,.    135, 136, 
59b0: 31 33 37 2c 20 31 33 38 2c 20 31 33 39 2c 20 31  137, 138, 139, 1
59c0: 34 30 2c 20 31 34 31 2c 20 31 34 32 2c 20 31 34  40, 141, 142, 14
59d0: 33 2c 20 31 34 34 2c 20 31 34 35 2c 20 31 34 36  3, 144, 145, 146
59e0: 2c 20 31 34 37 2c 20 31 34 38 2c 20 31 34 39 2c  , 147, 148, 149,
59f0: 0a 20 20 20 20 31 35 30 2c 20 31 35 31 2c 20 31  .    150, 151, 1
5a00: 35 32 2c 20 31 35 33 2c 20 31 35 34 2c 20 31 35  52, 153, 154, 15
5a10: 35 2c 20 31 35 36 2c 20 31 35 37 2c 20 31 35 38  5, 156, 157, 158
5a20: 2c 20 31 35 39 2c 20 31 36 30 2c 20 31 36 31 2c  , 159, 160, 161,
5a30: 20 31 36 32 2c 20 31 36 33 2c 20 31 36 34 2c 0a   162, 163, 164,.
5a40: 20 20 20 20 31 36 35 2c 20 31 36 36 2c 20 31 36      165, 166, 16
5a50: 37 2c 20 31 36 38 2c 20 31 36 39 2c 20 31 37 30  7, 168, 169, 170
5a60: 2c 20 31 37 31 2c 20 31 37 32 2c 20 31 37 33 2c  , 171, 172, 173,
5a70: 20 31 37 34 2c 20 31 37 35 2c 20 31 37 36 2c 20   174, 175, 176, 
5a80: 31 37 37 2c 20 31 37 38 2c 20 31 37 39 2c 0a 20  177, 178, 179,. 
5a90: 20 20 20 31 38 30 2c 20 31 38 31 2c 20 31 38 32     180, 181, 182
5aa0: 2c 20 31 38 33 2c 20 31 38 34 2c 20 31 38 35 2c  , 183, 184, 185,
5ab0: 20 31 38 36 2c 20 31 38 37 2c 20 31 38 38 2c 20   186, 187, 188, 
5ac0: 31 38 39 2c 20 31 39 30 2c 20 31 39 31 2c 20 20  189, 190, 191,  
5ad0: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 0a 20 20   0,   1,   2,.  
5ae0: 20 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c      3,   4,   5,
5af0: 20 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20     6,   7,   8, 
5b00: 20 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20    9,  10,  11,  
5b10: 31 32 2c 20 20 31 33 2c 20 20 31 34 2c 20 20 31  12,  13,  14,  1
5b20: 35 2c 20 20 31 36 2c 20 20 31 37 2c 0a 20 20 20  5,  16,  17,.   
5b30: 20 20 31 38 2c 20 20 31 39 2c 20 20 32 30 2c 20    18,  19,  20, 
5b40: 20 32 31 2c 20 20 32 32 2c 20 20 32 33 2c 20 20   21,  22,  23,  
5b50: 32 34 2c 20 20 32 35 2c 20 20 32 36 2c 20 20 32  24,  25,  26,  2
5b60: 37 2c 20 20 32 38 2c 20 20 32 39 2c 20 20 33 30  7,  28,  29,  30
5b70: 2c 20 20 33 31 2c 20 20 20 30 2c 0a 20 20 20 20  ,  31,   0,.    
5b80: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20    1,   2,   3,  
5b90: 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20   4,   5,   6,   
5ba0: 37 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30  7,   8,   9,  10
5bb0: 2c 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c  ,  11,  12,  13,
5bc0: 20 20 31 34 2c 20 20 31 35 2c 0a 20 20 20 20 20    14,  15,.     
5bd0: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
5be0: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
5bf0: 2c 20 20 20 37 2c 20 20 20 30 2c 20 20 20 31 2c  ,   7,   0,   1,
5c00: 20 20 20 32 2c 20 20 20 33 2c 20 20 20 30 2c 20     2,   3,   0, 
5c10: 20 20 31 2c 20 32 35 34 2c 0a 20 20 20 20 32 35    1, 254,.    25
5c20: 35 2c 0a 20 20 7d 3b 0a 20 20 63 20 3d 20 69 6e  5,.  };.  c = in
5c30: 69 74 56 61 6c 5b 2a 28 7a 2b 2b 29 5d 3b 0a 20  itVal[*(z++)];. 
5c40: 20 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a 7a   while( (0xc0&*z
5c50: 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 63  )==0x80 ){.    c
5c60: 20 3d 20 28 63 3c 3c 36 29 20 7c 20 28 30 78 33   = (c<<6) | (0x3
5c70: 66 26 2a 28 7a 2b 2b 29 29 3b 0a 20 20 7d 0a 20  f&*(z++));.  }. 
5c80: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 23 65 6e   return c;.}.#en
5c90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  dif../*.** Compa
5ca0: 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72  re two UTF-8 str
5cb0: 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74  ings for equalit
5cc0: 79 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  y where the firs
5cd0: 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20  t string can.** 
5ce0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61  potentially be a
5cf0: 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69   "glob" expressi
5d00: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  on.  Return true
5d10: 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20   (1) if they.** 
5d20: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64  are the same and
5d30: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68   false (0) if th
5d40: 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ey are different
5d50: 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
5d60: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
5d70: 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
5d80: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
5d90: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
5da0: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
5db0: 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
5dc0: 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
5dd0: 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
5de0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
5df0: 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
5e00: 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
5e10: 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
5e20: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
5e30: 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
5e40: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
5e50: 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
5e60: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
5e70: 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
5e80: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
5e90: 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61  With the [...] a
5ea0: 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69  nd [^...] matchi
5eb0: 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63  ng, a ']' charac
5ec0: 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75  ter can be inclu
5ed0: 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ded.** in the li
5ee0: 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  st by making it 
5ef0: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
5f00: 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72  ter after '[' or
5f10: 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67   '^'.  A.** rang
5f20: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
5f30: 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64  can be specified
5f40: 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61   using '-'.  Exa
5f50: 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22  mple:.** "[a-z]"
5f60: 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e   matches any sin
5f70: 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c  gle lower-case l
5f80: 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68  etter.  To match
5f90: 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20   a '-', make.** 
5fa0: 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  it the last char
5fb0: 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73  acter in the lis
5fc0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
5fd0: 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79  utine is usually
5fe0: 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20   quick, but can 
5ff0: 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77  be N**2 in the w
6000: 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  orst case..**.**
6010: 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68   Hints: to match
6020: 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74   '*' or '?', put
6030: 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20   them in "[]".  
6040: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
6050: 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78           abc[*]x
6060: 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65  yz        Matche
6070: 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79  s "abc*xyz" only
6080: 0a 2a 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 47  .*/.int .sqliteG
6090: 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
60a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
60b0: 7a 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20  zPattern, const 
60c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
60d0: 53 74 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73  String){.  regis
60e0: 74 65 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  ter int c;.  int
60f0: 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
6100: 65 65 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a  een;.  int c2;..
6110: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a    while( (c = *z
6120: 50 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20  Pattern)!=0 ){. 
6130: 20 20 20 73 77 69 74 63 68 28 20 63 20 29 7b 0a     switch( c ){.
6140: 20 20 20 20 20 20 63 61 73 65 20 27 2a 27 3a 0a        case '*':.
6150: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
6160: 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d  c=zPattern[1]) =
6170: 3d 20 27 2a 27 20 7c 7c 20 63 20 3d 3d 20 27 3f  = '*' || c == '?
6180: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
6190: 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
61a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53           if( *zS
61b0: 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72  tring==0 ) retur
61c0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n 0;.           
61d0: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
61e0: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
61f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6200: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
6210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6220: 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
6230: 31 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 55  1;.        c = U
6240: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
6250: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
6260: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
6270: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20  while( *zString 
6280: 26 26 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d  && sqliteGlobCom
6290: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
62a0: 5d 2c 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b  ],zString)==0 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
62c0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
62d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
62e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  }.          retu
62f0: 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a  rn *zString!=0;.
6300: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6310: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
6320: 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21  (c2 = *zString)!
6330: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6340: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
6350: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63   && c2 != c ){ c
6360: 32 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20  2 = *++zString; 
6370: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
6380: 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
6390: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
63a0: 69 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f  if( sqliteGlobCo
63b0: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
63c0: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
63d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
63e0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
63f0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6410: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
6430: 65 20 27 3f 27 3a 20 7b 0a 20 20 20 20 20 20 20  e '?': {.       
6440: 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30   if( *zString==0
6450: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6460: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
6470: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
6480: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
6490: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
64a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
64b0: 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20  ase '[': {.     
64c0: 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
64d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   0;.        seen
64e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
64f0: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
6500: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72    c = sqliteChar
6510: 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  Val(zString);.  
6520: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
6530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6540: 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74     c2 = *++zPatt
6550: 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ern;.        if(
6560: 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65   c2=='^' ){ inve
6570: 72 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b  rt = 1; c2 = *++
6580: 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20  zPattern; }.    
6590: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
65a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
65b0: 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
65c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32   1;.          c2
65d0: 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a   = *++zPattern;.
65e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65f0: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
6600: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61  qliteCharVal(zPa
6610: 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32  ttern))!=0 && c2
6620: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
6630: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
6640: 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27  & zPattern[1]!='
6650: 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31  ]' && zPattern[1
6660: 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
6670: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6680: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6690: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
66a0: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
66b0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
66c0: 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f     if( c>=prior_
66d0: 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65  c && c<=c2 ) see
66e0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
66f0: 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a     prior_c = 0;.
6700: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
6710: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
6720: 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
6730: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
6740: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
6750: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6760: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
6770: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
6780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
6790: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61  liteNextChar(zPa
67a0: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
67b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
67c0: 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
67d0: 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
67e0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71  rn 0;.        sq
67f0: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
6800: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  ring);.        z
6810: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20  Pattern++;.     
6820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6830: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
6840: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   {.        if( c
6850: 20 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72   != *zString ) r
6860: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
6870: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6880: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
6890: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
68a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
68b0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
68c0: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
68d0: 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d  Compare two UTF-
68e0: 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71  8 strings for eq
68f0: 75 61 6c 69 74 79 20 75 73 69 6e 67 20 74 68 65  uality using the
6900: 20 22 4c 49 4b 45 22 20 6f 70 65 72 61 74 6f 72   "LIKE" operator
6910: 20 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20 54 68 65   of.** SQL.  The
6920: 20 27 25 27 20 63 68 61 72 61 63 74 65 72 20 6d   '%' character m
6930: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
6940: 6e 63 65 20 6f 66 20 30 20 6f 72 20 6d 6f 72 65  nce of 0 or more
6950: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61  .** characters a
6960: 6e 64 20 27 5f 27 20 6d 61 74 63 68 65 73 20 61  nd '_' matches a
6970: 6e 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63  ny single charac
6980: 74 65 72 2e 20 20 43 61 73 65 20 69 73 0a 2a 2a  ter.  Case is.**
6990: 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74   not significant
69a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
69b0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 6e 20  tine is just an 
69c0: 61 64 61 70 74 61 74 69 6f 6e 20 6f 66 20 74 68  adaptation of th
69d0: 65 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70  e sqliteGlobComp
69e0: 61 72 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  are().** routine
69f0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20 0a   above..*/.int .
6a00: 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d 70 61 72  sqliteLikeCompar
6a10: 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  e(const unsigned
6a20: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c   char *zPattern,
6a30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6a40: 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a  char *zString){.
6a50: 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63    register int c
6a60: 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77  ;.  int c2;..  w
6a70: 68 69 6c 65 28 20 28 63 20 3d 20 55 70 70 65 72  hile( (c = Upper
6a80: 54 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74 74 65 72  ToLower[*zPatter
6a90: 6e 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77  n])!=0 ){.    sw
6aa0: 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20  itch( c ){.     
6ab0: 20 63 61 73 65 20 27 25 27 3a 20 7b 0a 20 20 20   case '%': {.   
6ac0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a       while( (c=z
6ad0: 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27  Pattern[1]) == '
6ae0: 25 27 20 7c 7c 20 63 20 3d 3d 20 27 5f 27 20 29  %' || c == '_' )
6af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6b00: 63 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20 20 20  c=='_' ){.      
6b10: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69        if( *zStri
6b20: 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ng==0 ) return 0
6b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
6b40: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
6b50: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
6b60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61   }.          zPa
6b70: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
6b80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
6b90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6ba0: 20 20 20 20 20 20 20 20 63 20 3d 20 55 70 70 65          c = Uppe
6bb0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
6bc0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 3d       while( (c2=
6bd0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53  UpperToLower[*zS
6be0: 74 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20  tring])!=0 ){.  
6bf0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
6c00: 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  2 != 0 && c2 != 
6c10: 63 20 29 7b 20 63 32 20 3d 20 55 70 70 65 72 54  c ){ c2 = UpperT
6c20: 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72 69 6e  oLower[*++zStrin
6c30: 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  g]; }.          
6c40: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
6c50: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
6c60: 69 66 28 20 73 71 6c 69 74 65 4c 69 6b 65 43 6f  if( sqliteLikeCo
6c70: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
6c80: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
6c90: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6ca0: 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72    sqliteNextChar
6cb0: 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  (zString);.     
6cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
6cd0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
6ce0: 20 20 20 20 20 63 61 73 65 20 27 5f 27 3a 20 7b       case '_': {
6cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53  .        if( *zS
6d00: 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72  tring==0 ) retur
6d10: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 0;.        sql
6d20: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
6d30: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ing);.        zP
6d40: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
6d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6d60: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6d70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
6d80: 21 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  != UpperToLower[
6d90: 2a 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75  *zString] ) retu
6da0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 50  rn 0;.        zP
6db0: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
6dc0: 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20    zString++;.   
6dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6df0: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d  return *zString=
6e00: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  =0;.}../*.** Ret
6e10: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
6e20: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6e30: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
6e40: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
6e50: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
6e60: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
6e70: 20 2a 73 71 6c 69 74 65 45 72 72 53 74 72 28 69   *sqliteErrStr(i
6e80: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
6e90: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
6ea0: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
6eb0: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
6ec0: 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e       z = "not an
6ed0: 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20   error";        
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6f00: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
6f10: 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f       z = "SQL lo
6f20: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
6f30: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 3b 20  sing database"; 
6f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6f50: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
6f60: 4c 3a 20 20 20 7a 20 3d 20 22 69 6e 74 65 72 6e  L:   z = "intern
6f70: 61 6c 20 53 51 4c 69 74 65 20 69 6d 70 6c 65 6d  al SQLite implem
6f80: 65 6e 74 61 74 69 6f 6e 20 66 6c 61 77 22 3b 20  entation flaw"; 
6f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6fa0: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
6fb0: 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65 73 73       z = "access
6fc0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
6fd0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
6fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6ff0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
7000: 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61       z = "callba
7010: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
7020: 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20 20 20  ry abort";      
7030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7040: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
7050: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
7060: 73 65 20 69 6e 20 75 73 65 20 62 79 20 61 6e 6f  se in use by ano
7070: 74 68 65 72 20 70 72 6f 63 65 73 73 22 3b 20 20  ther process";  
7080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7090: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
70a0: 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66       z = "out of
70b0: 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20 20 20   memory";       
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
70e0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
70f0: 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65 6d 70  Y:   z = "attemp
7100: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
7110: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 3b  donly database";
7120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7130: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
7140: 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65 72 72  PT:  z = "interr
7150: 75 70 74 65 64 22 3b 20 20 20 20 20 20 20 20 20  upted";         
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7180: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
7190: 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b 20 49       z = "disk I
71a0: 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  /O error";      
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
71d0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
71e0: 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  :    z = "databa
71f0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
7200: 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20   malformed";    
7210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7220: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
7230: 44 3a 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20  D:   z = "table 
7240: 6f 72 20 72 65 63 6f 72 64 20 6e 6f 74 20 66 6f  or record not fo
7250: 75 6e 64 22 3b 20 20 20 20 20 20 20 20 20 20 20  und";           
7260: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7270: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
7280: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
7290: 73 65 20 69 73 20 66 75 6c 6c 22 3b 20 20 20 20  se is full";    
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
72c0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
72d0: 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65  N:   z = "unable
72e0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
72f0: 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20 20 20  e file";        
7300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7310: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
7320: 4c 3a 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  L:   z = "databa
7330: 73 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  se locking proto
7340: 63 6f 6c 20 66 61 69 6c 75 72 65 22 3b 20 20 20  col failure";   
7350: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7360: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
7370: 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20       z = "table 
7380: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
7390: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
73a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
73b0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
73c0: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
73d0: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
73e0: 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20 20 20  anged";         
73f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7400: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
7410: 20 20 20 20 20 7a 20 3d 20 22 74 6f 6f 20 6d 75       z = "too mu
7420: 63 68 20 64 61 74 61 20 66 6f 72 20 6f 6e 65 20  ch data for one 
7430: 74 61 62 6c 65 20 72 6f 77 22 3b 20 20 20 20 20  table row";     
7440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
7450: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
7460: 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77       z = "unknow
7470: 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20  n error";       
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
74a0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a                 eturn z;.}.