/ Hex Artifact Content
Login

Artifact 38e4bb5edf6fa92e677698c45785bf73c69b9e9f:


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 31 32 20 32 30 30  til.c,v 1.12 200
0450: 30 2f 30 36 2f 30 38 20 31 33 3a 33 36 3a 34 31  0/06/08 13:36:41
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 23 69 66  e <ctype.h>..#if
04b0: 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47  def MEMORY_DEBUG
04c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04d0: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6e 64  e new memory and
04e0: 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2e   set it to zero.
04f0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
0500: 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69 73  .** no memory is
0510: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 76   available..*/.v
0520: 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c 6f  oid *sqliteMallo
0530: 63 5f 28 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  c_(int n, char *
0540: 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29  zFile, int line)
0550: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69  {.  void *p;.  i
0560: 6e 74 20 2a 70 69 3b 0a 20 20 69 6e 74 20 6b 3b  nt *pi;.  int k;
0570: 0a 20 20 73 71 6c 69 74 65 5f 6e 4d 61 6c 6c 6f  .  sqlite_nMallo
0580: 63 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  c++;.  if( sqlit
0590: 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 3d 30  e_iMallocFail>=0
05a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69   ){.    sqlite_i
05b0: 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b 0a 20 20  MallocFail--;.  
05c0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 69 4d 61    if( sqlite_iMa
05d0: 6c 6c 6f 63 46 61 69 6c 3d 3d 30 20 29 20 72 65  llocFail==0 ) re
05e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6b 20  turn 0;.  }.  k 
05f0: 3d 20 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74 29  = (n+sizeof(int)
0600: 2d 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b  -1)/sizeof(int);
0610: 0a 20 20 70 69 20 3d 20 6d 61 6c 6c 6f 63 28 20  .  pi = malloc( 
0620: 28 33 2b 6b 29 2a 73 69 7a 65 6f 66 28 69 6e 74  (3+k)*sizeof(int
0630: 29 29 3b 0a 20 20 69 66 28 20 70 69 3d 3d 30 20  ));.  if( pi==0 
0640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 69  ) return 0;.  pi
0650: 5b 30 5d 20 3d 20 30 78 64 65 61 64 31 31 32 32  [0] = 0xdead1122
0660: 3b 0a 20 20 70 69 5b 31 5d 20 3d 20 6e 3b 0a 20  ;.  pi[1] = n;. 
0670: 20 70 69 5b 6b 2b 32 5d 20 3d 20 30 78 64 65 61   pi[k+2] = 0xdea
0680: 64 33 33 34 34 3b 0a 20 20 70 20 3d 20 26 70 69  d3344;.  p = &pi
0690: 5b 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  [2];.  memset(p,
06a0: 20 30 2c 20 6e 29 3b 0a 23 69 66 20 4d 45 4d 4f   0, n);.#if MEMO
06b0: 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72  RY_DEBUG>1.  fpr
06c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
06d0: 6c 6f 63 20 25 64 20 62 79 74 65 73 20 61 74 20  loc %d bytes at 
06e0: 30 78 25 78 20 66 72 6f 6d 20 25 73 3a 25 64 5c  0x%x from %s:%d\
06f0: 6e 22 2c 20 6e 2c 20 28 69 6e 74 29 70 2c 20 7a  n", n, (int)p, z
0700: 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65 6e 64  File,line);.#end
0710: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  if.  return p;.}
0720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
0730: 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ory previously o
0740: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
0750: 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 76  iteMalloc().*/.v
0760: 6f 69 64 20 73 71 6c 69 74 65 46 72 65 65 5f 28  oid sqliteFree_(
0770: 76 6f 69 64 20 2a 70 2c 20 63 68 61 72 20 2a 7a  void *p, char *z
0780: 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b  File, int line){
0790: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
07a0: 69 6e 74 20 2a 70 69 2c 20 6b 2c 20 6e 3b 0a 20  int *pi, k, n;. 
07b0: 20 20 20 70 69 20 3d 20 70 3b 0a 20 20 20 20 70     pi = p;.    p
07c0: 69 20 2d 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69  i -= 2;.    sqli
07d0: 74 65 5f 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20  te_nFree++;.    
07e0: 69 66 28 20 70 69 5b 30 5d 21 3d 30 78 64 65 61  if( pi[0]!=0xdea
07f0: 64 31 31 32 32 20 29 7b 0a 20 20 20 20 20 20 66  d1122 ){.      f
0800: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4c  printf(stderr,"L
0810: 6f 77 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f  ow-end memory co
0820: 72 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25 78  rruption at 0x%x
0830: 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20 20  \n", (int)p);.  
0840: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
0850: 7d 0a 20 20 20 20 6e 20 3d 20 70 69 5b 31 5d 3b  }.    n = pi[1];
0860: 0a 20 20 20 20 6b 20 3d 20 28 6e 2b 73 69 7a 65  .    k = (n+size
0870: 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f  of(int)-1)/sizeo
0880: 66 28 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  f(int);.    if( 
0890: 70 69 5b 6b 2b 32 5d 21 3d 30 78 64 65 61 64 33  pi[k+2]!=0xdead3
08a0: 33 34 34 20 29 7b 0a 20 20 20 20 20 20 66 70 72  344 ){.      fpr
08b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 48 69 67  intf(stderr,"Hig
08c0: 68 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f 72  h-end memory cor
08d0: 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25 78 5c  ruption at 0x%x\
08e0: 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20 20 20  n", (int)p);.   
08f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0900: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 69 2c 20  .    memset(pi, 
0910: 30 78 66 66 2c 20 28 6b 2b 33 29 2a 73 69 7a 65  0xff, (k+3)*size
0920: 6f 66 28 69 6e 74 29 29 3b 0a 23 69 66 20 4d 45  of(int));.#if ME
0930: 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 20  MORY_DEBUG>1.   
0940: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0950: 22 66 72 65 65 20 25 64 20 62 79 74 65 73 20 61  "free %d bytes a
0960: 74 20 30 78 25 78 20 66 72 6f 6d 20 25 73 3a 25  t 0x%x from %s:%
0970: 64 5c 6e 22 2c 20 6e 2c 20 28 69 6e 74 29 70 2c  d\n", n, (int)p,
0980: 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65   zFile,line);.#e
0990: 6e 64 69 66 0a 20 20 20 20 66 72 65 65 28 70 69  ndif.    free(pi
09a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
09b0: 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20 61  Resize a prior a
09c0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 70  llocation.  If p
09d0: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ==0, then this r
09e0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20  outine.** works 
09f0: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
0a00: 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d  Malloc().  If n=
0a10: 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  =0, then this ro
0a20: 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a  utine.** works j
0a30: 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 46  ust like sqliteF
0a40: 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ree()..*/.void *
0a50: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 5f 28 76  sqliteRealloc_(v
0a60: 6f 69 64 20 2a 6f 6c 64 50 2c 20 69 6e 74 20 6e  oid *oldP, int n
0a70: 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  , char *zFile, i
0a80: 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 69 6e 74 20  nt line){.  int 
0a90: 2a 6f 6c 64 50 69 2c 20 2a 70 69 2c 20 6b 2c 20  *oldPi, *pi, k, 
0aa0: 6f 6c 64 4e 2c 20 6f 6c 64 4b 3b 0a 20 20 76 6f  oldN, oldK;.  vo
0ab0: 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6f 6c 64  id *p;.  if( old
0ac0: 50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  P==0 ){.    retu
0ad0: 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f  rn sqliteMalloc_
0ae0: 28 6e 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a  (n,zFile,line);.
0af0: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29    }.  if( n==0 )
0b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
0b10: 5f 28 6f 6c 64 50 2c 7a 46 69 6c 65 2c 6c 69 6e  _(oldP,zFile,lin
0b20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
0b30: 3b 0a 20 20 7d 0a 20 20 6f 6c 64 50 69 20 3d 20  ;.  }.  oldPi = 
0b40: 6f 6c 64 50 3b 0a 20 20 6f 6c 64 50 69 20 2d 3d  oldP;.  oldPi -=
0b50: 20 32 3b 0a 20 20 69 66 28 20 6f 6c 64 50 69 5b   2;.  if( oldPi[
0b60: 30 5d 21 3d 30 78 64 65 61 64 31 31 32 32 20 29  0]!=0xdead1122 )
0b70: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
0b80: 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d 65  derr,"Low-end me
0b90: 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20  mory corruption 
0ba0: 69 6e 20 72 65 61 6c 6c 6f 63 20 61 74 20 30 78  in realloc at 0x
0bb0: 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a  %x\n", (int)p);.
0bc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0bd0: 7d 0a 20 20 6f 6c 64 4e 20 3d 20 6f 6c 64 50 69  }.  oldN = oldPi
0be0: 5b 31 5d 3b 0a 20 20 6f 6c 64 4b 20 3d 20 28 6f  [1];.  oldK = (o
0bf0: 6c 64 4e 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d  ldN+sizeof(int)-
0c00: 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a  1)/sizeof(int);.
0c10: 20 20 69 66 28 20 6f 6c 64 50 69 5b 6f 6c 64 4b    if( oldPi[oldK
0c20: 2b 32 5d 21 3d 30 78 64 65 61 64 33 33 34 34 20  +2]!=0xdead3344 
0c30: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
0c40: 74 64 65 72 72 2c 22 48 69 67 68 2d 65 6e 64 20  tderr,"High-end 
0c50: 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f  memory corruptio
0c60: 6e 20 69 6e 20 72 65 61 6c 6c 6f 63 20 61 74 20  n in realloc at 
0c70: 30 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29  0x%x\n", (int)p)
0c80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
0c90: 20 20 7d 0a 20 20 6b 20 3d 20 28 6e 20 2b 20 73    }.  k = (n + s
0ca0: 69 7a 65 6f 66 28 69 6e 74 29 20 2d 20 31 29 2f  izeof(int) - 1)/
0cb0: 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 70  sizeof(int);.  p
0cc0: 69 20 3d 20 6d 61 6c 6c 6f 63 28 20 28 6b 2b 33  i = malloc( (k+3
0cd0: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
0ce0: 0a 20 20 70 69 5b 30 5d 20 3d 20 30 78 64 65 61  .  pi[0] = 0xdea
0cf0: 64 31 31 32 32 3b 0a 20 20 70 69 5b 31 5d 20 3d  d1122;.  pi[1] =
0d00: 20 6e 3b 0a 20 20 70 69 5b 6b 2b 32 5d 20 3d 20   n;.  pi[k+2] = 
0d10: 30 78 64 65 61 64 33 33 34 34 3b 0a 20 20 70 20  0xdead3344;.  p 
0d20: 3d 20 26 70 69 5b 32 5d 3b 0a 20 20 6d 65 6d 63  = &pi[2];.  memc
0d30: 70 79 28 70 2c 20 6f 6c 64 50 2c 20 6e 3e 6f 6c  py(p, oldP, n>ol
0d40: 64 4e 20 3f 20 6f 6c 64 4e 20 3a 20 6e 29 3b 0a  dN ? oldN : n);.
0d50: 20 20 69 66 28 20 6e 3e 6f 6c 64 4e 20 29 7b 0a    if( n>oldN ){.
0d60: 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
0d70: 61 72 2a 29 70 29 5b 6f 6c 64 4e 5d 2c 20 30 2c  ar*)p)[oldN], 0,
0d80: 20 6e 2d 6f 6c 64 4e 29 3b 0a 20 20 7d 0a 20 20   n-oldN);.  }.  
0d90: 6d 65 6d 73 65 74 28 6f 6c 64 50 69 2c 20 30 2c  memset(oldPi, 0,
0da0: 20 28 6f 6c 64 4b 2b 33 29 2a 73 69 7a 65 6f 66   (oldK+3)*sizeof
0db0: 28 69 6e 74 29 29 3b 0a 20 20 66 72 65 65 28 6f  (int));.  free(o
0dc0: 6c 64 50 69 29 3b 0a 23 69 66 20 4d 45 4d 4f 52  ldPi);.#if MEMOR
0dd0: 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69  Y_DEBUG>1.  fpri
0de0: 6e 74 66 28 73 74 64 65 72 72 2c 22 72 65 61 6c  ntf(stderr,"real
0df0: 6c 6f 63 20 25 64 20 74 6f 20 25 64 20 62 79 74  loc %d to %d byt
0e00: 65 73 20 61 74 20 30 78 25 78 20 74 6f 20 30 78  es at 0x%x to 0x
0e10: 25 78 20 61 74 20 25 73 3a 25 64 5c 6e 22 2c 20  %x at %s:%d\n", 
0e20: 6f 6c 64 4e 2c 20 6e 2c 0a 20 20 20 20 28 69 6e  oldN, n,.    (in
0e30: 74 29 6f 6c 64 50 2c 20 28 69 6e 74 29 70 2c 20  t)oldP, (int)p, 
0e40: 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 23 65  zFile, line);.#e
0e50: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b  ndif.  return p;
0e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
0e70: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 20   duplicate of a 
0e80: 73 74 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f  string into memo
0e90: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
0ea0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 46 72 65   malloc().** Fre
0eb0: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  e the original s
0ec0: 74 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c 69  tring using sqli
0ed0: 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69  teFree()..*/.voi
0ee0: 64 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c  d sqliteStrReall
0ef0: 6f 63 28 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20  oc(char **pz){. 
0f00: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69   char *zNew;.  i
0f10: 66 28 20 70 7a 3d 3d 30 20 7c 7c 20 2a 70 7a 3d  f( pz==0 || *pz=
0f20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
0f30: 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74  New = malloc( st
0f40: 72 6c 65 6e 28 2a 70 7a 29 20 2b 20 31 20 29 3b  rlen(*pz) + 1 );
0f50: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74  .  if( zNew ) st
0f60: 72 63 70 79 28 7a 4e 65 77 2c 20 2a 70 7a 29 3b  rcpy(zNew, *pz);
0f70: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70  .  sqliteFree(*p
0f80: 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 4e 65 77  z);.  *pz = zNew
0f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
0fa0: 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69  a copy of a stri
0fb0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
0fc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
0fd0: 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61  eMalloc().*/.cha
0fe0: 72 20 2a 73 71 6c 69 74 65 53 74 72 44 75 70 5f  r *sqliteStrDup_
0ff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1000: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
1010: 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72 20 2a   line){.  char *
1020: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  zNew = sqliteMal
1030: 6c 6f 63 5f 28 73 74 72 6c 65 6e 28 7a 29 2b 31  loc_(strlen(z)+1
1040: 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a  , zFile, line);.
1050: 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74 72    if( zNew ) str
1060: 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b 0a 20 20  cpy(zNew, z);.  
1070: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 63  return zNew;.}.c
1080: 68 61 72 20 2a 73 71 6c 69 74 65 53 74 72 4e 44  har *sqliteStrND
1090: 75 70 5f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  up_(const char *
10a0: 7a 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  z, int n, char *
10b0: 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29  zFile, int line)
10c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d  {.  char *zNew =
10d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f 28 6e   sqliteMalloc_(n
10e0: 2b 31 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29  +1, zFile, line)
10f0: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a  ;.  if( zNew ){.
1100: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c      memcpy(zNew,
1110: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e 65 77   z, n);.    zNew
1120: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  [n] = 0;.  }.  r
1130: 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 0a  eturn zNew;.}...
1140: 23 65 6c 73 65 20 20 2f 2a 20 21 64 65 66 69 6e  #else  /* !defin
1150: 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42 55 47 29  ed(MEMORY_DEBUG)
1160: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61   */./*.** Alloca
1170: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6e  te new memory an
1180: 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  d set it to zero
1190: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
11a0: 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69  f.** no memory i
11b0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
11c0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c  void *sqliteMall
11d0: 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69  oc(int n){.  voi
11e0: 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 6e 29  d *p = malloc(n)
11f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1200: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65  eturn 0;.  memse
1210: 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 20 20 72 65  t(p, 0, n);.  re
1220: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1230: 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65   Free memory pre
1240: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
1250: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1260: 6f 63 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc().*/.void sql
1270: 69 74 65 46 72 65 65 28 76 6f 69 64 20 2a 70 29  iteFree(void *p)
1280: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
1290: 20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a   free(p);.  }.}.
12a0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 20  ./*.** Resize a 
12b0: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
12c0: 2e 20 20 49 66 20 70 3d 3d 30 2c 20 74 68 65 6e  .  If p==0, then
12d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
12e0: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
12f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
1300: 20 20 49 66 20 6e 3d 3d 30 2c 20 74 68 65 6e 20    If n==0, then 
1310: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1320: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
1330: 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f  sqliteFree()..*/
1340: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 52 65 61  .void *sqliteRea
1350: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 2c 20 69 6e  lloc(void *p, in
1360: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
1370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
1380: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 29 3b 0a  qliteMalloc(n);.
1390: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29    }.  if( n==0 )
13a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
13b0: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
13c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13d0: 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 7d  realloc(p, n);.}
13e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
13f0: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20  opy of a string 
1400: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1410: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
1420: 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72 20 2a  lloc().*/.char *
1430: 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6e  sqliteStrDup(con
1440: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1450: 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69  har *zNew = sqli
1460: 74 65 4d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28  teMalloc(strlen(
1470: 7a 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65  z)+1);.  if( zNe
1480: 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65 77 2c  w ) strcpy(zNew,
1490: 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e   z);.  return zN
14a0: 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69  ew;.}.char *sqli
14b0: 74 65 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20  teStrNDup(const 
14c0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
14d0: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20  .  char *zNew = 
14e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 2b 31  sqliteMalloc(n+1
14f0: 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b  );.  if( zNew ){
1500: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77  .    memcpy(zNew
1510: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e 65  , z, n);.    zNe
1520: 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  w[n] = 0;.  }.  
1530: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23  return zNew;.}.#
1540: 65 6e 64 69 66 20 2f 2a 20 4d 45 4d 4f 52 59 5f  endif /* MEMORY_
1550: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1560: 43 72 65 61 74 65 20 61 20 73 74 72 69 6e 67 20  Create a string 
1570: 66 72 6f 6d 20 74 68 65 20 32 6e 64 20 61 6e 64  from the 2nd and
1580: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
1590: 6d 65 6e 74 73 20 28 75 70 20 74 6f 20 74 68 65  ments (up to the
15a0: 0a 2a 2a 20 66 69 72 73 74 20 4e 55 4c 4c 20 61  .** first NULL a
15b0: 72 67 75 6d 65 6e 74 29 2c 20 73 74 6f 72 65 20  rgument), store 
15c0: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  the string in me
15d0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
15e0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c  om.** sqliteMall
15f0: 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 74 68  oc() and make th
1600: 65 20 70 6f 69 6e 74 65 72 20 69 6e 64 69 63 61  e pointer indica
1610: 74 65 64 20 62 79 20 74 68 65 20 31 73 74 20 61  ted by the 1st a
1620: 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74  rgument.** point
1630: 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
1640: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
1650: 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a  etString(char **
1660: 70 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pz, const char *
1670: 7a 46 69 72 73 74 2c 20 2e 2e 2e 29 7b 0a 20 20  zFirst, ...){.  
1680: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
1690: 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74  t nByte;.  const
16a0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
16b0: 20 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *zResult;..  if
16c0: 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pz==0 ) return
16d0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c  ;.  nByte = strl
16e0: 65 6e 28 7a 46 69 72 73 74 29 20 2b 20 31 3b 0a  en(zFirst) + 1;.
16f0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1700: 46 69 72 73 74 29 3b 0a 20 20 77 68 69 6c 65 28  First);.  while(
1710: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
1720: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
1730: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  0 ){.    nByte +
1740: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 7d  = strlen(z);.  }
1750: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1760: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29   sqliteFree(*pz)
1770: 3b 0a 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c  ;.  *pz = zResul
1780: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1790: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
17a0: 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29 20 72 65   zResult==0 ) re
17b0: 74 75 72 6e 3b 0a 20 20 73 74 72 63 70 79 28 7a  turn;.  strcpy(z
17c0: 52 65 73 75 6c 74 2c 20 7a 46 69 72 73 74 29 3b  Result, zFirst);
17d0: 0a 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74  .  zResult += st
17e0: 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20  rlen(zResult);. 
17f0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1800: 69 72 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  irst);.  while( 
1810: 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  (z = va_arg(ap, 
1820: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30  const char*))!=0
1830: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
1840: 52 65 73 75 6c 74 2c 20 7a 29 3b 0a 20 20 20 20  Result, z);.    
1850: 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c 65  zResult += strle
1860: 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a  n(zResult);.  }.
1870: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 69    va_end(ap);.#i
1880: 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  fdef MEMORY_DEBU
1890: 47 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42  G.#if MEMORY_DEB
18a0: 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73  UG>1.  fprintf(s
18b0: 74 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61 74  tderr,"string at
18c0: 20 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c 20   0x%x is %s\n", 
18d0: 28 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a  (int)*pz, *pz);.
18e0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d 0a  #endif.#endif.}.
18f0: 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b  ./*.** Works lik
1900: 65 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e  e sqliteSetStrin
1910: 67 2c 20 62 75 74 20 65 61 63 68 20 73 74 72 69  g, but each stri
1920: 6e 67 20 69 73 20 6e 6f 77 20 66 6f 6c 6c 6f 77  ng is now follow
1930: 65 64 20 62 79 0a 2a 2a 20 61 20 6c 65 6e 67 74  ed by.** a lengt
1940: 68 20 69 6e 74 65 67 65 72 2e 20 20 2d 31 20 6d  h integer.  -1 m
1950: 65 61 6e 73 20 75 73 65 20 74 68 65 20 77 68 6f  eans use the who
1960: 6c 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f  le string..*/.vo
1970: 69 64 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  id sqliteSetNStr
1980: 69 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 2e  ing(char **pz, .
1990: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
19a0: 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  p;.  int nByte;.
19b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
19c0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
19d0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66  ;.  int n;..  if
19e0: 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pz==0 ) return
19f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  ;.  nByte = 0;. 
1a00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 7a   va_start(ap, pz
1a10: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d  );.  while( (z =
1a20: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1a30: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
1a40: 20 20 20 20 6e 20 3d 20 76 61 5f 61 72 67 28 61      n = va_arg(a
1a50: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  p, int);.    if(
1a60: 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c   n<=0 ) n = strl
1a70: 65 6e 28 7a 29 3b 0a 20 20 20 20 6e 42 79 74 65  en(z);.    nByte
1a80: 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20 76 61 5f   += n;.  }.  va_
1a90: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
1aa0: 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70  eFree(*pz);.  *p
1ab0: 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73 71  z = zResult = sq
1ac0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
1ad0: 65 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 7a  e + 1 );.  if( z
1ae0: 52 65 73 75 6c 74 3d 3d 30 20 29 20 72 65 74 75  Result==0 ) retu
1af0: 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rn;.  va_start(a
1b00: 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28  p, pz);.  while(
1b10: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
1b20: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
1b30: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61 5f  0 ){.    n = va_
1b40: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1b50: 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d    if( n<=0 ) n =
1b60: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
1b70: 73 74 72 6e 63 70 79 28 7a 52 65 73 75 6c 74 2c  strncpy(zResult,
1b80: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 52 65 73   z, n);.    zRes
1b90: 75 6c 74 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20  ult += n;.  }.  
1ba0: 2a 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 69  *zResult = 0;.#i
1bb0: 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  fdef MEMORY_DEBU
1bc0: 47 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42  G.#if MEMORY_DEB
1bd0: 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73  UG>1.  fprintf(s
1be0: 74 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61 74  tderr,"string at
1bf0: 20 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c 20   0x%x is %s\n", 
1c00: 28 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a  (int)*pz, *pz);.
1c10: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20  #endif.#endif.  
1c20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1c30: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
1c40: 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65 64  SQL-style quoted
1c50: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 6e   string into a n
1c60: 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79 20  ormal string by 
1c70: 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65 20  removing.** the 
1c80: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
1c90: 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f  .  The conversio
1ca0: 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61  n is done in-pla
1cb0: 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69  ce.  If the.** i
1cc0: 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  nput does not be
1cd0: 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74 65  gin with a quote
1ce0: 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65 6e   character, then
1cf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1d00: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d10: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 71 75 6f  void sqliteDequo
1d20: 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  te(char *z){.  i
1d30: 6e 74 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74 20  nt quote;.  int 
1d40: 69 2c 20 6a 3b 0a 20 20 71 75 6f 74 65 20 3d 20  i, j;.  quote = 
1d50: 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75 6f 74  z[0];.  if( quot
1d60: 65 21 3d 27 5c 27 27 20 26 26 20 71 75 6f 74 65  e!='\'' && quote
1d70: 21 3d 27 22 27 20 29 20 72 65 74 75 72 6e 3b 0a  !='"' ) return;.
1d80: 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20    for(i=1, j=0; 
1d90: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
1da0: 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65 20  if( z[i]==quote 
1db0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
1dc0: 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  +1]==quote ){.  
1dd0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 71        z[j++] = q
1de0: 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69 2b  uote;.        i+
1df0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1e00: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
1e10: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
1e20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b  else{.      z[j+
1e40: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d  +] = z[i];.    }
1e50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 61 72  .  }.}../* An ar
1e60: 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20 75  ray to map all u
1e70: 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61 63  pper-case charac
1e80: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72 20  ters into their 
1e90: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1ea0: 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61 72   lower-case char
1eb0: 61 63 74 65 72 2e 20 0a 2a 2f 0a 73 74 61 74 69  acter. .*/.stati
1ec0: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
1ed0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d  UpperToLower[] =
1ee0: 20 7b 0a 20 20 20 20 20 20 30 2c 20 20 31 2c 20   {.      0,  1, 
1ef0: 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20   2,  3,  4,  5, 
1f00: 20 36 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c 20   6,  7,  8,  9, 
1f10: 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c 20  10, 11, 12, 13, 
1f20: 31 34 2c 20 31 35 2c 20 31 36 2c 20 31 37 2c 0a  14, 15, 16, 17,.
1f30: 20 20 20 20 20 31 38 2c 20 31 39 2c 20 32 30 2c       18, 19, 20,
1f40: 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c   21, 22, 23, 24,
1f50: 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c   25, 26, 27, 28,
1f60: 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32 2c   29, 30, 31, 32,
1f70: 20 33 33 2c 20 33 34 2c 20 33 35 2c 0a 20 20 20   33, 34, 35,.   
1f80: 20 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 33 39    36, 37, 38, 39
1f90: 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34 33  , 40, 41, 42, 43
1fa0: 2c 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37  , 44, 45, 46, 47
1fb0: 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31  , 48, 49, 50, 51
1fc0: 2c 20 35 32 2c 20 35 33 2c 0a 20 20 20 20 20 35  , 52, 53,.     5
1fd0: 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35  4, 55, 56, 57, 5
1fe0: 38 2c 20 35 39 2c 20 36 30 2c 20 36 31 2c 20 36  8, 59, 60, 61, 6
1ff0: 32 2c 20 36 33 2c 20 36 34 2c 20 39 37 2c 20 39  2, 63, 64, 97, 9
2000: 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30  8, 99,100,101,10
2010: 32 2c 31 30 33 2c 0a 20 20 20 20 31 30 34 2c 31  2,103,.    104,1
2020: 30 35 2c 31 30 36 2c 31 30 37 2c 31 30 38 2c 31  05,106,107,108,1
2030: 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31  09,110,111,112,1
2040: 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31  13,114,115,116,1
2050: 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31  17,118,119,120,1
2060: 32 31 2c 0a 20 20 20 20 31 32 32 2c 20 39 31 2c  21,.    122, 91,
2070: 20 39 32 2c 20 39 33 2c 20 39 34 2c 20 39 35 2c   92, 93, 94, 95,
2080: 20 39 36 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c   96, 97, 98, 99,
2090: 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c  100,101,102,103,
20a0: 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c  104,105,106,107,
20b0: 0a 20 20 20 20 31 30 38 2c 31 30 39 2c 31 31 30  .    108,109,110
20c0: 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31 34  ,111,112,113,114
20d0: 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31 38  ,115,116,117,118
20e0: 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 31 32 32  ,119,120,121,122
20f0: 2c 31 32 33 2c 31 32 34 2c 31 32 35 2c 0a 20 20  ,123,124,125,.  
2100: 20 20 31 32 36 2c 31 32 37 2c 31 32 38 2c 31 32    126,127,128,12
2110: 39 2c 31 33 30 2c 31 33 31 2c 31 33 32 2c 31 33  9,130,131,132,13
2120: 33 2c 31 33 34 2c 31 33 35 2c 31 33 36 2c 31 33  3,134,135,136,13
2130: 37 2c 31 33 38 2c 31 33 39 2c 31 34 30 2c 31 34  7,138,139,140,14
2140: 31 2c 31 34 32 2c 31 34 33 2c 0a 20 20 20 20 31  1,142,143,.    1
2150: 34 34 2c 31 34 35 2c 31 34 36 2c 31 34 37 2c 31  44,145,146,147,1
2160: 34 38 2c 31 34 39 2c 31 35 30 2c 31 35 31 2c 31  48,149,150,151,1
2170: 35 32 2c 31 35 33 2c 31 35 34 2c 31 35 35 2c 31  52,153,154,155,1
2180: 35 36 2c 31 35 37 2c 31 35 38 2c 31 35 39 2c 31  56,157,158,159,1
2190: 36 30 2c 31 36 31 2c 0a 20 20 20 20 31 36 32 2c  60,161,.    162,
21a0: 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 36 36 2c  163,164,165,166,
21b0: 31 36 37 2c 31 36 38 2c 31 36 39 2c 31 37 30 2c  167,168,169,170,
21c0: 31 37 31 2c 31 37 32 2c 31 37 33 2c 31 37 34 2c  171,172,173,174,
21d0: 31 37 35 2c 31 37 36 2c 31 37 37 2c 31 37 38 2c  175,176,177,178,
21e0: 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 31 38 31  179,.    180,181
21f0: 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38 35  ,182,183,184,185
2200: 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38 39  ,186,187,188,189
2210: 2c 31 39 30 2c 31 39 31 2c 31 39 32 2c 31 39 33  ,190,191,192,193
2220: 2c 31 39 34 2c 31 39 35 2c 31 39 36 2c 31 39 37  ,194,195,196,197
2230: 2c 0a 20 20 20 20 31 39 38 2c 31 39 39 2c 32 30  ,.    198,199,20
2240: 30 2c 32 30 31 2c 32 30 32 2c 32 30 33 2c 32 30  0,201,202,203,20
2250: 34 2c 32 30 35 2c 32 30 36 2c 32 30 37 2c 32 30  4,205,206,207,20
2260: 38 2c 32 30 39 2c 32 31 30 2c 32 31 31 2c 32 31  8,209,210,211,21
2270: 32 2c 32 31 33 2c 32 31 34 2c 32 31 35 2c 0a 20  2,213,214,215,. 
2280: 20 20 20 32 31 36 2c 32 31 37 2c 32 31 38 2c 32     216,217,218,2
2290: 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 32 2c 32  19,220,221,222,2
22a0: 32 33 2c 32 32 34 2c 32 32 35 2c 32 32 36 2c 32  23,224,225,226,2
22b0: 32 37 2c 32 32 38 2c 32 32 39 2c 32 33 30 2c 32  27,228,229,230,2
22c0: 33 31 2c 32 33 32 2c 32 33 33 2c 0a 20 20 20 20  31,232,233,.    
22d0: 32 33 34 2c 32 33 35 2c 32 33 36 2c 32 33 37 2c  234,235,236,237,
22e0: 32 33 38 2c 32 33 39 2c 32 34 30 2c 32 34 31 2c  238,239,240,241,
22f0: 32 34 32 2c 32 34 33 2c 32 34 34 2c 32 34 35 2c  242,243,244,245,
2300: 32 34 36 2c 32 34 37 2c 32 34 38 2c 32 34 39 2c  246,247,248,249,
2310: 32 35 30 2c 32 35 31 2c 0a 20 20 20 20 32 35 32  250,251,.    252
2320: 2c 32 35 33 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a  ,253,254,255.};.
2330: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2340: 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73 20 61 20  tion computes a 
2350: 68 61 73 68 20 6f 6e 20 74 68 65 20 6e 61 6d 65  hash on the name
2360: 20 6f 66 20 61 20 6b 65 79 77 6f 72 64 2e 0a 2a   of a keyword..*
2370: 2a 20 43 61 73 65 20 69 73 20 6e 6f 74 20 73 69  * Case is not si
2380: 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2f 0a 69 6e  gnificant..*/.in
2390: 74 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61  t sqliteHashNoCa
23a0: 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  se(const char *z
23b0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
23c0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a  h = 0;.  int c;.
23d0: 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d    if( n<=0 ) n =
23e0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68   strlen(z);.  wh
23f0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 26 26 20  ile( n-- > 0 && 
2400: 28 63 20 3d 20 2a 7a 2b 2b 29 21 3d 30 20 29 7b  (c = *z++)!=0 ){
2410: 0a 20 20 20 20 68 20 3d 20 68 3c 3c 33 20 5e 20  .    h = h<<3 ^ 
2420: 68 20 5e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  h ^ UpperToLower
2430: 5b 63 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68  [c];.  }.  if( h
2440: 3c 30 20 29 20 68 20 3d 20 2d 68 3b 0a 20 20 72  <0 ) h = -h;.  r
2450: 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn h;.}../*.*
2460: 2a 20 53 6f 6d 65 20 73 79 73 74 65 6d 20 73 68  * Some system sh
2470: 61 76 65 20 73 74 72 69 63 6d 70 28 29 2e 20 20  ave stricmp().  
2480: 4f 74 68 65 72 73 20 68 61 76 65 20 73 74 72 63  Others have strc
2490: 61 73 65 63 6d 70 28 29 2e 20 20 42 65 63 61 75  asecmp().  Becau
24a0: 73 65 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  se.** there is n
24b0: 6f 20 63 6f 6e 73 69 73 74 65 6e 63 79 2c 20 77  o consistency, w
24c0: 65 20 77 69 6c 6c 20 64 65 66 69 6e 65 20 6f 75  e will define ou
24d0: 72 20 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  r own..*/.int sq
24e0: 6c 69 74 65 53 74 72 49 43 6d 70 28 63 6f 6e 73  liteStrICmp(cons
24f0: 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63  t char *zLeft, c
2500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68  onst char *zRigh
2510: 74 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75  t){.  register u
2520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c  nsigned char *a,
2530: 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69   *b;.  a = (unsi
2540: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66  gned char *)zLef
2550: 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e  t;.  b = (unsign
2560: 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74  ed char *)zRight
2570: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 61 21 3d 30  ;.  while( *a!=0
2580: 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77 65 72   && UpperToLower
2590: 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77  [*a]==UpperToLow
25a0: 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b  er[*b]){ a++; b+
25b0: 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 61  +; }.  return *a
25c0: 20 2d 20 2a 62 3b 0a 7d 0a 69 6e 74 20 73 71 6c   - *b;.}.int sql
25d0: 69 74 65 53 74 72 4e 49 43 6d 70 28 63 6f 6e 73  iteStrNICmp(cons
25e0: 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63  t char *zLeft, c
25f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68  onst char *zRigh
2600: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67  t, int N){.  reg
2610: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63  ister unsigned c
2620: 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20  har *a, *b;.  a 
2630: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2640: 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20   *)zLeft;.  b = 
2650: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
2660: 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65  )zRight;.  while
2670: 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a 61 21  ( N-- > 0 && *a!
2680: 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77  =0 && UpperToLow
2690: 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c  er[*a]==UpperToL
26a0: 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20  ower[*b]){ a++; 
26b0: 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  b++; }.  return 
26c0: 4e 3c 30 20 3f 20 30 20 3a 20 2a 61 20 2d 20 2a  N<0 ? 0 : *a - *
26d0: 62 3b 0a 7d 0a 0a 2f 2a 20 4e 6f 74 65 73 20 6f  b;.}../* Notes o
26e0: 6e 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  n string compari
26f0: 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  sions..**.** We 
2700: 77 61 6e 74 20 74 68 65 20 6d 61 69 6e 20 73 74  want the main st
2710: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 69 6f 6e  ring comparision
2720: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 66   function used f
2730: 6f 72 20 73 6f 72 74 69 6e 67 20 74 6f 0a 2a 2a  or sorting to.**
2740: 20 73 6f 72 74 20 62 6f 74 68 20 6e 75 6d 62 65   sort both numbe
2750: 72 73 20 61 6e 64 20 61 6c 70 68 61 6e 75 6d 65  rs and alphanume
2760: 72 69 63 20 77 6f 72 64 73 20 69 6e 74 6f 20 74  ric words into t
2770: 68 65 20 63 6f 72 72 65 63 74 20 73 65 71 75 65  he correct seque
2780: 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 73 61 6d 65  nce..** The same
2790: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
27a0: 64 6f 20 62 6f 74 68 20 77 69 74 68 6f 75 74 20  do both without 
27b0: 70 72 69 6f 72 20 6b 6e 6f 77 6c 65 64 67 65 20  prior knowledge 
27c0: 6f 66 20 77 68 69 63 68 0a 2a 2a 20 74 79 70 65  of which.** type
27d0: 20 6f 66 20 74 65 78 74 20 74 68 65 20 69 6e 70   of text the inp
27e0: 75 74 20 72 65 70 72 65 73 65 6e 74 73 2e 20 20  ut represents.  
27f0: 49 74 20 73 68 6f 75 6c 64 20 65 76 65 6e 20 77  It should even w
2800: 6f 72 6b 20 66 6f 72 20 73 74 72 69 6e 67 73 0a  ork for strings.
2810: 2a 2a 20 77 68 69 63 68 20 61 72 65 20 61 20 6d  ** which are a m
2820: 69 78 74 75 72 65 20 6f 66 20 74 65 78 74 20 61  ixture of text a
2830: 6e 64 20 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a 2a  nd numbers..**.*
2840: 2a 20 54 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20  * To accomplish 
2850: 74 68 69 73 2c 20 77 65 20 6b 65 65 70 20 74 72  this, we keep tr
2860: 61 63 6b 20 6f 66 20 61 20 73 74 61 74 65 20 6e  ack of a state n
2870: 75 6d 62 65 72 20 77 68 69 6c 65 20 73 63 61 6e  umber while scan
2880: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 74 77 6f 20  ning.** the two 
2890: 73 74 72 69 6e 67 73 2e 20 20 54 68 65 20 73 74  strings.  The st
28a0: 61 74 65 73 20 61 72 65 20 61 73 20 66 6f 6c 6c  ates are as foll
28b0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 31 20  ows:.**.**    1 
28c0: 20 20 20 20 20 42 65 67 69 6e 6e 69 6e 67 20 6f       Beginning o
28d0: 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20 32 20 20  f word.**    2  
28e0: 20 20 20 20 41 72 62 69 74 72 61 72 79 20 74 65      Arbitrary te
28f0: 78 74 0a 2a 2a 20 20 20 20 33 20 20 20 20 20 20  xt.**    3      
2900: 49 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 34 20  Integer.**    4 
2910: 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 69 6e       Negative in
2920: 74 65 67 65 72 0a 2a 2a 20 20 20 20 35 20 20 20  teger.**    5   
2930: 20 20 20 52 65 61 6c 20 6e 75 6d 62 65 72 0a 2a     Real number.*
2940: 2a 20 20 20 20 36 20 20 20 20 20 20 4e 65 67 61  *    6      Nega
2950: 74 69 76 65 20 72 65 61 6c 0a 2a 2a 0a 2a 2a 20  tive real.**.** 
2960: 54 68 65 20 73 63 61 6e 20 62 65 67 69 6e 73 20  The scan begins 
2970: 69 6e 20 73 74 61 74 65 20 31 2c 20 62 65 67 69  in state 1, begi
2980: 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 2e 20 20  nning of word.  
2990: 54 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 6f  Transitions to o
29a0: 74 68 65 72 0a 2a 2a 20 73 74 61 74 65 73 20 61  ther.** states a
29b0: 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
29c0: 20 63 68 61 72 61 63 74 65 72 73 20 73 65 65 6e   characters seen
29d0: 2c 20 61 73 20 73 68 6f 77 6e 20 69 6e 20 74 68  , as shown in th
29e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 63  e following.** c
29f0: 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hart:.**.**     
2a00: 20 43 75 72 72 65 6e 74 20 53 74 61 74 65 20 20   Current State  
2a10: 20 20 20 20 20 20 20 43 68 61 72 61 63 74 65 72         Character
2a20: 20 53 65 65 6e 20 20 4e 65 77 20 53 74 61 74 65   Seen  New State
2a30: 0a 2a 2a 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  .**      -------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 42 65 67  --.**      0 Beg
2a80: 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 20 20  inning of word  
2a90: 20 22 2d 22 20 20 20 20 20 20 20 20 20 20 20 20   "-"            
2aa0: 20 33 20 4e 65 67 61 74 69 76 65 20 69 6e 74 65   3 Negative inte
2ab0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ger.**          
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20 20    digit         
2ae0: 20 20 32 20 49 6e 74 65 67 65 72 0a 2a 2a 20 20    2 Integer.**  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 73 70 61 63 65 20            space 
2b10: 20 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69            0 Begi
2b20: 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a  nning of word.**
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68 65              othe
2b50: 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41 72  rwise       1 Ar
2b60: 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a 0a  bitrary text.**.
2b70: 2a 2a 20 20 20 20 20 20 31 20 41 72 62 69 74 72  **      1 Arbitr
2b80: 61 72 79 20 74 65 78 74 20 20 20 20 20 20 73 70  ary text      sp
2b90: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30 20  ace           0 
2ba0: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72  Beginning of wor
2bb0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 64 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20  digit           
2be0: 32 20 49 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  2 Integer.**    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73          otherwis
2c10: 65 20 20 20 20 20 20 20 31 20 41 72 62 69 74 72  e       1 Arbitr
2c20: 61 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20  ary text.**.**  
2c30: 20 20 20 20 32 20 49 6e 74 65 67 65 72 20 20 20      2 Integer   
2c40: 20 20 20 20 20 20 20 20 20 20 73 70 61 63 65 20            space 
2c50: 20 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69            0 Begi
2c60: 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a  nning of word.**
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 22 2e 22 20              "." 
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 52 65              4 Re
2ca0: 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  al number.**    
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20          digit   
2cd0: 20 20 20 20 20 20 20 20 32 20 49 6e 74 65 67 65          2 Intege
2ce0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2d10: 31 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74  1 Arbitrary text
2d20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 20 4e 65  .**.**      3 Ne
2d30: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 20  gative integer  
2d40: 20 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20    space         
2d50: 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66    0 Beginning of
2d60: 20 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20   word.**        
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 20 22 2e 22 20 20 20 20 20 20 20 20 20      "."         
2d90: 20 20 20 20 35 20 4e 65 67 61 74 69 76 65 20 52      5 Negative R
2da0: 65 61 6c 20 6e 75 6d 0a 2a 2a 20 20 20 20 20 20  eal num.**      
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 20 64 69 67 69 74 20 20 20 20 20        digit     
2dd0: 20 20 20 20 20 20 33 20 4e 65 67 61 74 69 76 65        3 Negative
2de0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
2e10: 20 20 20 20 20 20 20 31 20 41 72 62 69 74 72 61         1 Arbitra
2e20: 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20  ry text.**.**   
2e30: 20 20 20 34 20 52 65 61 6c 20 6e 75 6d 62 65 72     4 Real number
2e40: 20 20 20 20 20 20 20 20 20 73 70 61 63 65 20 20           space  
2e50: 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69 6e           0 Begin
2e60: 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20  ning of word.** 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 20 20 20 64 69 67 69 74             digit
2e90: 20 20 20 20 20 20 20 20 20 20 20 34 20 52 65 61             4 Rea
2ea0: 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  l number.**     
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
2ed0: 20 20 20 20 20 20 20 31 20 41 72 62 69 74 72 61         1 Arbitra
2ee0: 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20  ry text.**.**   
2ef0: 20 20 20 35 20 4e 65 67 61 74 69 76 65 20 72 65     5 Negative re
2f00: 61 6c 20 6e 75 6d 20 20 20 73 70 61 63 65 20 20  al num   space  
2f10: 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69 6e           0 Begin
2f20: 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20  ning of word.** 
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 64 69 67 69 74             digit
2f50: 20 20 20 20 20 20 20 20 20 20 20 35 20 4e 65 67             5 Neg
2f60: 61 74 69 76 65 20 72 65 61 6c 20 6e 75 6d 0a 2a  ative real num.*
2f70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
2f90: 65 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41  erwise       1 A
2fa0: 72 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a  rbitrary text.**
2fb0: 0a 2a 2a 20 54 6f 20 69 6d 70 6c 65 6d 65 6e 74  .** To implement
2fc0: 20 74 68 69 73 20 73 74 61 74 65 20 6d 61 63 68   this state mach
2fd0: 69 6e 65 2c 20 77 65 20 66 69 72 73 74 20 63 6c  ine, we first cl
2fe0: 61 73 73 69 66 79 20 65 61 63 68 20 63 68 61 72  assify each char
2ff0: 61 63 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 6f 6e  acter.** into on
3000: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3010: 67 20 63 61 74 65 67 6f 72 69 65 73 3a 0a 2a 2a  g categories:.**
3020: 0a 2a 2a 20 20 20 20 20 20 30 20 20 54 65 78 74  .**      0  Text
3030: 0a 2a 2a 20 20 20 20 20 20 31 20 20 53 70 61 63  .**      1  Spac
3040: 65 0a 2a 2a 20 20 20 20 20 20 32 20 20 44 69 67  e.**      2  Dig
3050: 69 74 0a 2a 2a 20 20 20 20 20 20 33 20 20 22 2d  it.**      3  "-
3060: 22 0a 2a 2a 20 20 20 20 20 20 34 20 20 22 2e 22  ".**      4  "."
3070: 0a 2a 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  .**.** Given an 
3080: 61 72 62 69 74 72 61 72 79 20 63 68 61 72 61 63  arbitrary charac
3090: 74 65 72 2c 20 74 68 65 20 61 72 72 61 79 20 63  ter, the array c
30a0: 68 61 72 43 6c 61 73 73 5b 5d 20 6d 61 70 73 20  harClass[] maps 
30b0: 74 68 61 74 20 63 68 61 72 61 63 74 65 72 0a 2a  that character.*
30c0: 2a 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68  * into one of th
30d0: 65 20 61 74 6f 76 65 20 63 61 74 65 67 6f 72 69  e atove categori
30e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
30f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3100: 72 20 63 68 61 72 43 6c 61 73 73 5b 5d 20 3d 20  r charClass[] = 
3110: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 78 30 20  {.        /* x0 
3120: 78 31 20 78 32 20 78 33 20 78 34 20 78 35 20 78  x1 x2 x3 x4 x5 x
3130: 36 20 78 37 20 78 38 20 78 39 20 78 41 20 78 42  6 x7 x8 x9 xA xB
3140: 20 78 43 20 78 44 20 78 45 20 78 46 20 2a 2f 0a   xC xD xE xF */.
3150: 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c 20 30 2c  /* 0x */   0, 0,
3160: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3170: 30 2c 20 30 2c 20 31 2c 20 31 2c 20 30 2c 20 31  0, 0, 1, 1, 0, 1
3180: 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 31 78  , 0, 0, 0,./* 1x
3190: 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   */   0, 0, 0, 0
31a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
31b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
31c0: 30 2c 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20  0, 0,./* 2x */  
31d0: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
31e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
31f0: 2c 20 30 2c 20 30 2c 20 33 2c 20 34 2c 20 30 2c  , 0, 0, 3, 4, 0,
3200: 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 32 2c 20 32  ./* 3x */   2, 2
3210: 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c  , 2, 2, 2, 2, 2,
3220: 20 32 2c 20 32 2c 20 32 2c 20 30 2c 20 30 2c 20   2, 2, 2, 0, 0, 
3230: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 34  0, 0, 0, 0,./* 4
3240: 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20  x */   0, 0, 0, 
3250: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3260: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3270: 20 30 2c 20 30 2c 0a 2f 2a 20 35 78 20 2a 2f 20   0, 0,./* 5x */ 
3280: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
3290: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
32a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
32b0: 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20  ,./* 6x */   0, 
32c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
32d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
32e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20   0, 0, 0, 0,./* 
32f0: 37 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c  7x */   0, 0, 0,
3300: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3310: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3320: 2c 20 30 2c 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f  , 0, 0,./* 8x */
3330: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
3340: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3350: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3360: 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c  0,./* 9x */   0,
3370: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3380: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3390: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a  , 0, 0, 0, 0,./*
33a0: 20 41 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30   Ax */   0, 0, 0
33b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
33c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
33d0: 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 42 78 20 2a  0, 0, 0,./* Bx *
33e0: 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  /   0, 0, 0, 0, 
33f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3400: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3410: 20 30 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30   0,./* Cx */   0
3420: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3430: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3440: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f  0, 0, 0, 0, 0,./
3450: 2a 20 44 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20  * Dx */   0, 0, 
3460: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3470: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3480: 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 45 78 20   0, 0, 0,./* Ex 
3490: 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  */   0, 0, 0, 0,
34a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
34b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
34c0: 2c 20 30 2c 0a 2f 2a 20 46 78 20 2a 2f 20 20 20  , 0,./* Fx */   
34d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
34e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
34f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
3500: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 5f 43 48 41  };.#define N_CHA
3510: 52 5f 43 4c 41 53 53 20 35 0a 0a 2f 2a 0a 2a 2a  R_CLASS 5../*.**
3520: 20 47 69 76 65 6e 20 74 68 65 20 63 75 72 72 65   Given the curre
3530: 6e 74 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  nt state number 
3540: 28 30 20 74 68 72 75 20 35 29 2c 20 74 68 69 73  (0 thru 5), this
3550: 20 61 72 72 61 79 20 66 69 67 75 72 65 73 0a 2a   array figures.*
3560: 2a 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 20  * the new state 
3570: 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 74 68 65  number given the
3580: 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73   character class
3590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
35a0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
35b0: 73 74 61 74 65 4d 61 63 68 69 6e 65 5b 5d 20 3d  stateMachine[] =
35c0: 20 7b 0a 20 2f 2a 20 54 65 78 74 2c 20 20 53 70   {. /* Text,  Sp
35d0: 61 63 65 2c 20 44 69 67 69 74 2c 20 22 2d 22 2c  ace, Digit, "-",
35e0: 20 22 2e 22 20 2a 2f 0a 20 20 20 20 20 20 31 2c   "." */.      1,
35f0: 20 20 20 20 20 20 30 2c 20 20 20 20 32 2c 20 20        0,    2,  
3600: 20 20 33 2c 20 20 20 31 2c 20 20 20 20 20 20 2f    3,   1,      /
3610: 2a 20 53 74 61 74 65 20 30 3a 20 42 65 67 69 6e  * State 0: Begin
3620: 6e 69 6e 67 20 6f 66 20 77 6f 72 64 20 2a 2f 0a  ning of word */.
3630: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 30 2c        1,      0,
3640: 20 20 20 20 32 2c 20 20 20 20 31 2c 20 20 20 31      2,    1,   1
3650: 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20  ,      /* State 
3660: 31 3a 20 41 72 62 69 74 72 61 72 79 20 74 65 78  1: Arbitrary tex
3670: 74 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20  t */.      1,   
3680: 20 20 20 30 2c 20 20 20 20 32 2c 20 20 20 20 31     0,    2,    1
3690: 2c 20 20 20 34 2c 20 20 20 20 20 20 2f 2a 20 53  ,   4,      /* S
36a0: 74 61 74 65 20 32 3a 20 49 6e 74 65 67 65 72 20  tate 2: Integer 
36b0: 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20  */.      1,     
36c0: 20 30 2c 20 20 20 20 33 2c 20 20 20 20 31 2c 20   0,    3,    1, 
36d0: 20 20 35 2c 20 20 20 20 20 20 2f 2a 20 53 74 61    5,      /* Sta
36e0: 74 65 20 33 3a 20 4e 65 67 61 74 69 76 65 20 69  te 3: Negative i
36f0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
3700: 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20 34 2c  1,      0,    4,
3710: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 20 20      1,   1,     
3720: 20 2f 2a 20 53 74 61 74 65 20 34 3a 20 52 65 61   /* State 4: Rea
3730: 6c 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  l number */.    
3740: 20 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20    1,      0,    
3750: 35 2c 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20  5,    1,   1,   
3760: 20 20 20 2f 2a 20 53 74 61 74 65 20 35 3a 20 4e     /* State 5: N
3770: 65 67 61 74 69 76 65 20 72 65 61 6c 20 6e 75 6d  egative real num
3780: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20   */.};../* This 
3790: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
37a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
37b0: 20 73 74 72 69 6e 67 73 2e 20 20 43 61 73 65 20   strings.  Case 
37c0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 0a 2a 2a 20  is used only.** 
37d0: 69 66 20 75 73 65 43 61 73 65 21 3d 30 2e 20 20  if useCase!=0.  
37e0: 4e 75 6d 62 65 72 73 20 63 6f 6d 70 61 72 65 20  Numbers compare 
37f0: 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64  in numerical ord
3800: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3810: 74 20 70 72 69 76 61 74 65 53 74 72 43 6d 70 28  t privateStrCmp(
3820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 74 65 78  const char *atex
3830: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  t, const char *b
3840: 74 65 78 74 2c 20 69 6e 74 20 75 73 65 43 61 73  text, int useCas
3850: 65 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75  e){.  register u
3860: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c  nsigned char *a,
3870: 20 2a 62 2c 20 2a 6d 61 70 2c 20 63 61 2c 20 63   *b, *map, ca, c
3880: 62 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  b;.  int result;
3890: 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20  .  register int 
38a0: 63 63 6c 61 73 73 20 3d 20 30 3b 0a 0a 20 20 61  cclass = 0;..  a
38b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
38c0: 72 20 2a 29 61 74 65 78 74 3b 0a 20 20 62 20 3d  r *)atext;.  b =
38d0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
38e0: 2a 29 62 74 65 78 74 3b 0a 20 20 69 66 28 20 75  *)btext;.  if( u
38f0: 73 65 43 61 73 65 20 29 7b 0a 20 20 20 20 64 6f  seCase ){.    do
3900: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 63 61 3d  {.      if( (ca=
3910: 20 2a 61 2b 2b 29 21 3d 28 63 62 3d 20 2a 62 2b   *a++)!=(cb= *b+
3920: 2b 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  +) ) break;.    
3930: 20 20 63 63 6c 61 73 73 20 3d 20 73 74 61 74 65    cclass = state
3940: 4d 61 63 68 69 6e 65 5b 63 63 6c 61 73 73 2a 4e  Machine[cclass*N
3950: 5f 43 48 41 52 5f 43 4c 41 53 53 20 2b 20 63 68  _CHAR_CLASS + ch
3960: 61 72 43 6c 61 73 73 5b 63 61 5d 5d 3b 0a 20 20  arClass[ca]];.  
3970: 20 20 7d 77 68 69 6c 65 28 20 63 61 21 3d 30 20    }while( ca!=0 
3980: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3990: 6d 61 70 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77  map = UpperToLow
39a0: 65 72 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  er;.    do{.    
39b0: 20 20 69 66 28 20 28 63 61 3d 6d 61 70 5b 2a 61    if( (ca=map[*a
39c0: 2b 2b 5d 29 21 3d 28 63 62 3d 6d 61 70 5b 2a 62  ++])!=(cb=map[*b
39d0: 2b 2b 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ++]) ) break;.  
39e0: 20 20 20 20 63 63 6c 61 73 73 20 3d 20 73 74 61      cclass = sta
39f0: 74 65 4d 61 63 68 69 6e 65 5b 63 63 6c 61 73 73  teMachine[cclass
3a00: 2a 4e 5f 43 48 41 52 5f 43 4c 41 53 53 20 2b 20  *N_CHAR_CLASS + 
3a10: 63 68 61 72 43 6c 61 73 73 5b 63 61 5d 5d 3b 0a  charClass[ca]];.
3a20: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 61 21 3d      }while( ca!=
3a30: 30 20 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  0 );.  }.  switc
3a40: 68 28 20 63 63 6c 61 73 73 20 29 7b 0a 20 20 20  h( cclass ){.   
3a50: 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
3a60: 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  e 1: {.      if(
3a70: 20 69 73 64 69 67 69 74 28 63 61 29 20 26 26 20   isdigit(ca) && 
3a80: 69 73 64 69 67 69 74 28 63 62 29 20 29 7b 0a 20  isdigit(cb) ){. 
3a90: 20 20 20 20 20 20 20 63 63 6c 61 73 73 20 3d 20         cclass = 
3aa0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
3ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3ac0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
3ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ae0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 63 63    }.  switch( cc
3af0: 6c 61 73 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lass ){.    case
3b00: 20 32 3a 0a 20 20 20 20 63 61 73 65 20 33 3a 20   2:.    case 3: 
3b10: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 64 69  {.      if( isdi
3b20: 67 69 74 28 63 61 29 20 29 7b 0a 20 20 20 20 20  git(ca) ){.     
3b30: 20 20 20 69 66 28 20 69 73 64 69 67 69 74 28 63     if( isdigit(c
3b40: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
3b50: 69 6e 74 20 61 63 6e 74 2c 20 62 63 6e 74 3b 0a  int acnt, bcnt;.
3b60: 20 20 20 20 20 20 20 20 20 20 61 63 6e 74 20 3d            acnt =
3b70: 20 62 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20   bcnt = 0;.     
3b80: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
3b90: 67 69 74 28 2a 61 2b 2b 29 20 29 20 61 63 6e 74  git(*a++) ) acnt
3ba0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  ++;.          wh
3bb0: 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 62 2b  ile( isdigit(*b+
3bc0: 2b 29 20 29 20 62 63 6e 74 2b 2b 3b 0a 20 20 20  +) ) bcnt++;.   
3bd0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
3be0: 61 63 6e 74 20 2d 20 62 63 6e 74 3b 0a 20 20 20  acnt - bcnt;.   
3bf0: 20 20 20 20 20 20 20 69 66 28 20 72 65 73 75 6c         if( resul
3c00: 74 3d 3d 30 20 29 20 72 65 73 75 6c 74 20 3d 20  t==0 ) result = 
3c10: 63 61 2d 63 62 3b 0a 20 20 20 20 20 20 20 20 7d  ca-cb;.        }
3c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3c30: 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20  result = 1;.    
3c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
3c50: 65 20 69 66 28 20 69 73 64 69 67 69 74 28 63 62  e if( isdigit(cb
3c60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  ) ){.        res
3c70: 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ult = -1;.      
3c80: 7d 65 6c 73 65 20 69 66 28 20 63 61 3d 3d 27 2e  }else if( ca=='.
3c90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  ' ){.        res
3ca0: 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ult = 1;.      }
3cb0: 65 6c 73 65 20 69 66 28 20 63 62 3d 3d 27 2e 27  else if( cb=='.'
3cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75   ){.        resu
3cd0: 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  lt = -1;.      }
3ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
3cf0: 73 75 6c 74 20 3d 20 63 61 20 2d 20 63 62 3b 0a  sult = ca - cb;.
3d00: 20 20 20 20 20 20 20 20 63 63 6c 61 73 73 20 3d          cclass =
3d10: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
3d20: 20 20 69 66 28 20 63 63 6c 61 73 73 3d 3d 33 20    if( cclass==3 
3d30: 29 20 72 65 73 75 6c 74 20 3d 20 2d 72 65 73 75  ) result = -resu
3d40: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
3d50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3d60: 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
3d70: 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
3d80: 20 20 20 72 65 73 75 6c 74 20 3d 20 63 61 20 2d     result = ca -
3d90: 20 63 62 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   cb;.      break
3da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3db0: 20 35 3a 20 7b 0a 20 20 20 20 20 20 72 65 73 75   5: {.      resu
3dc0: 6c 74 20 3d 20 63 62 20 2d 20 63 61 3b 0a 20 20  lt = cb - ca;.  
3dd0: 20 20 7d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    };.  }.  retur
3de0: 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20  n result;.}../* 
3df0: 54 68 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 20  This comparison 
3e00: 72 6f 75 74 69 6e 65 20 69 73 20 77 68 61 74 20  routine is what 
3e10: 77 65 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61  we use for compa
3e20: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
3e30: 0a 2a 2a 20 69 6e 20 61 6e 20 53 51 4c 20 65 78  .** in an SQL ex
3e40: 70 72 65 73 73 69 6f 6e 2e 20 20 28 45 78 3a 20  pression.  (Ex: 
3e50: 20 6e 61 6d 65 3c 27 48 65 6c 6c 6f 27 20 6f 72   name<'Hello' or
3e60: 20 76 61 6c 75 65 3c 35 29 2e 20 20 43 6f 6d 70   value<5).  Comp
3e70: 61 72 65 20 74 77 6f 0a 2a 2a 20 73 74 72 69 6e  are two.** strin
3e80: 67 73 2e 20 20 55 73 65 20 63 61 73 65 20 6f 6e  gs.  Use case on
3e90: 6c 79 20 61 73 20 61 20 74 69 65 2d 62 72 65 61  ly as a tie-brea
3ea0: 6b 65 72 2e 20 20 4e 75 6d 62 65 72 73 20 63 6f  ker.  Numbers co
3eb0: 6d 70 61 72 65 20 69 6e 0a 2a 2a 20 6e 75 6d 65  mpare in.** nume
3ec0: 72 69 63 61 6c 20 6f 72 64 65 72 2e 0a 2a 2f 0a  rical order..*/.
3ed0: 69 6e 74 20 73 71 6c 69 74 65 43 6f 6d 70 61 72  int sqliteCompar
3ee0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 74  e(const char *at
3ef0: 65 78 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ext, const char 
3f00: 2a 62 74 65 78 74 29 7b 0a 20 20 69 6e 74 20 72  *btext){.  int r
3f10: 65 73 75 6c 74 3b 0a 20 20 72 65 73 75 6c 74 20  esult;.  result 
3f20: 3d 20 70 72 69 76 61 74 65 53 74 72 43 6d 70 28  = privateStrCmp(
3f30: 61 74 65 78 74 2c 20 62 74 65 78 74 2c 20 30 29  atext, btext, 0)
3f40: 3b 0a 20 20 69 66 28 20 72 65 73 75 6c 74 3d 3d  ;.  if( result==
3f50: 30 20 29 20 72 65 73 75 6c 74 20 3d 20 70 72 69  0 ) result = pri
3f60: 76 61 74 65 53 74 72 43 6d 70 28 61 74 65 78 74  vateStrCmp(atext
3f70: 2c 20 62 74 65 78 74 2c 20 31 29 3b 0a 20 20 72  , btext, 1);.  r
3f80: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a  eturn result;.}.
3f90: 0a 2f 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6f  ./*.** If you co
3fa0: 6d 70 69 6c 65 20 6a 75 73 74 20 74 68 69 73 20  mpile just this 
3fb0: 6f 6e 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  one file with th
3fc0: 65 20 2d 44 54 45 53 54 5f 43 4f 4d 50 41 52 45  e -DTEST_COMPARE
3fd0: 3d 31 20 6f 70 74 69 6f 6e 2c 0a 2a 2a 20 69 74  =1 option,.** it
3fe0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 70 72 6f   generates a pro
3ff0: 67 72 61 6d 20 74 6f 20 74 65 73 74 20 74 68 65  gram to test the
4000: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 72 6f 75   comparisons rou
4010: 74 69 6e 65 73 2e 20 20 0a 2a 2f 0a 23 69 66 64  tines.  .*/.#ifd
4020: 65 66 20 54 45 53 54 5f 43 4f 4d 50 41 52 45 0a  ef TEST_COMPARE.
4030: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
4040: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
4050: 64 69 6f 2e 68 3e 0a 69 6e 74 20 73 6f 72 74 43  dio.h>.int sortC
4060: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  mp(const char **
4070: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  a, const char **
4080: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
4090: 69 74 65 43 6f 6d 70 61 72 65 28 2a 61 2c 20 2a  iteCompare(*a, *
40a0: 62 29 3b 0a 7d 0a 69 6e 74 20 6d 61 69 6e 28 69  b);.}.int main(i
40b0: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
40c0: 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20  argv){.  int i, 
40d0: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 73 74 61 74 69  j, k, n;.  stati
40e0: 63 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  c char *azStr[] 
40f0: 3d 20 7b 0a 20 20 20 20 20 22 61 62 63 22 2c 20  = {.     "abc", 
4100: 22 61 42 63 22 2c 20 22 61 62 63 64 22 2c 20 22  "aBc", "abcd", "
4110: 61 42 63 64 22 2c 20 0a 20 20 20 20 20 22 31 32  aBcd", .     "12
4120: 33 22 2c 20 22 31 32 34 22 2c 20 22 31 32 33 34  3", "124", "1234
4130: 22 2c 20 22 2d 31 32 33 22 2c 20 22 2d 31 32 34  ", "-123", "-124
4140: 22 2c 20 22 2d 31 32 33 34 22 2c 20 0a 20 20 20  ", "-1234", .   
4150: 20 20 22 31 32 33 2e 34 35 22 2c 20 22 31 32 33    "123.45", "123
4160: 2e 34 35 36 22 2c 20 22 31 32 33 2e 34 36 22 2c  .456", "123.46",
4170: 20 22 2d 31 32 33 2e 34 35 22 2c 20 22 2d 31 32   "-123.45", "-12
4180: 33 2e 34 36 22 2c 20 22 2d 31 32 33 2e 34 35 36  3.46", "-123.456
4190: 22 2c 20 0a 20 20 20 20 20 22 78 39 22 2c 20 22  ", .     "x9", "
41a0: 78 31 30 22 2c 20 22 78 2d 39 22 2c 20 22 78 2d  x10", "x-9", "x-
41b0: 31 30 22 2c 20 22 58 39 22 2c 20 22 58 31 30 22  10", "X9", "X10"
41c0: 2c 0a 20 20 7d 3b 0a 20 20 6e 20 3d 20 73 69 7a  ,.  };.  n = siz
41d0: 65 6f 66 28 61 7a 53 74 72 29 2f 73 69 7a 65 6f  eof(azStr)/sizeo
41e0: 66 28 61 7a 53 74 72 5b 30 5d 29 3b 0a 20 20 71  f(azStr[0]);.  q
41f0: 73 6f 72 74 28 61 7a 53 74 72 2c 20 6e 2c 20 73  sort(azStr, n, s
4200: 69 7a 65 6f 66 28 61 7a 53 74 72 5b 30 5d 29 2c  izeof(azStr[0]),
4210: 20 73 6f 72 74 43 6d 70 29 3b 0a 20 20 66 6f 72   sortCmp);.  for
4220: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
4230: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c  .    printf("%s\
4240: 6e 22 2c 20 61 7a 53 74 72 5b 69 5d 29 3b 0a 20  n", azStr[i]);. 
4250: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 53 61 6e   }.  printf("San
4260: 69 74 79 31 2e 2e 2e 22 29 3b 0a 20 20 66 66 6c  ity1...");.  ffl
4270: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66  ush(stdout);.  f
4280: 6f 72 28 69 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69  or(i=0; i<n-1; i
4290: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  ++){.    char *a
42a0: 20 3d 20 61 7a 53 74 72 5b 69 5d 3b 0a 20 20 20   = azStr[i];.   
42b0: 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6e 3b   for(j=i+1; j<n;
42c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   j++){.      cha
42d0: 72 20 2a 62 20 3d 20 61 7a 53 74 72 5b 6a 5d 3b  r *b = azStr[j];
42e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
42f0: 65 43 6f 6d 70 61 72 65 28 61 2c 62 29 20 21 3d  eCompare(a,b) !=
4300: 20 2d 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28   -sqliteCompare(
4310: 62 2c 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b,a) ){.        
4320: 70 72 69 6e 74 66 28 22 46 61 69 6c 65 64 21 20  printf("Failed! 
4330: 20 5c 22 25 73 5c 22 20 76 73 20 5c 22 25 73 5c   \"%s\" vs \"%s\
4340: 22 5c 6e 22 2c 20 61 2c 20 62 29 3b 0a 20 20 20  "\n", a, b);.   
4350: 20 20 20 20 20 69 20 3d 20 6a 20 3d 20 6e 3b 0a       i = j = n;.
4360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4370: 7d 0a 20 20 69 66 28 20 69 3c 6e 20 29 7b 0a 20  }.  if( i<n ){. 
4380: 20 20 20 70 72 69 6e 74 66 28 22 20 4f 4b 5c 6e     printf(" OK\n
4390: 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
43a0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
43b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
43c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72   is used for sor
43d0: 74 69 6e 67 2e 20 20 45 61 63 68 20 6b 65 79 20  ting.  Each key 
43e0: 69 73 20 61 20 6c 69 73 74 20 6f 6e 65 20 6f 72  is a list one or
43f0: 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c 6c 2d 74 65   more.** null-te
4400: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73  rminated strings
4410: 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
4420: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 74 77 6f  erminated by two
4430: 20 6e 75 6c 6c 20 69 6e 0a 2a 2a 20 61 20 72 6f   null in.** a ro
4440: 77 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  w.  For example,
4450: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
4460: 65 78 74 20 69 73 20 73 74 72 69 6e 67 73 3a 0a  ext is strings:.
4470: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
4480: 20 2b 6f 6e 65 5c 30 30 30 2d 74 77 6f 5c 30 30   +one\000-two\00
4490: 30 2b 74 68 72 65 65 5c 30 30 30 5c 30 30 30 0a  0+three\000\000.
44a0: 2a 2a 0a 2a 2a 20 42 6f 74 68 20 61 72 67 75 6d  **.** Both argum
44b0: 65 6e 74 73 20 77 69 6c 6c 20 68 61 76 65 20 74  ents will have t
44c0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
44d0: 66 20 73 74 72 69 6e 67 73 2e 20 20 54 68 69 73  f strings.  This
44e0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
44f0: 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  rns negative, ze
4500: 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
4510: 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
4520: 75 6d 65 6e 74 20 69 73 20 6c 65 73 73 0a 2a 2a  ument is less.**
4530: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
4540: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
4550: 20 74 68 65 20 66 69 72 73 74 2e 20 20 28 52 65   the first.  (Re
4560: 73 75 6c 74 20 69 73 20 61 2d 62 29 2e 0a 2a 2a  sult is a-b)..**
4570: 0a 2a 2a 20 45 76 65 72 79 20 73 74 72 69 6e 67  .** Every string
4580: 20 62 65 67 69 6e 73 20 77 69 74 68 20 65 69 74   begins with eit
4590: 68 65 72 20 61 20 22 2b 22 20 6f 72 20 22 2d 22  her a "+" or "-"
45a0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 49 66 20   character.  If 
45b0: 74 68 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  the.** character
45c0: 20 69 73 20 22 2d 22 20 74 68 65 6e 20 74 68 65   is "-" then the
45d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
45e0: 20 6e 65 67 61 74 65 64 2e 20 20 54 68 69 73 20   negated.  This 
45f0: 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20 69 6d  is done.** to im
4600: 70 6c 65 6d 65 6e 74 20 61 20 73 6f 72 74 20 69  plement a sort i
4610: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
4620: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
4630: 65 53 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e  eSortCompare(con
4640: 73 74 20 63 68 61 72 20 2a 61 2c 20 63 6f 6e 73  st char *a, cons
4650: 74 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 69 6e  t char *b){.  in
4660: 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 72 65 73  t len;.  int res
4670: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
4680: 72 65 73 3d 3d 30 20 26 26 20 2a 61 20 26 26 20  res==0 && *a && 
4690: 2a 62 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  *b ){.    res = 
46a0: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 26 61  sqliteCompare(&a
46b0: 5b 31 5d 2c 20 26 62 5b 31 5d 29 3b 0a 20 20 20  [1], &b[1]);.   
46c0: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
46d0: 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65       len = strle
46e0: 6e 28 61 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n(a) + 1;.      
46f0: 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  a += len;.      
4700: 62 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  b += len;.    }.
4710: 20 20 7d 0a 20 20 69 66 28 20 2a 61 3d 3d 27 2d    }.  if( *a=='-
4720: 27 20 29 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a  ' ) res = -res;.
4730: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
4740: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
4750: 77 6f 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65  wo strings for e
4760: 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74 68  quality where th
4770: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 63  e first string c
4780: 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  an.** potentiall
4790: 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78  y be a "glob" ex
47a0: 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72  pression.  Retur
47b0: 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  n true (1) if th
47c0: 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  ey.** are the sa
47d0: 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29  me and false (0)
47e0: 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69 66   if they are dif
47f0: 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c  ferent..**.** Gl
4800: 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
4810: 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
4820: 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
4830: 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
4840: 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
4850: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
4860: 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
4870: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
4880: 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
4890: 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
48a0: 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
48b0: 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
48c0: 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
48e0: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
48f0: 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
4900: 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
4910: 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
4920: 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
4930: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b  **.** With the [
4940: 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20  ...] and [^...] 
4950: 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20  matching, a ']' 
4960: 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62 65  character can be
4970: 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20   included.** in 
4980: 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69  the list by maki
4990: 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74 20  ng it the first 
49a0: 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20  character after 
49b0: 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a  '[' or '^'.  A.*
49c0: 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61  * range of chara
49d0: 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70 65  cters can be spe
49e0: 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27  cified using '-'
49f0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22  .  Example:.** "
4a00: 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61  [a-z]" matches a
4a10: 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d  ny single lower-
4a20: 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f  case letter.  To
4a30: 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61   match a '-', ma
4a40: 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73  ke.** it the las
4a50: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  t character in t
4a60: 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  he list..**.** T
4a70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4a80: 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75  sually quick, bu
4a90: 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e  t can be N**2 in
4aa0: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
4ab0: 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f  .**.** Hints: to
4ac0: 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f   match '*' or '?
4ad0: 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22  ', put them in "
4ae0: 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  []".  Like this:
4af0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  .**.**         a
4b00: 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20  bc[*]xyz        
4b10: 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a  Matches "abc*xyz
4b20: 22 20 6f 6e 6c 79 0a 2a 2f 0a 69 6e 74 20 73 71  " only.*/.int sq
4b30: 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61 72 65 28  liteGlobCompare(
4b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
4b50: 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  tern, const char
4b60: 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72 65   *zString){.  re
4b70: 67 69 73 74 65 72 20 63 68 61 72 20 63 3b 0a 20  gister char c;. 
4b80: 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
4b90: 6e 74 20 73 65 65 6e 3b 0a 20 20 63 68 61 72 20  nt seen;.  char 
4ba0: 63 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63  c2;..  while( (c
4bb0: 20 3d 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d 30   = *zPattern)!=0
4bc0: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
4bd0: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
4be0: 27 2a 27 3a 0a 20 20 20 20 20 20 20 20 77 68 69  '*':.        whi
4bf0: 6c 65 28 20 7a 50 61 74 74 65 72 6e 5b 31 5d 3d  le( zPattern[1]=
4c00: 3d 27 2a 27 20 29 20 7a 50 61 74 74 65 72 6e 2b  ='*' ) zPattern+
4c10: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  +;.        if( z
4c20: 50 61 74 74 65 72 6e 5b 31 5d 3d 3d 30 20 29 20  Pattern[1]==0 ) 
4c30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4c40: 20 20 63 20 3d 20 7a 50 61 74 74 65 72 6e 5b 31    c = zPattern[1
4c50: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
4c60: 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  =='[' || c=='?' 
4c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
4c80: 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26 26 20  le( *zString && 
4c90: 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61 72  sqliteGlobCompar
4ca0: 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 2c 7a  e(&zPattern[1],z
4cb0: 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20 20  String)==0 ){.  
4cc0: 20 20 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e            zStrin
4cd0: 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  g++;.          }
4ce0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4cf0: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
4d00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4d10: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
4d20: 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d  c2 = *zString)!=
4d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
4d40: 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20   while( c2 != 0 
4d50: 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32  && c2 != c ){ c2
4d60: 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d   = *++zString; }
4d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4d80: 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
4d90: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
4da0: 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d  f( sqliteGlobCom
4db0: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
4dc0: 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65 74  ],zString) ) ret
4dd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
4de0: 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20     zString++;.  
4df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4e00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4e20: 73 65 20 27 3f 27 3a 0a 20 20 20 20 20 20 20 20  se '?':.        
4e30: 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  if( *zString==0 
4e40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
4e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e60: 20 63 61 73 65 20 27 5b 27 3a 0a 20 20 20 20 20   case '[':.     
4e70: 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
4e80: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
4e90: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 7a 53  .        c = *zS
4ea0: 74 72 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 69  tring;.        i
4eb0: 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
4ec0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   0;.        c2 =
4ed0: 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20 20   *++zPattern;.  
4ee0: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e        if( c2=='^
4ef0: 27 20 29 7b 20 69 6e 76 65 72 74 20 3d 20 31 3b  ' ){ invert = 1;
4f00: 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72   c2 = *++zPatter
4f10: 6e 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  n; }.        if(
4f20: 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2==']' ){.    
4f30: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27        if( c==']'
4f40: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
4f50: 20 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a         c2 = *++z
4f60: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 20  Pattern;.       
4f70: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
4f80: 28 20 28 63 32 20 3d 20 2a 7a 50 61 74 74 65 72  ( (c2 = *zPatter
4f90: 6e 29 21 3d 30 20 26 26 20 63 32 21 3d 27 5d 27  n)!=0 && c2!=']'
4fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
4fb0: 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50 61  ( c2=='-' && zPa
4fc0: 74 74 65 72 6e 5b 31 5d 21 3d 27 5d 27 20 26 26  ttern[1]!=']' &&
4fd0: 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 30 20   zPattern[1]!=0 
4fe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
4ff0: 66 28 20 63 3e 7a 50 61 74 74 65 72 6e 5b 2d 31  f( c>zPattern[-1
5000: 5d 20 26 26 20 63 3c 7a 50 61 74 74 65 72 6e 5b  ] && c<zPattern[
5010: 31 5d 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  1] ) seen = 1;. 
5020: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
5030: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
5040: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
5050: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5060: 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e          zPattern
5070: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
5080: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
5090: 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
50a0: 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
50b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
50c0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
50d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21 3d          if( c !=
50e0: 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65 74 75   *zString ) retu
50f0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72  rn 0;.        br
5100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  eak;.    }.    z
5110: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7a  Pattern++;.    z
5120: 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 7d 0a 20 20  String++;.  }.  
5130: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d  return *zString=
5140: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  =0;.}../*.** Com
5150: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
5160: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 75 73   for equality us
5170: 69 6e 67 20 74 68 65 20 22 4c 49 4b 45 22 20 6f  ing the "LIKE" o
5180: 70 65 72 61 74 6f 72 20 6f 66 0a 2a 2a 20 53 51  perator of.** SQ
5190: 4c 2e 20 20 54 68 65 20 27 25 27 20 63 68 61 72  L.  The '%' char
51a0: 61 63 74 65 72 20 6d 61 74 63 68 65 73 20 61 6e  acter matches an
51b0: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 30 20  y sequence of 0 
51c0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 68 61 72 61  or more.** chara
51d0: 63 74 65 72 73 20 61 6e 64 20 27 5f 27 20 6d 61  cters and '_' ma
51e0: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
51f0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 43 61 73   character.  Cas
5200: 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 73 69 67 6e  e is.** not sign
5210: 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  ificant..**.** T
5220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
5230: 75 73 74 20 61 6e 20 61 64 61 70 74 61 74 69 6f  ust an adaptatio
5240: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 47  n of the sqliteG
5250: 6c 6f 62 43 6f 6d 70 61 72 65 28 29 0a 2a 2a 20  lobCompare().** 
5260: 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 0a 2a  routine above..*
5270: 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 4c 69 6b  /.int .sqliteLik
5280: 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75  eCompare(const u
5290: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50  nsigned char *zP
52a0: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e  attern, const un
52b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74  signed char *zSt
52c0: 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65  ring){.  registe
52d0: 72 20 63 68 61 72 20 63 3b 0a 20 20 63 68 61 72  r char c;.  char
52e0: 20 63 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28   c2;..  while( (
52f0: 63 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  c = UpperToLower
5300: 5b 2a 7a 50 61 74 74 65 72 6e 5d 29 21 3d 30 20  [*zPattern])!=0 
5310: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  ){.    switch( c
5320: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27   ){.      case '
5330: 25 27 3a 0a 20 20 20 20 20 20 20 20 77 68 69 6c  %':.        whil
5340: 65 28 20 7a 50 61 74 74 65 72 6e 5b 31 5d 3d 3d  e( zPattern[1]==
5350: 27 25 27 20 29 20 7a 50 61 74 74 65 72 6e 2b 2b  '%' ) zPattern++
5360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 50  ;.        if( zP
5370: 61 74 74 65 72 6e 5b 31 5d 3d 3d 30 20 29 20 72  attern[1]==0 ) r
5380: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
5390: 20 63 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65   c = UpperToLowe
53a0: 72 5b 30 78 66 66 20 26 20 7a 50 61 74 74 65 72  r[0xff & zPatter
53b0: 6e 5b 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  n[1]];.        i
53c0: 66 28 20 63 3d 3d 27 5f 27 20 29 7b 0a 20 20 20  f( c=='_' ){.   
53d0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
53e0: 53 74 72 69 6e 67 20 26 26 20 73 71 6c 69 74 65  String && sqlite
53f0: 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50 61  LikeCompare(&zPa
5400: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
5410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5420: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
5430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5440: 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a 53 74       return *zSt
5450: 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20 20  ring!=0;.       
5460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5470: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 55    while( (c2 = U
5480: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53 74  pperToLower[*zSt
5490: 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ring])!=0 ){.   
54a0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
54b0: 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d  c2 != 0 && c2 !=
54c0: 20 63 20 29 7b 20 63 32 20 3d 20 55 70 70 65 72   c ){ c2 = Upper
54d0: 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72 69  ToLower[*++zStri
54e0: 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  ng]; }.         
54f0: 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
5500: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5510: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4c       if( sqliteL
5520: 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50 61 74  ikeCompare(&zPat
5530: 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29  tern[1],zString)
5540: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5550: 20 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67           zString
5560: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
5570: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5580: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
5590: 20 20 20 20 63 61 73 65 20 27 5f 27 3a 0a 20 20      case '_':.  
55a0: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69        if( *zStri
55b0: 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ng==0 ) return 0
55c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
55d0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
55e0: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21 3d          if( c !=
55f0: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a   UpperToLower[*z
5600: 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72 6e  String] ) return
5610: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
5620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  k;.    }.    zPa
5630: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7a 53 74  ttern++;.    zSt
5640: 72 69 6e 67 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  ring++;.  }.  re
5650: 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30  turn *zString==0
5660: 3b 0a 7d 0a                                      ;.}.