/ Hex Artifact Content
Login

Artifact ac83973ecc647d3d3c58708f148442365abf9b94:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74  ******.** Utilit
0180: 79 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  y functions used
0190: 20 74 68 72 6f 75 67 68 6f 75 74 20 73 71 6c 69   throughout sqli
01a0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
01b0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e  ile contains fun
01c0: 63 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 6f 63  ctions for alloc
01d0: 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 63 6f  ating memory, co
01e0: 6d 70 61 72 69 6e 67 0a 2a 2a 20 73 74 72 69 6e  mparing.** strin
01f0: 67 73 2c 20 61 6e 64 20 73 74 75 66 66 20 6c 69  gs, and stuff li
0200: 6b 65 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 24  ke that..**.** $
0210: 49 64 3a 20 75 74 69 6c 2e 63 2c 76 20 31 2e 33  Id: util.c,v 1.3
0220: 31 20 32 30 30 31 2f 31 31 2f 30 36 20 30 34 3a  1 2001/11/06 04:
0230: 30 30 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a  00:19 drh Exp $.
0240: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0250: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0260: 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69  de <stdarg.h>.#i
0270: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0280: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 6d 61 6c 6c 6f  ../*.** If mallo
0290: 63 28 29 20 65 76 65 72 20 66 61 69 6c 73 2c 20  c() ever fails, 
02a0: 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69  this global vari
02b0: 61 62 6c 65 20 67 65 74 73 20 73 65 74 20 74 6f  able gets set to
02c0: 20 31 2e 0a 2a 2a 20 54 68 69 73 20 63 61 75 73   1..** This caus
02d0: 65 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 74  es the library t
02e0: 6f 20 61 62 6f 72 74 20 61 6e 64 20 6e 65 76 65  o abort and neve
02f0: 72 20 61 67 61 69 6e 20 66 75 6e 63 74 69 6f 6e  r again function
0300: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
0310: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
0320: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 4d 45 4d  0;../*.** If MEM
0330: 4f 52 59 5f 44 45 42 55 47 20 69 73 20 64 65 66  ORY_DEBUG is def
0340: 69 6e 65 64 2c 20 74 68 65 6e 20 75 73 65 20 76  ined, then use v
0350: 65 72 73 69 6f 6e 73 20 6f 66 20 6d 61 6c 6c 6f  ersions of mallo
0360: 63 28 29 20 61 6e 64 0a 2a 2a 20 66 72 65 65 28  c() and.** free(
0370: 29 20 74 68 61 74 20 74 72 61 63 6b 20 6d 65 6d  ) that track mem
0380: 6f 72 79 20 75 73 61 67 65 20 61 6e 64 20 63 68  ory usage and ch
0390: 65 63 6b 20 66 6f 72 20 62 75 66 66 65 72 20 6f  eck for buffer o
03a0: 76 65 72 72 75 6e 73 2e 0a 2a 2f 0a 23 69 66 64  verruns..*/.#ifd
03b0: 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a  ef MEMORY_DEBUG.
03c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 6b 65 65 70 69  ./*.** For keepi
03d0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ng track of the 
03e0: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63  number of malloc
03f0: 73 20 61 6e 64 20 66 72 65 65 73 2e 20 20 20 54  s and frees.   T
0400: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 20 74  his.** is used t
0410: 6f 20 63 68 65 63 6b 20 66 6f 72 20 6d 65 6d 6f  o check for memo
0420: 72 79 20 6c 65 61 6b 73 2e 0a 2a 2f 0a 69 6e 74  ry leaks..*/.int
0430: 20 73 71 6c 69 74 65 5f 6e 4d 61 6c 6c 6f 63 3b   sqlite_nMalloc;
0440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0450: 65 72 20 6f 66 20 73 71 6c 69 74 65 4d 61 6c 6c  er of sqliteMall
0460: 6f 63 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 69 6e  oc() calls */.in
0470: 74 20 73 71 6c 69 74 65 5f 6e 46 72 65 65 3b 20  t sqlite_nFree; 
0480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0490: 62 65 72 20 6f 66 20 73 71 6c 69 74 65 46 72 65  ber of sqliteFre
04a0: 65 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 69 6e 74  e() calls */.int
04b0: 20 73 71 6c 69 74 65 5f 69 4d 61 6c 6c 6f 63 46   sqlite_iMallocF
04c0: 61 69 6c 3b 20 20 20 20 20 2f 2a 20 46 61 69 6c  ail;     /* Fail
04d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
04e0: 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20  after this many 
04f0: 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  calls */.../*.**
0500: 20 41 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   Allocate new me
0510: 6d 6f 72 79 20 61 6e 64 20 73 65 74 20 69 74 20  mory and set it 
0520: 74 6f 20 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  to zero.  Return
0530: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 20 6d   NULL if.** no m
0540: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
0550: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  le..*/.void *sql
0560: 69 74 65 4d 61 6c 6c 6f 63 5f 28 69 6e 74 20 6e  iteMalloc_(int n
0570: 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  , char *zFile, i
0580: 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 76 6f 69 64  nt line){.  void
0590: 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 70 69 3b 0a   *p;.  int *pi;.
05a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 69 66 28 20 73    int k;.  if( s
05b0: 71 6c 69 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69  qlite_iMallocFai
05c0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
05d0: 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d  te_iMallocFail--
05e0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
05f0: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3d 3d 30 20  _iMallocFail==0 
0600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f  ){.      sqlite_
0610: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b  malloc_failed++;
0620: 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  .#if MEMORY_DEBU
0630: 47 3e 31 0a 20 20 20 20 20 20 66 70 72 69 6e 74  G>1.      fprint
0640: 66 28 73 74 64 65 72 72 2c 22 2a 2a 2a 2a 20 66  f(stderr,"**** f
0650: 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
0660: 65 20 25 64 20 62 79 74 65 73 20 61 74 20 25 73  e %d bytes at %s
0670: 3a 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  :%d\n",.        
0680: 20 20 20 20 20 20 6e 2c 20 7a 46 69 6c 65 2c 6c        n, zFile,l
0690: 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ine);.#endif.   
06a0: 20 20 20 73 71 6c 69 74 65 5f 69 4d 61 6c 6c 6f     sqlite_iMallo
06b0: 63 46 61 69 6c 2d 2d 3b 0a 20 20 20 20 20 20 72  cFail--;.      r
06c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
06d0: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 20   }.  if( n==0 ) 
06e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6b 20 3d 20  return 0;.  k = 
06f0: 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d 31  (n+sizeof(int)-1
0700: 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  )/sizeof(int);. 
0710: 20 70 69 20 3d 20 6d 61 6c 6c 6f 63 28 20 28 33   pi = malloc( (3
0720: 2b 6b 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  +k)*sizeof(int))
0730: 3b 0a 20 20 69 66 28 20 70 69 3d 3d 30 20 29 7b  ;.  if( pi==0 ){
0740: 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  .    sqlite_mall
0750: 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 20  oc_failed++;.   
0760: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0770: 20 73 71 6c 69 74 65 5f 6e 4d 61 6c 6c 6f 63 2b   sqlite_nMalloc+
0780: 2b 3b 0a 20 20 70 69 5b 30 5d 20 3d 20 30 78 64  +;.  pi[0] = 0xd
0790: 65 61 64 31 31 32 32 3b 0a 20 20 70 69 5b 31 5d  ead1122;.  pi[1]
07a0: 20 3d 20 6e 3b 0a 20 20 70 69 5b 6b 2b 32 5d 20   = n;.  pi[k+2] 
07b0: 3d 20 30 78 64 65 61 64 33 33 34 34 3b 0a 20 20  = 0xdead3344;.  
07c0: 70 20 3d 20 26 70 69 5b 32 5d 3b 0a 20 20 6d 65  p = &pi[2];.  me
07d0: 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29 3b 0a 23  mset(p, 0, n);.#
07e0: 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e  if MEMORY_DEBUG>
07f0: 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  1.  fprintf(stde
0800: 72 72 2c 22 6d 61 6c 6c 6f 63 20 25 64 20 62 79  rr,"malloc %d by
0810: 74 65 73 20 61 74 20 30 78 25 78 20 66 72 6f 6d  tes at 0x%x from
0820: 20 25 73 3a 25 64 5c 6e 22 2c 20 6e 2c 20 28 69   %s:%d\n", n, (i
0830: 6e 74 29 70 2c 20 7a 46 69 6c 65 2c 6c 69 6e 65  nt)p, zFile,line
0840: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
0850: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
0860: 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69  ree memory previ
0870: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 66  ously obtained f
0880: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
0890: 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ().*/.void sqlit
08a0: 65 46 72 65 65 5f 28 76 6f 69 64 20 2a 70 2c 20  eFree_(void *p, 
08b0: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
08c0: 20 6c 69 6e 65 29 7b 0a 20 20 69 66 28 20 70 20   line){.  if( p 
08d0: 29 7b 0a 20 20 20 20 69 6e 74 20 2a 70 69 2c 20  ){.    int *pi, 
08e0: 6b 2c 20 6e 3b 0a 20 20 20 20 70 69 20 3d 20 70  k, n;.    pi = p
08f0: 3b 0a 20 20 20 20 70 69 20 2d 3d 20 32 3b 0a 20  ;.    pi -= 2;. 
0900: 20 20 20 73 71 6c 69 74 65 5f 6e 46 72 65 65 2b     sqlite_nFree+
0910: 2b 3b 0a 20 20 20 20 69 66 28 20 70 69 5b 30 5d  +;.    if( pi[0]
0920: 21 3d 30 78 64 65 61 64 31 31 32 32 20 29 7b 0a  !=0xdead1122 ){.
0930: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
0940: 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d 65  derr,"Low-end me
0950: 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20  mory corruption 
0960: 61 74 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e 74  at 0x%x\n", (int
0970: 29 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )p);.      retur
0980: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  n;.    }.    n =
0990: 20 70 69 5b 31 5d 3b 0a 20 20 20 20 6b 20 3d 20   pi[1];.    k = 
09a0: 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d 31  (n+sizeof(int)-1
09b0: 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  )/sizeof(int);. 
09c0: 20 20 20 69 66 28 20 70 69 5b 6b 2b 32 5d 21 3d     if( pi[k+2]!=
09d0: 30 78 64 65 61 64 33 33 34 34 20 29 7b 0a 20 20  0xdead3344 ){.  
09e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
09f0: 72 72 2c 22 48 69 67 68 2d 65 6e 64 20 6d 65 6d  rr,"High-end mem
0a00: 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 61  ory corruption a
0a10: 74 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29  t 0x%x\n", (int)
0a20: 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
0a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
0a40: 65 74 28 70 69 2c 20 30 78 66 66 2c 20 28 6b 2b  et(pi, 0xff, (k+
0a50: 33 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  3)*sizeof(int));
0a60: 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  .#if MEMORY_DEBU
0a70: 47 3e 31 0a 20 20 20 20 66 70 72 69 6e 74 66 28  G>1.    fprintf(
0a80: 73 74 64 65 72 72 2c 22 66 72 65 65 20 25 64 20  stderr,"free %d 
0a90: 62 79 74 65 73 20 61 74 20 30 78 25 78 20 66 72  bytes at 0x%x fr
0aa0: 6f 6d 20 25 73 3a 25 64 5c 6e 22 2c 20 6e 2c 20  om %s:%d\n", n, 
0ab0: 28 69 6e 74 29 70 2c 20 7a 46 69 6c 65 2c 6c 69  (int)p, zFile,li
0ac0: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ne);.#endif.    
0ad0: 66 72 65 65 28 70 69 29 3b 0a 20 20 7d 0a 7d 0a  free(pi);.  }.}.
0ae0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 20  ./*.** Resize a 
0af0: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
0b00: 2e 20 20 49 66 20 70 3d 3d 30 2c 20 74 68 65 6e  .  If p==0, then
0b10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
0b20: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
0b30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
0b40: 20 20 49 66 20 6e 3d 3d 30 2c 20 74 68 65 6e 20    If n==0, then 
0b50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
0b60: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
0b70: 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f  sqliteFree()..*/
0b80: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 52 65 61  .void *sqliteRea
0b90: 6c 6c 6f 63 5f 28 76 6f 69 64 20 2a 6f 6c 64 50  lloc_(void *oldP
0ba0: 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
0bb0: 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b  File, int line){
0bc0: 0a 20 20 69 6e 74 20 2a 6f 6c 64 50 69 2c 20 2a  .  int *oldPi, *
0bd0: 70 69 2c 20 6b 2c 20 6f 6c 64 4e 2c 20 6f 6c 64  pi, k, oldN, old
0be0: 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  K;.  void *p;.  
0bf0: 69 66 28 20 6f 6c 64 50 3d 3d 30 20 29 7b 0a 20  if( oldP==0 ){. 
0c00: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0c10: 4d 61 6c 6c 6f 63 5f 28 6e 2c 7a 46 69 6c 65 2c  Malloc_(n,zFile,
0c20: 6c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  line);.  }.  if(
0c30: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   n==0 ){.    sql
0c40: 69 74 65 46 72 65 65 5f 28 6f 6c 64 50 2c 7a 46  iteFree_(oldP,zF
0c50: 69 6c 65 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 72  ile,line);.    r
0c60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f  eturn 0;.  }.  o
0c70: 6c 64 50 69 20 3d 20 6f 6c 64 50 3b 0a 20 20 6f  ldPi = oldP;.  o
0c80: 6c 64 50 69 20 2d 3d 20 32 3b 0a 20 20 69 66 28  ldPi -= 2;.  if(
0c90: 20 6f 6c 64 50 69 5b 30 5d 21 3d 30 78 64 65 61   oldPi[0]!=0xdea
0ca0: 64 31 31 32 32 20 29 7b 0a 20 20 20 20 66 70 72  d1122 ){.    fpr
0cb0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4c 6f 77  intf(stderr,"Low
0cc0: 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f 72 72  -end memory corr
0cd0: 75 70 74 69 6f 6e 20 69 6e 20 72 65 61 6c 6c 6f  uption in reallo
0ce0: 63 20 61 74 20 30 78 25 78 5c 6e 22 2c 20 28 69  c at 0x%x\n", (i
0cf0: 6e 74 29 70 29 3b 0a 20 20 20 20 72 65 74 75 72  nt)p);.    retur
0d00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4e 20  n 0;.  }.  oldN 
0d10: 3d 20 6f 6c 64 50 69 5b 31 5d 3b 0a 20 20 6f 6c  = oldPi[1];.  ol
0d20: 64 4b 20 3d 20 28 6f 6c 64 4e 2b 73 69 7a 65 6f  dK = (oldN+sizeo
0d30: 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f 66  f(int)-1)/sizeof
0d40: 28 69 6e 74 29 3b 0a 20 20 69 66 28 20 6f 6c 64  (int);.  if( old
0d50: 50 69 5b 6f 6c 64 4b 2b 32 5d 21 3d 30 78 64 65  Pi[oldK+2]!=0xde
0d60: 61 64 33 33 34 34 20 29 7b 0a 20 20 20 20 66 70  ad3344 ){.    fp
0d70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 48 69  rintf(stderr,"Hi
0d80: 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f  gh-end memory co
0d90: 72 72 75 70 74 69 6f 6e 20 69 6e 20 72 65 61 6c  rruption in real
0da0: 6c 6f 63 20 61 74 20 30 78 25 78 5c 6e 22 2c 20  loc at 0x%x\n", 
0db0: 28 69 6e 74 29 70 29 3b 0a 20 20 20 20 72 65 74  (int)p);.    ret
0dc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6b 20 3d  urn 0;.  }.  k =
0dd0: 20 28 6e 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74   (n + sizeof(int
0de0: 29 20 2d 20 31 29 2f 73 69 7a 65 6f 66 28 69 6e  ) - 1)/sizeof(in
0df0: 74 29 3b 0a 20 20 70 69 20 3d 20 6d 61 6c 6c 6f  t);.  pi = mallo
0e00: 63 28 20 28 6b 2b 33 29 2a 73 69 7a 65 6f 66 28  c( (k+3)*sizeof(
0e10: 69 6e 74 29 20 29 3b 0a 20 20 69 66 28 20 70 69  int) );.  if( pi
0e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0e30: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b  e_malloc_failed+
0e40: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
0e50: 0a 20 20 7d 0a 20 20 70 69 5b 30 5d 20 3d 20 30  .  }.  pi[0] = 0
0e60: 78 64 65 61 64 31 31 32 32 3b 0a 20 20 70 69 5b  xdead1122;.  pi[
0e70: 31 5d 20 3d 20 6e 3b 0a 20 20 70 69 5b 6b 2b 32  1] = n;.  pi[k+2
0e80: 5d 20 3d 20 30 78 64 65 61 64 33 33 34 34 3b 0a  ] = 0xdead3344;.
0e90: 20 20 70 20 3d 20 26 70 69 5b 32 5d 3b 0a 20 20    p = &pi[2];.  
0ea0: 6d 65 6d 63 70 79 28 70 2c 20 6f 6c 64 50 2c 20  memcpy(p, oldP, 
0eb0: 6e 3e 6f 6c 64 4e 20 3f 20 6f 6c 64 4e 20 3a 20  n>oldN ? oldN : 
0ec0: 6e 29 3b 0a 20 20 69 66 28 20 6e 3e 6f 6c 64 4e  n);.  if( n>oldN
0ed0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
0ee0: 28 28 63 68 61 72 2a 29 70 29 5b 6f 6c 64 4e 5d  ((char*)p)[oldN]
0ef0: 2c 20 30 2c 20 6e 2d 6f 6c 64 4e 29 3b 0a 20 20  , 0, n-oldN);.  
0f00: 7d 0a 20 20 6d 65 6d 73 65 74 28 6f 6c 64 50 69  }.  memset(oldPi
0f10: 2c 20 30 2c 20 28 6f 6c 64 4b 2b 33 29 2a 73 69  , 0, (oldK+3)*si
0f20: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 66 72  zeof(int));.  fr
0f30: 65 65 28 6f 6c 64 50 69 29 3b 0a 23 69 66 20 4d  ee(oldPi);.#if M
0f40: 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20  EMORY_DEBUG>1.  
0f50: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
0f60: 72 65 61 6c 6c 6f 63 20 25 64 20 74 6f 20 25 64  realloc %d to %d
0f70: 20 62 79 74 65 73 20 61 74 20 30 78 25 78 20 74   bytes at 0x%x t
0f80: 6f 20 30 78 25 78 20 61 74 20 25 73 3a 25 64 5c  o 0x%x at %s:%d\
0f90: 6e 22 2c 20 6f 6c 64 4e 2c 20 6e 2c 0a 20 20 20  n", oldN, n,.   
0fa0: 20 28 69 6e 74 29 6f 6c 64 50 2c 20 28 69 6e 74   (int)oldP, (int
0fb0: 29 70 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29  )p, zFile, line)
0fc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
0fd0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  n p;.}../*.** Ma
0fe0: 6b 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  ke a duplicate o
0ff0: 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  f a string into 
1000: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1010: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a  from malloc().**
1020: 20 46 72 65 65 20 74 68 65 20 6f 72 69 67 69 6e   Free the origin
1030: 61 6c 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  al string using 
1040: 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a 2a  sqliteFree()..**
1050: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1060: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c   is called on al
1070: 6c 20 73 74 72 69 6e 67 73 20 74 68 61 74 20 61  l strings that a
1080: 72 65 20 70 61 73 73 65 64 20 6f 75 74 73 69 64  re passed outsid
1090: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69  e of.** the SQLi
10a0: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 61  te library.  Tha
10b0: 74 20 77 61 79 20 63 6c 69 65 6e 74 73 20 63 61  t way clients ca
10c0: 6e 20 66 72 65 65 20 74 68 65 20 73 74 72 69 6e  n free the strin
10d0: 67 20 75 73 69 6e 67 20 66 72 65 65 28 29 0a 2a  g using free().*
10e0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 68 61  * rather than ha
10f0: 76 69 6e 67 20 74 6f 20 63 61 6c 6c 20 73 71 6c  ving to call sql
1100: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f  iteFree()..*/.vo
1110: 69 64 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c  id sqliteStrReal
1120: 6c 6f 63 28 63 68 61 72 20 2a 2a 70 7a 29 7b 0a  loc(char **pz){.
1130: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
1140: 69 66 28 20 70 7a 3d 3d 30 20 7c 7c 20 2a 70 7a  if( pz==0 || *pz
1150: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1160: 7a 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zNew = malloc( s
1170: 74 72 6c 65 6e 28 2a 70 7a 29 20 2b 20 31 20 29  trlen(*pz) + 1 )
1180: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20  ;.  if( zNew==0 
1190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61  ){.    sqlite_ma
11a0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20  lloc_failed++;. 
11b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
11c0: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 30 3b  z);.    *pz = 0;
11d0: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 7a 4e  .  }.  strcpy(zN
11e0: 65 77 2c 20 2a 70 7a 29 3b 0a 20 20 73 71 6c 69  ew, *pz);.  sqli
11f0: 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a  teFree(*pz);.  *
1200: 70 7a 20 3d 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a  pz = zNew;.}../*
1210: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
1220: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
1230: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1240: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
1250: 28 29 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  ().*/.char *sqli
1260: 74 65 53 74 72 44 75 70 5f 28 63 6f 6e 73 74 20  teStrDup_(const 
1270: 63 68 61 72 20 2a 7a 2c 20 63 68 61 72 20 2a 7a  char *z, char *z
1280: 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b  File, int line){
1290: 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20  .  char *zNew = 
12a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f 28 73 74  sqliteMalloc_(st
12b0: 72 6c 65 6e 28 7a 29 2b 31 2c 20 7a 46 69 6c 65  rlen(z)+1, zFile
12c0: 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a  , line);.  if( z
12d0: 4e 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65  New ) strcpy(zNe
12e0: 77 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, z);.  return 
12f0: 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71  zNew;.}.char *sq
1300: 6c 69 74 65 53 74 72 4e 44 75 70 5f 28 63 6f 6e  liteStrNDup_(con
1310: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1320: 6e 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  n, char *zFile, 
1330: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61  int line){.  cha
1340: 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *zNew = sqlite
1350: 4d 61 6c 6c 6f 63 5f 28 6e 2b 31 2c 20 7a 46 69  Malloc_(n+1, zFi
1360: 6c 65 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28  le, line);.  if(
1370: 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   zNew ){.    mem
1380: 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b  cpy(zNew, z, n);
1390: 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30  .    zNew[n] = 0
13a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
13b0: 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  New;.}.#endif /*
13c0: 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 20 2a 2f   MEMORY_DEBUG */
13d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
13e0: 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f  owing versions o
13f0: 66 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 66  f malloc() and f
1400: 72 65 65 28 29 20 61 72 65 20 66 6f 72 20 75 73  ree() are for us
1410: 65 20 69 6e 20 61 0a 2a 2a 20 6e 6f 72 6d 61 6c  e in a.** normal
1420: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21   build..*/.#if !
1430: 64 65 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44  defined(MEMORY_D
1440: 45 42 55 47 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  EBUG)../*.** All
1450: 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79  ocate new memory
1460: 20 61 6e 64 20 73 65 74 20 69 74 20 74 6f 20 7a   and set it to z
1470: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ero.  Return NUL
1480: 4c 20 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72  L if.** no memor
1490: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
14a0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d  */.void *sqliteM
14b0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20  alloc(int n){.  
14c0: 76 6f 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63  void *p = malloc
14d0: 28 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  (n);.  if( p==0 
14e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61  ){.    sqlite_ma
14f0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20  lloc_failed++;. 
1500: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1510: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1520: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  n);.  return p;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
1540: 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20  mory previously 
1550: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1560: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a  liteMalloc().*/.
1570: 76 6f 69 64 20 73 71 6c 69 74 65 46 72 65 65 28  void sqliteFree(
1580: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  void *p){.  if( 
1590: 70 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 29  p ){.    free(p)
15a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
15b0: 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20 61 6c  esize a prior al
15c0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 70 3d  location.  If p=
15d0: 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  =0, then this ro
15e0: 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a  utine.** works j
15f0: 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 4d  ust like sqliteM
1600: 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d 3d  alloc().  If n==
1610: 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  0, then this rou
1620: 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75  tine.** works ju
1630: 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 46 72  st like sqliteFr
1640: 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ee()..*/.void *s
1650: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 76 6f 69  qliteRealloc(voi
1660: 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  d *p, int n){.  
1670: 76 6f 69 64 20 2a 70 32 3b 0a 20 20 69 66 28 20  void *p2;.  if( 
1680: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
1690: 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  rn sqliteMalloc(
16a0: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d  n);.  }.  if( n=
16b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16c0: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  Free(p);.    ret
16d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 32 20  urn 0;.  }.  p2 
16e0: 3d 20 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b  = realloc(p, n);
16f0: 0a 20 20 69 66 28 20 70 32 3d 3d 30 20 29 7b 0a  .  if( p2==0 ){.
1700: 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f      sqlite_mallo
1710: 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 0a  c_failed++;.  }.
1720: 20 20 72 65 74 75 72 6e 20 70 32 3b 0a 7d 0a 0a    return p2;.}..
1730: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70  /*.** Make a cop
1740: 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  y of a string in
1750: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1760: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1770: 6f 63 28 29 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  oc().*/.char *sq
1780: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6e 73 74  liteStrDup(const
1790: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61   char *z){.  cha
17a0: 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *zNew = sqlite
17b0: 4d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 29  Malloc(strlen(z)
17c0: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
17d0: 29 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a  ) strcpy(zNew, z
17e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77  );.  return zNew
17f0: 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  ;.}.char *sqlite
1800: 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20 63 68  StrNDup(const ch
1810: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1820: 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
1830: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 2b 31 29 3b  liteMalloc(n+1);
1840: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20  .  if( zNew ){. 
1850: 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20     memcpy(zNew, 
1860: 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b  z, n);.    zNew[
1870: 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  n] = 0;.  }.  re
1880: 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23 65 6e  turn zNew;.}.#en
1890: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
18a0: 4d 45 4d 4f 52 59 5f 44 45 42 55 47 29 20 2a 2f  MEMORY_DEBUG) */
18b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
18c0: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
18d0: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
18e0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 28 75  ent arguments (u
18f0: 70 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73  p to the.** firs
1900: 74 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29  t NULL argument)
1910: 2c 20 73 74 6f 72 65 20 74 68 65 20 73 74 72 69  , store the stri
1920: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
1930: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
1940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
1950: 20 6d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 65   make the pointe
1960: 72 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  r indicated by t
1970: 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74 0a  he 1st argument.
1980: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  ** point to that
1990: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
19a0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
19b0: 28 63 68 61 72 20 2a 2a 70 7a 2c 20 63 6f 6e 73  (char **pz, cons
19c0: 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 2c 20  t char *zFirst, 
19d0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
19e0: 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ap;.  int nByte;
19f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a00: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  ;.  char *zResul
1a10: 74 3b 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20  t;..  if( pz==0 
1a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74  ) return;.  nByt
1a30: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 72 73  e = strlen(zFirs
1a40: 74 29 20 2b 20 31 3b 0a 20 20 76 61 5f 73 74 61  t) + 1;.  va_sta
1a50: 72 74 28 61 70 2c 20 7a 46 69 72 73 74 29 3b 0a  rt(ap, zFirst);.
1a60: 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61    while( (z = va
1a70: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1a80: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
1a90: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
1aa0: 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  (z);.  }.  va_en
1ab0: 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 46  d(ap);.  sqliteF
1ac0: 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20  ree(*pz);.  *pz 
1ad0: 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69  = zResult = sqli
1ae0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
1af0: 29 3b 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74  );.  if( zResult
1b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1b10: 6e 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28  n;.  }.  strcpy(
1b20: 7a 52 65 73 75 6c 74 2c 20 7a 46 69 72 73 74 29  zResult, zFirst)
1b30: 3b 0a 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73  ;.  zResult += s
1b40: 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a  trlen(zResult);.
1b50: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1b60: 46 69 72 73 74 29 3b 0a 20 20 77 68 69 6c 65 28  First);.  while(
1b70: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
1b80: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
1b90: 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
1ba0: 7a 52 65 73 75 6c 74 2c 20 7a 29 3b 0a 20 20 20  zResult, z);.   
1bb0: 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c   zResult += strl
1bc0: 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d  en(zResult);.  }
1bd0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1be0: 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ifdef MEMORY_DEB
1bf0: 55 47 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45  UG.#if MEMORY_DE
1c00: 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28  BUG>1.  fprintf(
1c10: 73 74 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61  stderr,"string a
1c20: 74 20 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c  t 0x%x is %s\n",
1c30: 20 28 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b   (int)*pz, *pz);
1c40: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d  .#endif.#endif.}
1c50: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69  ../*.** Works li
1c60: 6b 65 20 73 71 6c 69 74 65 53 65 74 53 74 72 69  ke sqliteSetStri
1c70: 6e 67 2c 20 62 75 74 20 65 61 63 68 20 73 74 72  ng, but each str
1c80: 69 6e 67 20 69 73 20 6e 6f 77 20 66 6f 6c 6c 6f  ing is now follo
1c90: 77 65 64 20 62 79 0a 2a 2a 20 61 20 6c 65 6e 67  wed by.** a leng
1ca0: 74 68 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  th integer which
1cb0: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d   specifies how m
1cc0: 75 63 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63  uch of the sourc
1cd0: 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20 74 6f 20  e string .** to 
1ce0: 63 6f 70 79 20 28 69 6e 20 62 79 74 65 73 29 2e  copy (in bytes).
1cf0: 20 20 2d 31 20 6d 65 61 6e 73 20 75 73 65 20 74    -1 means use t
1d00: 68 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 2e  he whole string.
1d10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
1d20: 65 74 4e 53 74 72 69 6e 67 28 63 68 61 72 20 2a  etNString(char *
1d30: 2a 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  *pz, ...){.  va_
1d40: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e  list ap;.  int n
1d50: 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Byte;.  const ch
1d60: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a  ar *z;.  char *z
1d70: 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 3b  Result;.  int n;
1d80: 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20  ..  if( pz==0 ) 
1d90: 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20  return;.  nByte 
1da0: 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  = 0;.  va_start(
1db0: 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65  ap, pz);.  while
1dc0: 28 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (z = va_arg(ap
1dd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21  , const char*))!
1de0: 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61  =0 ){.    n = va
1df0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1e00: 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20     if( n<=0 ) n 
1e10: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
1e20: 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 7d   nByte += n;.  }
1e30: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1e40: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29   sqliteFree(*pz)
1e50: 3b 0a 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c  ;.  *pz = zResul
1e60: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1e70: 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a 20  ( nByte + 1 );. 
1e80: 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20   if( zResult==0 
1e90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
1ea0: 74 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20  tart(ap, pz);.  
1eb0: 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61  while( (z = va_a
1ec0: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
1ed0: 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  r*))!=0 ){.    n
1ee0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1ef0: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30  t);.    if( n<=0
1f00: 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29   ) n = strlen(z)
1f10: 3b 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52  ;.    strncpy(zR
1f20: 65 73 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  esult, z, n);.  
1f30: 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 6e 3b 0a    zResult += n;.
1f40: 20 20 7d 0a 20 20 2a 7a 52 65 73 75 6c 74 20 3d    }.  *zResult =
1f50: 20 30 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52   0;.#ifdef MEMOR
1f60: 59 5f 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f  Y_DEBUG.#if MEMO
1f70: 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72  RY_DEBUG>1.  fpr
1f80: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 73 74 72  intf(stderr,"str
1f90: 69 6e 67 20 61 74 20 30 78 25 78 20 69 73 20 25  ing at 0x%x is %
1fa0: 73 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20  s\n", (int)*pz, 
1fb0: 2a 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  *pz);.#endif.#en
1fc0: 64 69 66 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  dif.  va_end(ap)
1fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1fe0: 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20  rt an SQL-style 
1ff0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e  quoted string in
2000: 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69  to a normal stri
2010: 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a  ng by removing.*
2020: 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72  * the quote char
2030: 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e  acters.  The con
2040: 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20  version is done 
2050: 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68  in-place.  If th
2060: 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20  e.** input does 
2070: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
2080: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
2090: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
20a0: 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ine.** is a no-o
20b0: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
20c0: 65 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  eDequote(char *z
20d0: 29 7b 0a 20 20 69 6e 74 20 71 75 6f 74 65 3b 0a  ){.  int quote;.
20e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66    int i, j;.  if
20f0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
2100: 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b  .  quote = z[0];
2110: 0a 20 20 69 66 28 20 71 75 6f 74 65 21 3d 27 5c  .  if( quote!='\
2120: 27 27 20 26 26 20 71 75 6f 74 65 21 3d 27 22 27  '' && quote!='"'
2130: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
2140: 28 69 3d 31 2c 20 6a 3d 30 3b 20 7a 5b 69 5d 3b  (i=1, j=0; z[i];
2150: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
2160: 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  [i]==quote ){.  
2170: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
2180: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  quote ){.       
2190: 20 7a 5b 6a 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b   z[j++] = quote;
21a0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
21b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20     z[j++] = 0;. 
21d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
21f0: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  .      z[j++] = 
2200: 7a 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  z[i];.    }.  }.
2210: 7d 0a 0a 2f 2a 20 41 6e 20 61 72 72 61 79 20 74  }../* An array t
2220: 6f 20 6d 61 70 20 61 6c 6c 20 75 70 70 65 72 2d  o map all upper-
2230: 63 61 73 65 20 63 68 61 72 61 63 74 65 72 73 20  case characters 
2240: 69 6e 74 6f 20 74 68 65 69 72 20 63 6f 72 72 65  into their corre
2250: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65  sponding.** lowe
2260: 72 2d 63 61 73 65 20 63 68 61 72 61 63 74 65 72  r-case character
2270: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  . .*/.static uns
2280: 69 67 6e 65 64 20 63 68 61 72 20 55 70 70 65 72  igned char Upper
2290: 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20 20  ToLower[] = {.  
22a0: 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20      0,  1,  2,  
22b0: 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20  3,  4,  5,  6,  
22c0: 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c 20 31  7,  8,  9, 10, 1
22d0: 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31  1, 12, 13, 14, 1
22e0: 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20 20 20  5, 16, 17,.     
22f0: 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c 20  18, 19, 20, 21, 
2300: 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c 20  22, 23, 24, 25, 
2310: 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20  26, 27, 28, 29, 
2320: 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33 2c 20  30, 31, 32, 33, 
2330: 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33 36 2c  34, 35,.     36,
2340: 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c   37, 38, 39, 40,
2350: 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34 34 2c   41, 42, 43, 44,
2360: 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c   45, 46, 47, 48,
2370: 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35 32 2c   49, 50, 51, 52,
2380: 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20 35 35   53,.     54, 55
2390: 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39  , 56, 57, 58, 59
23a0: 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36 33  , 60, 61, 62, 63
23b0: 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20 39 39  , 64, 97, 98, 99
23c0: 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33  ,100,101,102,103
23d0: 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c 31 30  ,.    104,105,10
23e0: 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c 31 31  6,107,108,109,11
23f0: 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31  0,111,112,113,11
2400: 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31  4,115,116,117,11
2410: 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 0a 20  8,119,120,121,. 
2420: 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32 2c 20     122, 91, 92, 
2430: 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c 20  93, 94, 95, 96, 
2440: 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 31  97, 98, 99,100,1
2450: 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c 31  01,102,103,104,1
2460: 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20 20 20  05,106,107,.    
2470: 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c  108,109,110,111,
2480: 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c  112,113,114,115,
2490: 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c  116,117,118,119,
24a0: 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32 33 2c  120,121,122,123,
24b0: 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31 32 36  124,125,.    126
24c0: 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31 33 30  ,127,128,129,130
24d0: 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31 33 34  ,131,132,133,134
24e0: 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31 33 38  ,135,136,137,138
24f0: 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31 34 32  ,139,140,141,142
2500: 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c 31 34  ,143,.    144,14
2510: 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c 31 34  5,146,147,148,14
2520: 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c 31 35  9,150,151,152,15
2530: 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c 31 35  3,154,155,156,15
2540: 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c 31 36  7,158,159,160,16
2550: 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33 2c 31  1,.    162,163,1
2560: 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37 2c 31  64,165,166,167,1
2570: 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31 2c 31  68,169,170,171,1
2580: 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35 2c 31  72,173,174,175,1
2590: 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39 2c 0a  76,177,178,179,.
25a0: 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38 32 2c      180,181,182,
25b0: 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38 36 2c  183,184,185,186,
25c0: 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39 30 2c  187,188,189,190,
25d0: 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39 34 2c  191,192,193,194,
25e0: 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20 20 20  195,196,197,.   
25f0: 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32 30 31   198,199,200,201
2600: 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32 30 35  ,202,203,204,205
2610: 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32 30 39  ,206,207,208,209
2620: 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32 31 33  ,210,211,212,213
2630: 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20 32 31  ,214,215,.    21
2640: 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c 32 32  6,217,218,219,22
2650: 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c 32 32  0,221,222,223,22
2660: 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c 32 32  4,225,226,227,22
2670: 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c 32 33  8,229,230,231,23
2680: 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34 2c 32  2,233,.    234,2
2690: 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38 2c 32  35,236,237,238,2
26a0: 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32 2c 32  39,240,241,242,2
26b0: 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36 2c 32  43,244,245,246,2
26c0: 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30 2c 32  47,248,249,250,2
26d0: 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35 33 2c  51,.    252,253,
26e0: 32 35 34 2c 32 35 35 0a 7d 3b 0a 0a 2f 2a 0a 2a  254,255.};../*.*
26f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2700: 63 6f 6d 70 75 74 65 73 20 61 20 68 61 73 68 20  computes a hash 
2710: 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  on the name of a
2720: 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 20 43 61 73   keyword..** Cas
2730: 65 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69  e is not signifi
2740: 63 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cant..*/.int sql
2750: 69 74 65 48 61 73 68 4e 6f 43 61 73 65 28 63 6f  iteHashNoCase(co
2760: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2770: 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30   n){.  int h = 0
2780: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e  ;.  if( n<=0 ) n
2790: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
27a0: 77 68 69 6c 65 28 20 6e 20 3e 20 30 20 20 29 7b  while( n > 0  ){
27b0: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 33 29 20  .    h = (h<<3) 
27c0: 5e 20 68 20 5e 20 55 70 70 65 72 54 6f 4c 6f 77  ^ h ^ UpperToLow
27d0: 65 72 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er[(unsigned cha
27e0: 72 29 2a 7a 2b 2b 5d 3b 0a 20 20 20 20 6e 2d 2d  r)*z++];.    n--
27f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 68 3c 30 20  ;.  }.  if( h<0 
2800: 29 20 68 20 3d 20 2d 68 3b 0a 20 20 72 65 74 75  ) h = -h;.  retu
2810: 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn h;.}../*.** S
2820: 6f 6d 65 20 73 79 73 74 65 6d 73 20 68 61 76 65  ome systems have
2830: 20 73 74 72 69 63 6d 70 28 29 2e 20 20 4f 74 68   stricmp().  Oth
2840: 65 72 73 20 68 61 76 65 20 73 74 72 63 61 73 65  ers have strcase
2850: 63 6d 70 28 29 2e 20 20 42 65 63 61 75 73 65 0a  cmp().  Because.
2860: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  ** there is no c
2870: 6f 6e 73 69 73 74 65 6e 63 79 2c 20 77 65 20 77  onsistency, we w
2880: 69 6c 6c 20 64 65 66 69 6e 65 20 6f 75 72 20 6f  ill define our o
2890: 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  wn..*/.int sqlit
28a0: 65 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63  eStrICmp(const c
28b0: 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73  har *zLeft, cons
28c0: 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b  t char *zRight){
28d0: 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69  .  register unsi
28e0: 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62  gned char *a, *b
28f0: 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  a = (unsigne
2900: 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a  d char *)zLeft;.
2910: 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20    b = (unsigned 
2920: 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20  char *)zRight;. 
2930: 20 77 68 69 6c 65 28 20 2a 61 21 3d 30 20 26 26   while( *a!=0 &&
2940: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61   UpperToLower[*a
2950: 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  ]==UpperToLower[
2960: 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20  *b]){ a++; b++; 
2970: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 61 20 2d 20  }.  return *a - 
2980: 2a 62 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  *b;.}.int sqlite
2990: 53 74 72 4e 49 43 6d 70 28 63 6f 6e 73 74 20 63  StrNICmp(const c
29a0: 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73  har *zLeft, cons
29b0: 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74 2c 20  t char *zRight, 
29c0: 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67 69 73 74  int N){.  regist
29d0: 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  er unsigned char
29e0: 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d 20 28   *a, *b;.  a = (
29f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
2a00: 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e  zLeft;.  b = (un
2a10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52  signed char *)zR
2a20: 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28 20 4e  ight;.  while( N
2a30: 2d 2d 20 3e 20 30 20 26 26 20 2a 61 21 3d 30 20  -- > 0 && *a!=0 
2a40: 26 26 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  && UpperToLower[
2a50: 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65  *a]==UpperToLowe
2a60: 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b  r[*b]){ a++; b++
2a70: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3c 30  ; }.  return N<0
2a80: 20 3f 20 30 20 3a 20 2a 61 20 2d 20 2a 62 3b 0a   ? 0 : *a - *b;.
2a90: 7d 0a 0a 2f 2a 20 4e 6f 74 65 73 20 6f 6e 20 73  }../* Notes on s
2aa0: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 69 6f  tring comparisio
2ab0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 77 61 6e  ns..**.** We wan
2ac0: 74 20 74 68 65 20 6d 61 69 6e 20 73 74 72 69 6e  t the main strin
2ad0: 67 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 66 75  g comparision fu
2ae0: 6e 63 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20  nction used for 
2af0: 73 6f 72 74 69 6e 67 20 74 6f 0a 2a 2a 20 73 6f  sorting to.** so
2b00: 72 74 20 62 6f 74 68 20 6e 75 6d 62 65 72 73 20  rt both numbers 
2b10: 61 6e 64 20 61 6c 70 68 61 6e 75 6d 65 72 69 63  and alphanumeric
2b20: 20 77 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20   words into the 
2b30: 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63 65  correct sequence
2b40: 2e 0a 2a 2a 20 54 68 65 20 73 61 6d 65 20 72 6f  ..** The same ro
2b50: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 64 6f 20  utine should do 
2b60: 62 6f 74 68 20 77 69 74 68 6f 75 74 20 70 72 69  both without pri
2b70: 6f 72 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  or knowledge of 
2b80: 77 68 69 63 68 0a 2a 2a 20 74 79 70 65 20 6f 66  which.** type of
2b90: 20 74 65 78 74 20 74 68 65 20 69 6e 70 75 74 20   text the input 
2ba0: 72 65 70 72 65 73 65 6e 74 73 2e 20 20 49 74 20  represents.  It 
2bb0: 73 68 6f 75 6c 64 20 65 76 65 6e 20 77 6f 72 6b  should even work
2bc0: 20 66 6f 72 20 73 74 72 69 6e 67 73 0a 2a 2a 20   for strings.** 
2bd0: 77 68 69 63 68 20 61 72 65 20 61 20 6d 69 78 74  which are a mixt
2be0: 75 72 65 20 6f 66 20 74 65 78 74 20 61 6e 64 20  ure of text and 
2bf0: 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  numbers..**.** T
2c00: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 20 74 68 69  o accomplish thi
2c10: 73 2c 20 77 65 20 6b 65 65 70 20 74 72 61 63 6b  s, we keep track
2c20: 20 6f 66 20 61 20 73 74 61 74 65 20 6e 75 6d 62   of a state numb
2c30: 65 72 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e  er while scannin
2c40: 67 0a 2a 2a 20 74 68 65 20 74 77 6f 20 73 74 72  g.** the two str
2c50: 69 6e 67 73 2e 20 20 54 68 65 20 73 74 61 74 65  ings.  The state
2c60: 73 20 61 72 65 20 61 73 20 66 6f 6c 6c 6f 77 73  s are as follows
2c70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 31 20 20 20 20  :.**.**    1    
2c80: 20 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77    Beginning of w
2c90: 6f 72 64 0a 2a 2a 20 20 20 20 32 20 20 20 20 20  ord.**    2     
2ca0: 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a   Arbitrary text.
2cb0: 2a 2a 20 20 20 20 33 20 20 20 20 20 20 49 6e 74  **    3      Int
2cc0: 65 67 65 72 0a 2a 2a 20 20 20 20 34 20 20 20 20  eger.**    4    
2cd0: 20 20 4e 65 67 61 74 69 76 65 20 69 6e 74 65 67    Negative integ
2ce0: 65 72 0a 2a 2a 20 20 20 20 35 20 20 20 20 20 20  er.**    5      
2cf0: 52 65 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  Real number.**  
2d00: 20 20 36 20 20 20 20 20 20 4e 65 67 61 74 69 76    6      Negativ
2d10: 65 20 72 65 61 6c 0a 2a 2a 0a 2a 2a 20 54 68 65  e real.**.** The
2d20: 20 73 63 61 6e 20 62 65 67 69 6e 73 20 69 6e 20   scan begins in 
2d30: 73 74 61 74 65 20 31 2c 20 62 65 67 69 6e 6e 69  state 1, beginni
2d40: 6e 67 20 6f 66 20 77 6f 72 64 2e 20 20 54 72 61  ng of word.  Tra
2d50: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 6f 74 68 65  nsitions to othe
2d60: 72 0a 2a 2a 20 73 74 61 74 65 73 20 61 72 65 20  r.** states are 
2d70: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
2d80: 61 72 61 63 74 65 72 73 20 73 65 65 6e 2c 20 61  aracters seen, a
2d90: 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66  s shown in the f
2da0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 63 68 61 72  ollowing.** char
2db0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 43 75  t:.**.**      Cu
2dc0: 72 72 65 6e 74 20 53 74 61 74 65 20 20 20 20 20  rrent State     
2dd0: 20 20 20 20 43 68 61 72 61 63 74 65 72 20 53 65      Character Se
2de0: 65 6e 20 20 4e 65 77 20 53 74 61 74 65 0a 2a 2a  en  New State.**
2df0: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e30: 2a 2a 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e  **      0 Beginn
2e40: 69 6e 67 20 6f 66 20 77 6f 72 64 20 20 20 22 2d  ing of word   "-
2e50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20  "             3 
2e60: 4e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  Negative integer
2e70: 0a 2a 2a 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 20 20 20 20 64                 d
2e90: 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20 32  igit           2
2ea0: 20 49 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   Integer.**     
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 73 70 61 63 65 20 20 20 20         space    
2ed0: 20 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69         0 Beginni
2ee0: 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20  ng of word.**   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 77 69           otherwi
2f10: 73 65 20 20 20 20 20 20 20 31 20 41 72 62 69 74  se       1 Arbit
2f20: 72 61 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20  rary text.**.** 
2f30: 20 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79       1 Arbitrary
2f40: 20 74 65 78 74 20 20 20 20 20 20 73 70 61 63 65   text      space
2f50: 20 20 20 20 20 20 20 20 20 20 20 30 20 42 65 67             0 Beg
2f60: 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a  inning of word.*
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 64 69 67               dig
2f90: 69 74 20 20 20 20 20 20 20 20 20 20 20 32 20 49  it           2 I
2fa0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  nteger.**       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20       otherwise  
2fd0: 20 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79       1 Arbitrary
2fe0: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20   text.**.**     
2ff0: 20 32 20 49 6e 74 65 67 65 72 20 20 20 20 20 20   2 Integer      
3000: 20 20 20 20 20 20 20 73 70 61 63 65 20 20 20 20         space    
3010: 20 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69         0 Beginni
3020: 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20  ng of word.**   
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 20 22 2e 22 20 20 20 20           "."    
3050: 20 20 20 20 20 20 20 20 20 34 20 52 65 61 6c 20           4 Real 
3060: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 64 69 67 69 74 20 20 20 20 20 20       digit      
3090: 20 20 20 20 20 32 20 49 6e 74 65 67 65 72 0a 2a       2 Integer.*
30a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
30c0: 65 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41  erwise       1 A
30d0: 72 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a  rbitrary text.**
30e0: 0a 2a 2a 20 20 20 20 20 20 33 20 4e 65 67 61 74  .**      3 Negat
30f0: 69 76 65 20 69 6e 74 65 67 65 72 20 20 20 20 73  ive integer    s
3100: 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30  pace           0
3110: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f   Beginning of wo
3120: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rd.**           
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 22 2e 22 20 20 20 20 20 20 20 20 20 20 20 20   "."            
3150: 20 35 20 4e 65 67 61 74 69 76 65 20 52 65 61 6c   5 Negative Real
3160: 20 6e 75 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20   num.**         
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20     digit        
3190: 20 20 20 33 20 4e 65 67 61 74 69 76 65 20 69 6e     3 Negative in
31a0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  teger.**        
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
31d0: 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79 20      1 Arbitrary 
31e0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  text.**.**      
31f0: 34 20 52 65 61 6c 20 6e 75 6d 62 65 72 20 20 20  4 Real number   
3200: 20 20 20 20 20 20 73 70 61 63 65 20 20 20 20 20        space     
3210: 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69 6e        0 Beginnin
3220: 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20  g of word.**    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20          digit   
3250: 20 20 20 20 20 20 20 20 34 20 52 65 61 6c 20 6e          4 Real n
3260: 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
3290: 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79 20      1 Arbitrary 
32a0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  text.**.**      
32b0: 35 20 4e 65 67 61 74 69 76 65 20 72 65 61 6c 20  5 Negative real 
32c0: 6e 75 6d 20 20 20 73 70 61 63 65 20 20 20 20 20  num   space     
32d0: 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69 6e        0 Beginnin
32e0: 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20  g of word.**    
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20          digit   
3310: 20 20 20 20 20 20 20 20 35 20 4e 65 67 61 74 69          5 Negati
3320: 76 65 20 72 65 61 6c 20 6e 75 6d 0a 2a 2a 20 20  ve real num.**  
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 77            otherw
3350: 69 73 65 20 20 20 20 20 20 20 31 20 41 72 62 69  ise       1 Arbi
3360: 74 72 61 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a  trary text.**.**
3370: 20 54 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   To implement th
3380: 69 73 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65  is state machine
3390: 2c 20 77 65 20 66 69 72 73 74 20 63 6c 61 73 73  , we first class
33a0: 69 66 79 20 65 61 63 68 20 63 68 61 72 61 63 74  ify each charact
33b0: 65 72 0a 2a 2a 20 69 6e 74 6f 20 6f 6e 20 6f 66  er.** into on of
33c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
33d0: 61 74 65 67 6f 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  ategories:.**.**
33e0: 20 20 20 20 20 20 30 20 20 54 65 78 74 0a 2a 2a        0  Text.**
33f0: 20 20 20 20 20 20 31 20 20 53 70 61 63 65 0a 2a        1  Space.*
3400: 2a 20 20 20 20 20 20 32 20 20 44 69 67 69 74 0a  *      2  Digit.
3410: 2a 2a 20 20 20 20 20 20 33 20 20 22 2d 22 0a 2a  **      3  "-".*
3420: 2a 20 20 20 20 20 20 34 20 20 22 2e 22 0a 2a 2a  *      4  ".".**
3430: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 61 72 62  .** Given an arb
3440: 69 74 72 61 72 79 20 63 68 61 72 61 63 74 65 72  itrary character
3450: 2c 20 74 68 65 20 61 72 72 61 79 20 63 68 61 72  , the array char
3460: 43 6c 61 73 73 5b 5d 20 6d 61 70 73 20 74 68 61  Class[] maps tha
3470: 74 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  t character.** i
3480: 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 61  nto one of the a
3490: 74 6f 76 65 20 63 61 74 65 67 6f 72 69 65 73 2e  tove categories.
34a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
34b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
34c0: 68 61 72 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20  harClass[] = {. 
34d0: 20 20 20 20 20 20 20 2f 2a 20 78 30 20 78 31 20         /* x0 x1 
34e0: 78 32 20 78 33 20 78 34 20 78 35 20 78 36 20 78  x2 x3 x4 x5 x6 x
34f0: 37 20 78 38 20 78 39 20 78 41 20 78 42 20 78 43  7 x8 x9 xA xB xC
3500: 20 78 44 20 78 45 20 78 46 20 2a 2f 0a 2f 2a 20   xD xE xF */./* 
3510: 30 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c  0x */   0, 0, 0,
3520: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3530: 30 2c 20 31 2c 20 31 2c 20 30 2c 20 31 2c 20 30  0, 1, 1, 0, 1, 0
3540: 2c 20 30 2c 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f  , 0, 0,./* 1x */
3550: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
3560: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3570: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3580: 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20 20 31 2c  0,./* 2x */   1,
3590: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
35a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
35b0: 2c 20 30 2c 20 33 2c 20 34 2c 20 30 2c 0a 2f 2a  , 0, 3, 4, 0,./*
35c0: 20 33 78 20 2a 2f 20 20 20 32 2c 20 32 2c 20 32   3x */   2, 2, 2
35d0: 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c  , 2, 2, 2, 2, 2,
35e0: 20 32 2c 20 32 2c 20 30 2c 20 30 2c 20 30 2c 20   2, 2, 0, 0, 0, 
35f0: 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 34 78 20 2a  0, 0, 0,./* 4x *
3600: 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  /   0, 0, 0, 0, 
3610: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3620: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3630: 20 30 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 30   0,./* 5x */   0
3640: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3650: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3660: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f  0, 0, 0, 0, 0,./
3670: 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20  * 6x */   0, 0, 
3680: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3690: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
36a0: 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 37 78 20   0, 0, 0,./* 7x 
36b0: 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  */   0, 0, 0, 0,
36c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
36d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
36e0: 2c 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20 20  , 0,./* 8x */   
36f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3700: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3710: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
3720: 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c 20 30 2c  /* 9x */   0, 0,
3730: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3750: 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 41 78  , 0, 0, 0,./* Ax
3760: 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   */   0, 0, 0, 0
3770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3780: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3790: 30 2c 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20  0, 0,./* Bx */  
37a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
37b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
37c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
37d0: 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c 20 30  ./* Cx */   0, 0
37e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
37f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3800: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 44  0, 0, 0, 0,./* D
3810: 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20  x */   0, 0, 0, 
3820: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3830: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3840: 20 30 2c 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20   0, 0,./* Ex */ 
3850: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
3860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3870: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3880: 2c 0a 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20  ,./* Fx */   0, 
3890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
38a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
38b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 7d 3b 0a   0, 0, 0, 0,.};.
38c0: 23 64 65 66 69 6e 65 20 4e 5f 43 48 41 52 5f 43  #define N_CHAR_C
38d0: 4c 41 53 53 20 35 0a 0a 2f 2a 0a 2a 2a 20 47 69  LASS 5../*.** Gi
38e0: 76 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  ven the current 
38f0: 73 74 61 74 65 20 6e 75 6d 62 65 72 20 28 30 20  state number (0 
3900: 74 68 72 75 20 35 29 2c 20 74 68 69 73 20 61 72  thru 5), this ar
3910: 72 61 79 20 66 69 67 75 72 65 73 0a 2a 2a 20 74  ray figures.** t
3920: 68 65 20 6e 65 77 20 73 74 61 74 65 20 6e 75 6d  he new state num
3930: 62 65 72 20 67 69 76 65 6e 20 74 68 65 20 63 68  ber given the ch
3940: 61 72 61 63 74 65 72 20 63 6c 61 73 73 2e 0a 2a  aracter class..*
3950: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3960: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
3970: 74 65 4d 61 63 68 69 6e 65 5b 5d 20 3d 20 7b 0a  teMachine[] = {.
3980: 20 2f 2a 20 54 65 78 74 2c 20 20 53 70 61 63 65   /* Text,  Space
3990: 2c 20 44 69 67 69 74 2c 20 22 2d 22 2c 20 22 2e  , Digit, "-", ".
39a0: 22 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20  " */.      1,   
39b0: 20 20 20 30 2c 20 20 20 20 32 2c 20 20 20 20 33     0,    2,    3
39c0: 2c 20 20 20 31 2c 20 20 20 20 20 20 2f 2a 20 53  ,   1,      /* S
39d0: 74 61 74 65 20 30 3a 20 42 65 67 69 6e 6e 69 6e  tate 0: Beginnin
39e0: 67 20 6f 66 20 77 6f 72 64 20 2a 2f 0a 20 20 20  g of word */.   
39f0: 20 20 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20     1,      0,   
3a00: 20 32 2c 20 20 20 20 31 2c 20 20 20 31 2c 20 20   2,    1,   1,  
3a10: 20 20 20 20 2f 2a 20 53 74 61 74 65 20 31 3a 20      /* State 1: 
3a20: 41 72 62 69 74 72 61 72 79 20 74 65 78 74 20 2a  Arbitrary text *
3a30: 2f 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20 20  /.      1,      
3a40: 30 2c 20 20 20 20 32 2c 20 20 20 20 31 2c 20 20  0,    2,    1,  
3a50: 20 34 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74   4,      /* Stat
3a60: 65 20 32 3a 20 49 6e 74 65 67 65 72 20 2a 2f 0a  e 2: Integer */.
3a70: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 30 2c        1,      0,
3a80: 20 20 20 20 33 2c 20 20 20 20 31 2c 20 20 20 35      3,    1,   5
3a90: 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20  ,      /* State 
3aa0: 33 3a 20 4e 65 67 61 74 69 76 65 20 69 6e 74 65  3: Negative inte
3ab0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20  ger */.      1, 
3ac0: 20 20 20 20 20 30 2c 20 20 20 20 34 2c 20 20 20       0,    4,   
3ad0: 20 31 2c 20 20 20 31 2c 20 20 20 20 20 20 2f 2a   1,   1,      /*
3ae0: 20 53 74 61 74 65 20 34 3a 20 52 65 61 6c 20 6e   State 4: Real n
3af0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 31  umber */.      1
3b00: 2c 20 20 20 20 20 20 30 2c 20 20 20 20 35 2c 20  ,      0,    5, 
3b10: 20 20 20 31 2c 20 20 20 31 2c 20 20 20 20 20 20     1,   1,      
3b20: 2f 2a 20 53 74 61 74 65 20 35 3a 20 4e 65 67 61  /* State 5: Nega
3b30: 74 69 76 65 20 72 65 61 6c 20 6e 75 6d 20 2a 2f  tive real num */
3b40: 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75  .};../* This rou
3b50: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
3b60: 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 73 74  arison of two st
3b70: 72 69 6e 67 73 2e 20 20 43 61 73 65 20 69 73 20  rings.  Case is 
3b80: 75 73 65 64 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  used only.** if 
3b90: 75 73 65 43 61 73 65 21 3d 30 2e 20 20 4e 75 6d  useCase!=0.  Num
3ba0: 62 65 72 73 20 63 6f 6d 70 61 72 65 20 69 6e 20  bers compare in 
3bb0: 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64 65 72 2e  numerical order.
3bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3bd0: 72 69 76 61 74 65 53 74 72 43 6d 70 28 63 6f 6e  rivateStrCmp(con
3be0: 73 74 20 63 68 61 72 20 2a 61 74 65 78 74 2c 20  st char *atext, 
3bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 74 65 78  const char *btex
3c00: 74 2c 20 69 6e 74 20 75 73 65 43 61 73 65 29 7b  t, int useCase){
3c10: 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69  .  register unsi
3c20: 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62  gned char *a, *b
3c30: 2c 20 2a 6d 61 70 2c 20 63 61 2c 20 63 62 3b 0a  , *map, ca, cb;.
3c40: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20    int result;.  
3c50: 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 63 6c  register int ccl
3c60: 61 73 73 20 3d 20 30 3b 0a 0a 20 20 61 20 3d 20  ass = 0;..  a = 
3c70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
3c80: 29 61 74 65 78 74 3b 0a 20 20 62 20 3d 20 28 75  )atext;.  b = (u
3c90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62  nsigned char *)b
3ca0: 74 65 78 74 3b 0a 20 20 69 66 28 20 75 73 65 43  text;.  if( useC
3cb0: 61 73 65 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20  ase ){.    do{. 
3cc0: 20 20 20 20 20 69 66 28 20 28 63 61 3d 20 2a 61       if( (ca= *a
3cd0: 2b 2b 29 21 3d 28 63 62 3d 20 2a 62 2b 2b 29 20  ++)!=(cb= *b++) 
3ce0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ) break;.      c
3cf0: 63 6c 61 73 73 20 3d 20 73 74 61 74 65 4d 61 63  class = stateMac
3d00: 68 69 6e 65 5b 63 63 6c 61 73 73 2a 4e 5f 43 48  hine[cclass*N_CH
3d10: 41 52 5f 43 4c 41 53 53 20 2b 20 63 68 61 72 43  AR_CLASS + charC
3d20: 6c 61 73 73 5b 63 61 5d 5d 3b 0a 20 20 20 20 7d  lass[ca]];.    }
3d30: 77 68 69 6c 65 28 20 63 61 21 3d 30 20 29 3b 0a  while( ca!=0 );.
3d40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 70    }else{.    map
3d50: 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 3b   = UpperToLower;
3d60: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
3d70: 66 28 20 28 63 61 3d 6d 61 70 5b 2a 61 2b 2b 5d  f( (ca=map[*a++]
3d80: 29 21 3d 28 63 62 3d 6d 61 70 5b 2a 62 2b 2b 5d  )!=(cb=map[*b++]
3d90: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
3da0: 20 63 63 6c 61 73 73 20 3d 20 73 74 61 74 65 4d   cclass = stateM
3db0: 61 63 68 69 6e 65 5b 63 63 6c 61 73 73 2a 4e 5f  achine[cclass*N_
3dc0: 43 48 41 52 5f 43 4c 41 53 53 20 2b 20 63 68 61  CHAR_CLASS + cha
3dd0: 72 43 6c 61 73 73 5b 63 61 5d 5d 3b 0a 20 20 20  rClass[ca]];.   
3de0: 20 7d 77 68 69 6c 65 28 20 63 61 21 3d 30 20 29   }while( ca!=0 )
3df0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
3e00: 63 63 6c 61 73 73 20 29 7b 0a 20 20 20 20 63 61  cclass ){.    ca
3e10: 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
3e20: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  : {.      if( is
3e30: 64 69 67 69 74 28 63 61 29 20 26 26 20 69 73 64  digit(ca) && isd
3e40: 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20 20 20  igit(cb) ){.    
3e50: 20 20 20 20 63 63 6c 61 73 73 20 3d 20 32 3b 0a      cclass = 2;.
3e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
3e70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
3e80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
3e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3ea0: 0a 20 20 73 77 69 74 63 68 28 20 63 63 6c 61 73  .  switch( cclas
3eb0: 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32 3a  s ){.    case 2:
3ec0: 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 0a 20  .    case 3: {. 
3ed0: 20 20 20 20 20 69 66 28 20 69 73 64 69 67 69 74       if( isdigit
3ee0: 28 63 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (ca) ){.        
3ef0: 69 66 28 20 69 73 64 69 67 69 74 28 63 62 29 20  if( isdigit(cb) 
3f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
3f10: 20 61 63 6e 74 2c 20 62 63 6e 74 3b 0a 20 20 20   acnt, bcnt;.   
3f20: 20 20 20 20 20 20 20 61 63 6e 74 20 3d 20 62 63         acnt = bc
3f30: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
3f40: 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74    while( isdigit
3f50: 28 2a 61 2b 2b 29 20 29 20 61 63 6e 74 2b 2b 3b  (*a++) ) acnt++;
3f60: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
3f70: 28 20 69 73 64 69 67 69 74 28 2a 62 2b 2b 29 20  ( isdigit(*b++) 
3f80: 29 20 62 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  ) bcnt++;.      
3f90: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 61 63 6e      result = acn
3fa0: 74 20 2d 20 62 63 6e 74 3b 0a 20 20 20 20 20 20  t - bcnt;.      
3fb0: 20 20 20 20 69 66 28 20 72 65 73 75 6c 74 3d 3d      if( result==
3fc0: 30 20 29 20 72 65 73 75 6c 74 20 3d 20 63 61 2d  0 ) result = ca-
3fd0: 63 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  cb;.        }els
3fe0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
3ff0: 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ult = 1;.       
4000: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
4010: 66 28 20 69 73 64 69 67 69 74 28 63 62 29 20 29  f( isdigit(cb) )
4020: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
4030: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
4040: 73 65 20 69 66 28 20 63 61 3d 3d 27 2e 27 20 29  se if( ca=='.' )
4050: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
4060: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
4070: 65 20 69 66 28 20 63 62 3d 3d 27 2e 27 20 29 7b  e if( cb=='.' ){
4080: 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
4090: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
40a0: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  e{.        resul
40b0: 74 20 3d 20 63 61 20 2d 20 63 62 3b 0a 20 20 20  t = ca - cb;.   
40c0: 20 20 20 20 20 63 63 6c 61 73 73 20 3d 20 32 3b       cclass = 2;
40d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
40e0: 66 28 20 63 63 6c 61 73 73 3d 3d 33 20 29 20 72  f( cclass==3 ) r
40f0: 65 73 75 6c 74 20 3d 20 2d 72 65 73 75 6c 74 3b  esult = -result;
4100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4110: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 30 3a 0a    }.    case 0:.
4120: 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
4130: 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
4140: 72 65 73 75 6c 74 20 3d 20 63 61 20 2d 20 63 62  result = ca - cb
4150: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4160: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
4170: 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20   {.      result 
4180: 3d 20 63 62 20 2d 20 63 61 3b 0a 20 20 20 20 7d  = cb - ca;.    }
4190: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
41a0: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  esult;.}../*.** 
41b0: 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  Do a comparison 
41c0: 6f 66 20 70 75 72 65 20 6e 75 6d 65 72 69 63 73  of pure numerics
41d0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 73 74 72  .  If either str
41e0: 69 6e 67 20 69 73 20 6e 6f 74 20 61 20 70 75 72  ing is not a pur
41f0: 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68  e.** numeric, th
4200: 65 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 4f 74  en return 0.  Ot
4210: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 31  herwise return 1
4220: 20 61 6e 64 20 73 65 74 20 2a 70 52 65 73 75 6c   and set *pResul
4230: 74 20 74 6f 20 62 65 0a 2a 2a 20 6e 65 67 61 74  t to be.** negat
4240: 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
4250: 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
4260: 73 74 20 73 74 72 69 6e 67 20 61 72 65 20 6e 75  st string are nu
4270: 6d 65 72 69 61 6c 6c 79 20 6c 65 73 73 20 74 68  merially less th
4280: 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  an.** equal to, 
4290: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
42a0: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73  the second..*/.s
42b0: 74 61 74 69 63 20 69 6e 74 20 70 72 69 76 61 74  tatic int privat
42c0: 65 43 6f 6d 70 61 72 65 4e 75 6d 28 63 6f 6e 73  eCompareNum(cons
42d0: 74 20 63 68 61 72 20 2a 61 2c 20 63 6f 6e 73 74  t char *a, const
42e0: 20 63 68 61 72 20 2a 62 2c 20 69 6e 74 20 2a 70   char *b, int *p
42f0: 52 65 73 75 6c 74 29 7b 0a 20 20 63 68 61 72 20  Result){.  char 
4300: 2a 65 6e 64 50 74 72 3b 0a 20 20 64 6f 75 62 6c  *endPtr;.  doubl
4310: 65 20 72 41 2c 20 72 42 3b 0a 20 20 69 6e 74 20  e rA, rB;.  int 
4320: 69 73 4e 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a  isNumA, isNumB;.
4330: 20 20 69 66 28 20 69 73 64 69 67 69 74 28 2a 61    if( isdigit(*a
4340: 29 20 7c 7c 20 28 28 2a 61 3d 3d 27 2d 27 20 7c  ) || ((*a=='-' |
4350: 7c 20 2a 61 3d 3d 27 2b 27 29 20 26 26 20 69 73  | *a=='+') && is
4360: 64 69 67 69 74 28 61 5b 31 5d 29 29 20 29 7b 0a  digit(a[1])) ){.
4370: 20 20 20 20 72 41 20 3d 20 73 74 72 74 6f 64 28      rA = strtod(
4380: 61 2c 20 26 65 6e 64 50 74 72 29 3b 0a 20 20 20  a, &endPtr);.   
4390: 20 69 73 4e 75 6d 41 20 3d 20 2a 65 6e 64 50 74   isNumA = *endPt
43a0: 72 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r==0;.  }else{. 
43b0: 20 20 20 69 73 4e 75 6d 41 20 3d 20 30 3b 0a 20     isNumA = 0;. 
43c0: 20 7d 0a 20 20 69 66 28 20 69 73 64 69 67 69 74   }.  if( isdigit
43d0: 28 2a 62 29 20 7c 7c 20 28 28 2a 62 3d 3d 27 2d  (*b) || ((*b=='-
43e0: 27 20 7c 7c 20 2a 62 3d 3d 27 2b 27 29 20 26 26  ' || *b=='+') &&
43f0: 20 69 73 64 69 67 69 74 28 62 5b 31 5d 29 29 20   isdigit(b[1])) 
4400: 29 7b 0a 20 20 20 20 72 42 20 3d 20 73 74 72 74  ){.    rB = strt
4410: 6f 64 28 62 2c 20 26 65 6e 64 50 74 72 29 3b 0a  od(b, &endPtr);.
4420: 20 20 20 20 69 73 4e 75 6d 42 20 3d 20 2a 65 6e      isNumB = *en
4430: 64 50 74 72 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65  dPtr==0;.  }else
4440: 7b 0a 20 20 20 20 69 73 4e 75 6d 42 20 3d 20 30  {.    isNumB = 0
4450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 75  ;.  }.  if( isNu
4460: 6d 42 3d 3d 30 20 26 26 20 69 73 4e 75 6d 41 3d  mB==0 && isNumA=
4470: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4480: 20 69 66 28 20 69 73 4e 75 6d 41 21 3d 69 73 4e   if( isNumA!=isN
4490: 75 6d 42 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  umB ){.    *pRes
44a0: 75 6c 74 20 3d 20 20 69 73 4e 75 6d 41 20 2d 20  ult =  isNumA - 
44b0: 69 73 4e 75 6d 42 3b 0a 20 20 7d 65 6c 73 65 20  isNumB;.  }else 
44c0: 69 66 28 20 72 41 3c 72 42 20 29 7b 0a 20 20 20  if( rA<rB ){.   
44d0: 20 2a 70 52 65 73 75 6c 74 20 3d 20 2d 31 3b 0a   *pResult = -1;.
44e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 41 3e 72    }else if( rA>r
44f0: 42 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 75 6c  B ){.    *pResul
4500: 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 1;.  }else{.
4510: 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 30      *pResult = 0
4520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
4530: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 63 6f 6d  ;.}../* This com
4540: 70 61 72 69 73 6f 6e 20 72 6f 75 74 69 6e 65 20  parison routine 
4550: 69 73 20 77 68 61 74 20 77 65 20 75 73 65 20 66  is what we use f
4560: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  or comparison op
4570: 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61  erations.** in a
4580: 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  n SQL expression
4590: 2e 20 20 28 45 78 3a 20 20 6e 61 6d 65 3c 27 48  .  (Ex:  name<'H
45a0: 65 6c 6c 6f 27 20 6f 72 20 76 61 6c 75 65 3c 35  ello' or value<5
45b0: 29 2e 20 20 43 6f 6d 70 61 72 65 20 74 77 6f 0a  ).  Compare two.
45c0: 2a 2a 20 73 74 72 69 6e 67 73 2e 20 20 55 73 65  ** strings.  Use
45d0: 20 63 61 73 65 20 6f 6e 6c 79 20 61 73 20 61 20   case only as a 
45e0: 74 69 65 2d 62 72 65 61 6b 65 72 2e 20 20 4e 75  tie-breaker.  Nu
45f0: 6d 62 65 72 73 20 63 6f 6d 70 61 72 65 20 69 6e  mbers compare in
4600: 0a 2a 2a 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72  .** numerical or
4610: 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
4620: 74 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  teCompare(const 
4630: 63 68 61 72 20 2a 61 74 65 78 74 2c 20 63 6f 6e  char *atext, con
4640: 73 74 20 63 68 61 72 20 2a 62 74 65 78 74 29 7b  st char *btext){
4650: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20  .  int result;. 
4660: 20 69 66 28 20 21 70 72 69 76 61 74 65 43 6f 6d   if( !privateCom
4670: 70 61 72 65 4e 75 6d 28 61 74 65 78 74 2c 20 62  pareNum(atext, b
4680: 74 65 78 74 2c 20 26 72 65 73 75 6c 74 29 20 7c  text, &result) |
4690: 7c 20 72 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20  | result==0 ){. 
46a0: 20 20 20 72 65 73 75 6c 74 20 3d 20 70 72 69 76     result = priv
46b0: 61 74 65 53 74 72 43 6d 70 28 61 74 65 78 74 2c  ateStrCmp(atext,
46c0: 20 62 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20   btext, 0);.    
46d0: 69 66 28 20 72 65 73 75 6c 74 3d 3d 30 20 29 20  if( result==0 ) 
46e0: 72 65 73 75 6c 74 20 3d 20 70 72 69 76 61 74 65  result = private
46f0: 53 74 72 43 6d 70 28 61 74 65 78 74 2c 20 62 74  StrCmp(atext, bt
4700: 65 78 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  ext, 1);.  }.  r
4710: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a  eturn result;.}.
4720: 0a 2f 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6f  ./*.** If you co
4730: 6d 70 69 6c 65 20 6a 75 73 74 20 74 68 69 73 20  mpile just this 
4740: 6f 6e 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  one file with th
4750: 65 20 2d 44 54 45 53 54 5f 43 4f 4d 50 41 52 45  e -DTEST_COMPARE
4760: 3d 31 20 6f 70 74 69 6f 6e 2c 0a 2a 2a 20 69 74  =1 option,.** it
4770: 20 67 65 6e 65 72 61 74 65 73 20 61 20 70 72 6f   generates a pro
4780: 67 72 61 6d 20 74 6f 20 74 65 73 74 20 74 68 65  gram to test the
4790: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 72 6f 75   comparisons rou
47a0: 74 69 6e 65 73 2e 20 20 0a 2a 2f 0a 23 69 66 64  tines.  .*/.#ifd
47b0: 65 66 20 54 45 53 54 5f 43 4f 4d 50 41 52 45 0a  ef TEST_COMPARE.
47c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
47d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
47e0: 64 69 6f 2e 68 3e 0a 69 6e 74 20 73 6f 72 74 43  dio.h>.int sortC
47f0: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  mp(const char **
4800: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  a, const char **
4810: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
4820: 69 74 65 43 6f 6d 70 61 72 65 28 2a 61 2c 20 2a  iteCompare(*a, *
4830: 62 29 3b 0a 7d 0a 69 6e 74 20 6d 61 69 6e 28 69  b);.}.int main(i
4840: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
4850: 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20  argv){.  int i, 
4860: 6a 2c 20 6b 2c 20 6e 2c 20 63 6e 74 3b 0a 20 20  j, k, n, cnt;.  
4870: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 53  static char *azS
4880: 74 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 61  tr[] = {.     "a
4890: 62 63 22 2c 20 22 61 42 63 22 2c 20 22 61 62 63  bc", "aBc", "abc
48a0: 64 22 2c 20 22 61 42 63 64 22 2c 20 0a 20 20 20  d", "aBcd", .   
48b0: 20 20 22 31 32 33 22 2c 20 22 31 32 34 22 2c 20    "123", "124", 
48c0: 22 31 32 33 34 22 2c 20 22 2d 31 32 33 22 2c 20  "1234", "-123", 
48d0: 22 2d 31 32 34 22 2c 20 22 2d 31 32 33 34 22 2c  "-124", "-1234",
48e0: 20 22 2b 31 32 34 22 2c 0a 20 20 20 20 20 22 31   "+124",.     "1
48f0: 32 33 2e 34 35 22 2c 20 22 31 32 33 2e 34 35 36  23.45", "123.456
4900: 22 2c 20 22 31 32 33 2e 34 36 22 2c 20 22 2d 31  ", "123.46", "-1
4910: 32 33 2e 34 35 22 2c 20 22 2d 31 32 33 2e 34 36  23.45", "-123.46
4920: 22 2c 20 22 2d 31 32 33 2e 34 35 36 22 2c 20 0a  ", "-123.456", .
4930: 20 20 20 20 20 22 78 39 22 2c 20 22 78 31 30 22       "x9", "x10"
4940: 2c 20 22 78 2d 39 22 2c 20 22 78 2d 31 30 22 2c  , "x-9", "x-10",
4950: 20 22 58 39 22 2c 20 22 58 31 30 22 2c 0a 20 20   "X9", "X10",.  
4960: 20 20 20 22 31 2e 32 33 34 65 2b 30 32 22 2c 20     "1.234e+02", 
4970: 22 2b 31 32 33 22 2c 20 22 31 2e 32 33 45 32 22  "+123", "1.23E2"
4980: 2c 20 22 31 2e 32 33 34 35 65 2b 32 22 2c 20 22  , "1.2345e+2", "
4990: 2d 31 2e 32 33 34 35 65 32 22 2c 20 22 2b 77 22  -1.2345e2", "+w"
49a0: 0a 20 20 7d 3b 0a 20 20 6e 20 3d 20 73 69 7a 65  .  };.  n = size
49b0: 6f 66 28 61 7a 53 74 72 29 2f 73 69 7a 65 6f 66  of(azStr)/sizeof
49c0: 28 61 7a 53 74 72 5b 30 5d 29 3b 0a 20 20 71 73  (azStr[0]);.  qs
49d0: 6f 72 74 28 61 7a 53 74 72 2c 20 6e 2c 20 73 69  ort(azStr, n, si
49e0: 7a 65 6f 66 28 61 7a 53 74 72 5b 30 5d 29 2c 20  zeof(azStr[0]), 
49f0: 73 6f 72 74 43 6d 70 29 3b 0a 20 20 66 6f 72 28  sortCmp);.  for(
4a00: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
4a10: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e      printf("%s\n
4a20: 22 2c 20 61 7a 53 74 72 5b 69 5d 29 3b 0a 20 20  ", azStr[i]);.  
4a30: 7d 0a 20 20 70 72 69 6e 74 66 28 22 53 61 6e 69  }.  printf("Sani
4a40: 74 79 31 2e 2e 2e 22 29 3b 0a 20 20 66 66 6c 75  ty1...");.  fflu
4a50: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 63 6e  sh(stdout);.  cn
4a60: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
4a70: 3b 20 69 3c 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<n-1; i++){. 
4a80: 20 20 20 63 68 61 72 20 2a 61 20 3d 20 61 7a 53     char *a = azS
4a90: 74 72 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  tr[i];.    for(j
4aa0: 3d 69 2b 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b  =i+1; j<n; j++){
4ab0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 62 20 3d  .      char *b =
4ac0: 20 61 7a 53 74 72 5b 6a 5d 3b 0a 20 20 20 20 20   azStr[j];.     
4ad0: 20 69 66 28 20 73 71 6c 69 74 65 43 6f 6d 70 61   if( sqliteCompa
4ae0: 72 65 28 61 2c 62 29 20 21 3d 20 2d 73 71 6c 69  re(a,b) != -sqli
4af0: 74 65 43 6f 6d 70 61 72 65 28 62 2c 61 29 20 29  teCompare(b,a) )
4b00: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
4b10: 28 22 46 61 69 6c 65 64 21 20 20 5c 22 25 73 5c  ("Failed!  \"%s\
4b20: 22 20 76 73 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  " vs \"%s\"\n", 
4b30: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 69  a, b);.        i
4b40: 20 3d 20 6a 20 3d 20 6e 3b 0a 20 20 20 20 20 20   = j = n;.      
4b50: 7d 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  }.      cnt++;. 
4b60: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
4b70: 3c 6e 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  <n ){.    printf
4b80: 28 22 20 4f 4b 20 28 25 64 29 5c 6e 22 2c 20 63  (" OK (%d)\n", c
4b90: 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74  nt);.  }.  print
4ba0: 66 28 22 53 61 6e 69 74 79 32 2e 2e 2e 22 29 3b  f("Sanity2...");
4bb0: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
4bc0: 29 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  );.  cnt = 0;.  
4bd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
4be0: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 20  +){.    char *a 
4bf0: 3d 20 61 7a 53 74 72 5b 69 5d 3b 0a 20 20 20 20  = azStr[i];.    
4c00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
4c10: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
4c20: 62 20 3d 20 61 7a 53 74 72 5b 6a 5d 3b 0a 20 20  b = azStr[j];.  
4c30: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
4c40: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
4c50: 63 68 61 72 20 2a 63 20 3d 20 61 7a 53 74 72 5b  char *c = azStr[
4c60: 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  k];.        int 
4c70: 78 31 2c 20 78 32 2c 20 78 33 2c 20 73 75 63 63  x1, x2, x3, succ
4c80: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 78 31 20  ess;.        x1 
4c90: 3d 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28  = sqliteCompare(
4ca0: 61 2c 62 29 3b 0a 20 20 20 20 20 20 20 20 78 32  a,b);.        x2
4cb0: 20 3d 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65   = sqliteCompare
4cc0: 28 62 2c 63 29 3b 0a 20 20 20 20 20 20 20 20 78  (b,c);.        x
4cd0: 33 20 3d 20 73 71 6c 69 74 65 43 6f 6d 70 61 72  3 = sqliteCompar
4ce0: 65 28 61 2c 63 29 3b 0a 20 20 20 20 20 20 20 20  e(a,c);.        
4cf0: 69 66 28 20 78 31 3d 3d 30 20 29 7b 0a 20 20 20  if( x1==0 ){.   
4d00: 20 20 20 20 20 20 20 73 75 63 63 65 73 73 20 3d         success =
4d10: 20 78 32 3d 3d 78 33 3b 0a 20 20 20 20 20 20 20   x2==x3;.       
4d20: 20 7d 65 6c 73 65 20 69 66 28 20 78 31 3c 30 20   }else if( x1<0 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 75 63  ){.          suc
4d40: 63 65 73 73 20 3d 20 28 78 32 3c 3d 30 20 26 26  cess = (x2<=0 &&
4d50: 20 78 33 3c 3d 30 29 20 7c 7c 20 78 32 3e 30 3b   x3<=0) || x2>0;
4d60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4d70: 20 20 20 20 20 20 20 20 20 20 73 75 63 63 65 73            succes
4d80: 73 20 3d 20 28 78 32 3e 3d 30 20 26 26 20 78 33  s = (x2>=0 && x3
4d90: 3e 3d 30 29 20 7c 7c 20 78 32 3c 30 3b 0a 20 20  >=0) || x2<0;.  
4da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4db0: 69 66 28 20 21 73 75 63 63 65 73 73 20 29 7b 0a  if( !success ){.
4dc0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
4dd0: 28 22 46 61 69 6c 65 64 21 20 20 5c 22 25 73 5c  ("Failed!  \"%s\
4de0: 22 20 76 73 20 5c 22 25 73 5c 22 20 76 73 20 5c  " vs \"%s\" vs \
4df0: 22 25 73 5c 22 5c 6e 22 2c 20 61 2c 20 62 2c 20  "%s\"\n", a, b, 
4e00: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  c);.          i 
4e10: 3d 20 6a 20 3d 20 6b 20 3d 20 6e 2b 31 3b 0a 20  = j = k = n+1;. 
4e20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4e30: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   cnt++;.      }.
4e40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4e50: 69 3c 6e 2b 31 20 29 7b 0a 20 20 20 20 70 72 69  i<n+1 ){.    pri
4e60: 6e 74 66 28 22 20 4f 4b 20 28 25 64 29 5c 6e 22  ntf(" OK (%d)\n"
4e70: 2c 20 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , cnt);.  }.  re
4e80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4e90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4ea0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
4eb0: 20 73 6f 72 74 69 6e 67 2e 20 20 45 61 63 68 20   sorting.  Each 
4ec0: 6b 65 79 20 69 73 20 61 20 6c 69 73 74 20 6f 66  key is a list of
4ed0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
4ee0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
4ef0: 73 74 72 69 6e 67 73 2e 20 20 54 68 65 20 6c 69  strings.  The li
4f00: 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  st is terminated
4f10: 20 62 79 20 74 77 6f 20 6e 75 6c 6c 73 20 69 6e   by two nulls in
4f20: 0a 2a 2a 20 61 20 72 6f 77 2e 20 20 46 6f 72 20  .** a row.  For 
4f30: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c  example, the fol
4f40: 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20 6b  lowing text is k
4f50: 65 79 20 77 69 74 68 20 74 68 72 65 65 20 73 74  ey with three st
4f60: 72 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rings:.**.**    
4f70: 20 20 20 20 20 20 20 20 2b 6f 6e 65 5c 30 30 30          +one\000
4f80: 2d 74 77 6f 5c 30 30 30 2b 74 68 72 65 65 5c 30  -two\000+three\0
4f90: 30 30 5c 30 30 30 0a 2a 2a 0a 2a 2a 20 42 6f 74  00\000.**.** Bot
4fa0: 68 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c  h arguments will
4fb0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
4fc0: 75 6d 62 65 72 20 6f 66 20 73 74 72 69 6e 67 73  umber of strings
4fd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
4fe0: 2a 2a 20 72 65 74 75 72 6e 73 20 6e 65 67 61 74  ** returns negat
4ff0: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
5000: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
5010: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
5020: 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 2c 20 65 71  less.** than, eq
5030: 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
5040: 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
5050: 74 2e 20 20 28 52 65 73 75 6c 74 20 69 73 20 61  t.  (Result is a
5060: 2d 62 29 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  -b)..**.** Every
5070: 20 73 74 72 69 6e 67 20 62 65 67 69 6e 73 20 77   string begins w
5080: 69 74 68 20 65 69 74 68 65 72 20 61 20 22 2b 22  ith either a "+"
5090: 20 6f 72 20 22 2d 22 20 63 68 61 72 61 63 74 65   or "-" characte
50a0: 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 68  r.  If the.** ch
50b0: 61 72 61 63 74 65 72 20 69 73 20 22 2d 22 20 74  aracter is "-" t
50c0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
50d0: 61 6c 75 65 20 69 73 20 6e 65 67 61 74 65 64 2e  alue is negated.
50e0: 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 0a 2a    This is done.*
50f0: 2a 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  * to implement a
5100: 20 73 6f 72 74 20 69 6e 20 64 65 73 63 65 6e 64   sort in descend
5110: 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e  ing order..*/.in
5120: 74 20 73 71 6c 69 74 65 53 6f 72 74 43 6f 6d 70  t sqliteSortComp
5130: 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  are(const char *
5140: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
5150: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ){.  int len;.  
5160: 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20  int res = 0;..  
5170: 77 68 69 6c 65 28 20 72 65 73 3d 3d 30 20 26 26  while( res==0 &&
5180: 20 2a 61 20 26 26 20 2a 62 20 29 7b 0a 20 20 20   *a && *b ){.   
5190: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 43 6f 6d   res = sqliteCom
51a0: 70 61 72 65 28 26 61 5b 31 5d 2c 20 26 62 5b 31  pare(&a[1], &b[1
51b0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d  ]);.    if( res=
51c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20  =0 ){.      len 
51d0: 3d 20 73 74 72 6c 65 6e 28 61 29 20 2b 20 31 3b  = strlen(a) + 1;
51e0: 0a 20 20 20 20 20 20 61 20 2b 3d 20 6c 65 6e 3b  .      a += len;
51f0: 0a 20 20 20 20 20 20 62 20 2b 3d 20 6c 65 6e 3b  .      b += len;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 2a 61 3d 3d 27 2d 27 20 29 20 72 65 73 20 3d   *a=='-' ) res =
5220: 20 2d 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20   -res;.  return 
5230: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  res;.}../*.** So
5240: 6d 65 20 70 6f 77 65 72 73 20 6f 66 20 36 34 2e  me powers of 64.
5250: 20 20 54 68 65 73 65 20 6e 75 6d 62 65 72 73 20    These numbers 
5260: 61 6e 64 20 74 68 65 69 72 20 72 65 63 69 70 72  and their recipr
5270: 69 63 61 6c 73 20 73 68 6f 75 6c 64 0a 2a 2a 20  icals should.** 
5280: 61 6c 6c 20 68 61 76 65 20 65 78 61 63 74 20 72  all have exact r
5290: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 69  epresentations i
52a0: 6e 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  n the floating p
52b0: 6f 69 6e 74 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a  oint format..*/.
52c0: 23 64 65 66 69 6e 65 20 5f 36 34 65 33 20 20 28  #define _64e3  (
52d0: 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20 36 34  64.0 * 64.0 * 64
52e0: 2e 30 29 0a 23 64 65 66 69 6e 65 20 5f 36 34 65  .0).#define _64e
52f0: 34 20 20 28 36 34 2e 30 20 2a 20 36 34 2e 30 20  4  (64.0 * 64.0 
5300: 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30 29 0a 23  * 64.0 * 64.0).#
5310: 64 65 66 69 6e 65 20 5f 36 34 65 31 35 20 28 5f  define _64e15 (_
5320: 36 34 65 33 20 2a 20 5f 36 34 65 34 20 2a 20 5f  64e3 * _64e4 * _
5330: 36 34 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64  64e4 * _64e4).#d
5340: 65 66 69 6e 65 20 5f 36 34 65 31 36 20 28 5f 36  efine _64e16 (_6
5350: 34 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36  4e4 * _64e4 * _6
5360: 34 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64 65  4e4 * _64e4).#de
5370: 66 69 6e 65 20 5f 36 34 65 36 33 20 28 5f 36 34  fine _64e63 (_64
5380: 65 31 35 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f  e15 * _64e16 * _
5390: 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 29 0a  64e16 * _64e16).
53a0: 23 64 65 66 69 6e 65 20 5f 36 34 65 36 34 20 28  #define _64e64 (
53b0: 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 20  _64e16 * _64e16 
53c0: 2a 20 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31  * _64e16 * _64e1
53d0: 36 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  6)../*.** The fo
53e0: 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72  llowing procedur
53f0: 65 20 63 6f 6e 76 65 72 74 73 20 61 20 64 6f 75  e converts a dou
5400: 62 6c 65 2d 70 72 65 63 69 73 69 6f 6e 20 66 6c  ble-precision fl
5410: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
5420: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 61 20 73 74  number into a st
5430: 72 69 6e 67 2e 20 20 54 68 65 20 72 65 73 75 6c  ring.  The resul
5440: 74 69 6e 67 20 73 74 72 69 6e 67 20 68 61 73 20  ting string has 
5450: 74 68 65 20 70 72 6f 70 65 72 74 79 20 74 68 61  the property tha
5460: 74 0a 2a 2a 20 74 77 6f 20 73 75 63 68 20 73 74  t.** two such st
5470: 72 69 6e 67 73 20 63 6f 6d 70 61 72 69 65 64 20  rings comparied 
5480: 75 73 69 6e 67 20 73 74 72 63 6d 70 28 29 20 6f  using strcmp() o
5490: 72 20 6d 65 6d 63 6d 70 28 29 20 77 69 6c 6c 20  r memcmp() will 
54a0: 67 69 76 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  give the.** same
54b0: 20 72 65 73 75 6c 74 73 20 61 73 20 63 6f 6d 70   results as comp
54c0: 61 72 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  aring the origin
54d0: 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  al floating poin
54e0: 74 20 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a 2a 2a  t numbers..**.**
54f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5500: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
5510: 65 20 64 61 74 61 62 61 73 65 20 6b 65 79 73 20  e database keys 
5520: 66 72 6f 6d 20 66 6c 6f 61 74 69 6e 67 20 70 6f  from floating po
5530: 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 73  int.** numbers s
5540: 75 63 68 20 74 68 61 74 20 74 68 65 20 6b 65 79  uch that the key
5550: 73 20 73 6f 72 74 20 69 6e 20 74 68 65 20 73 61  s sort in the sa
5560: 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20  me order as the 
5570: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 66 6c 6f 61  original.** floa
5580: 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
5590: 72 73 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  rs even though t
55a0: 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6d 70  he keys are comp
55b0: 61 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 6d 65  ared using.** me
55c0: 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  mcmp()..**.** Th
55d0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
55e0: 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  on should have a
55f0: 6c 6c 6f 63 61 74 65 64 20 61 74 20 6c 65 61 73  llocated at leas
5600: 74 20 31 34 20 63 68 61 72 61 63 74 65 72 73 0a  t 14 characters.
5610: 2a 2a 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  ** of space for 
5620: 74 68 65 20 62 75 66 66 65 72 20 7a 5b 5d 2e 0a  the buffer z[]..
5630: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65  */.void sqliteRe
5640: 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 64 6f 75  alToSortable(dou
5650: 62 6c 65 20 72 2c 20 63 68 61 72 20 2a 7a 29 7b  ble r, char *z){
5660: 0a 20 20 69 6e 74 20 6e 65 67 3b 0a 20 20 69 6e  .  int neg;.  in
5670: 74 20 65 78 70 3b 0a 20 20 69 6e 74 20 63 6e 74  t exp;.  int cnt
5680: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
5690: 20 61 72 72 61 79 20 6d 61 70 73 20 69 6e 74 65   array maps inte
56a0: 67 65 72 73 20 62 65 74 77 65 65 6e 20 30 20 61  gers between 0 a
56b0: 6e 64 20 36 33 20 69 6e 74 6f 20 62 61 73 65 2d  nd 63 into base-
56c0: 36 34 20 64 69 67 69 74 73 2e 0a 20 20 2a 2a 20  64 digits..  ** 
56d0: 54 68 65 20 64 69 67 69 74 73 20 6d 75 73 74 20  The digits must 
56e0: 62 65 20 63 68 6f 73 65 6e 20 73 75 63 68 20 61  be chosen such a
56f0: 74 20 74 68 65 69 72 20 41 53 43 49 49 20 63 6f  t their ASCII co
5700: 64 65 73 20 61 72 65 20 69 6e 63 72 65 61 73 69  des are increasi
5710: 6e 67 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6d 65  ng..  ** This me
5720: 61 6e 73 20 77 65 20 63 61 6e 20 6e 6f 74 20 75  ans we can not u
5730: 73 65 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  se the tradition
5740: 61 6c 20 62 61 73 65 2d 36 34 20 64 69 67 69 74  al base-64 digit
5750: 20 73 65 74 2e 20 2a 2f 0a 20 20 73 74 61 74 69   set. */.  stati
5760: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69  c const char zDi
5770: 67 69 74 5b 5d 20 3d 20 0a 20 20 20 20 20 22 30  git[] = .     "0
5780: 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20  123456789".     
5790: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
57a0: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
57b0: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
57c0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
57d0: 20 20 20 20 22 7c 7e 22 3b 0a 20 20 69 66 28 20      "|~";.  if( 
57e0: 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 6e 65 67  r<0.0 ){.    neg
57f0: 20 3d 20 31 3b 0a 20 20 20 20 72 20 3d 20 2d 72   = 1;.    r = -r
5800: 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27  ;.    *z++ = '-'
5810: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
5820: 20 6e 65 67 20 3d 20 30 3b 0a 20 20 20 20 2a 7a   neg = 0;.    *z
5830: 2b 2b 20 3d 20 27 30 27 3b 0a 20 20 7d 0a 20 20  ++ = '0';.  }.  
5840: 65 78 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  exp = 0;..  if( 
5850: 72 3d 3d 30 2e 30 20 29 7b 0a 20 20 20 20 65 78  r==0.0 ){.    ex
5860: 70 20 3d 20 2d 31 30 32 34 3b 0a 20 20 7d 65 6c  p = -1024;.  }el
5870: 73 65 20 69 66 28 20 72 3c 28 30 2e 35 2f 36 34  se if( r<(0.5/64
5880: 2e 30 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  .0) ){.    while
5890: 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 36 34  ( r < 0.5/_64e64
58a0: 20 26 26 20 65 78 70 20 3e 20 2d 39 36 31 20 20   && exp > -961  
58b0: 29 7b 20 72 20 2a 3d 20 5f 36 34 65 36 34 3b 20  ){ r *= _64e64; 
58c0: 20 65 78 70 20 2d 3d 20 36 34 3b 20 7d 0a 20 20   exp -= 64; }.  
58d0: 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e 35    while( r < 0.5
58e0: 2f 5f 36 34 65 31 36 20 26 26 20 65 78 70 20 3e  /_64e16 && exp >
58f0: 20 2d 31 30 30 39 20 29 7b 20 72 20 2a 3d 20 5f   -1009 ){ r *= _
5900: 36 34 65 31 36 3b 20 20 65 78 70 20 2d 3d 20 31  64e16;  exp -= 1
5910: 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20  6; }.    while( 
5920: 72 20 3c 20 30 2e 35 2f 5f 36 34 65 34 20 20 26  r < 0.5/_64e4  &
5930: 26 20 65 78 70 20 3e 20 2d 31 30 32 31 20 29 7b  & exp > -1021 ){
5940: 20 72 20 2a 3d 20 5f 36 34 65 34 3b 20 20 20 65   r *= _64e4;   e
5950: 78 70 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77  xp -= 4; }.    w
5960: 68 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f 36 34  hile( r < 0.5/64
5970: 2e 30 20 20 20 26 26 20 65 78 70 20 3e 20 2d 31  .0   && exp > -1
5980: 30 32 34 20 29 7b 20 72 20 2a 3d 20 36 34 2e 30  024 ){ r *= 64.0
5990: 3b 20 20 20 20 65 78 70 20 2d 3d 20 31 3b 20 7d  ;    exp -= 1; }
59a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 3e 3d  .  }else if( r>=
59b0: 30 2e 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  0.5 ){.    while
59c0: 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34 65 36  ( r >= 0.5*_64e6
59d0: 33 20 26 26 20 65 78 70 20 3c 20 39 36 30 20 20  3 && exp < 960  
59e0: 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36 34 65  ){ r *= 1.0/_64e
59f0: 36 34 3b 20 65 78 70 20 2b 3d 20 36 34 3b 20 7d  64; exp += 64; }
5a00: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d  .    while( r >=
5a10: 20 30 2e 35 2a 5f 36 34 65 31 35 20 26 26 20 65   0.5*_64e15 && e
5a20: 78 70 20 3c 20 31 30 30 38 20 29 7b 20 72 20 2a  xp < 1008 ){ r *
5a30: 3d 20 31 2e 30 2f 5f 36 34 65 31 36 3b 20 65 78  = 1.0/_64e16; ex
5a40: 70 20 2b 3d 20 31 36 3b 20 7d 0a 20 20 20 20 77  p += 16; }.    w
5a50: 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f  hile( r >= 0.5*_
5a60: 36 34 65 33 20 20 26 26 20 65 78 70 20 3c 20 31  64e3  && exp < 1
5a70: 30 32 30 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f  020 ){ r *= 1.0/
5a80: 5f 36 34 65 34 3b 20 20 65 78 70 20 2b 3d 20 34  _64e4;  exp += 4
5a90: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72  ; }.    while( r
5aa0: 20 3e 3d 20 30 2e 35 20 20 20 20 20 20 20 20 26   >= 0.5        &
5ab0: 26 20 65 78 70 20 3c 20 31 30 32 33 20 29 7b 20  & exp < 1023 ){ 
5ac0: 72 20 2a 3d 20 31 2e 30 2f 36 34 2e 30 3b 20 20  r *= 1.0/64.0;  
5ad0: 20 65 78 70 20 2b 3d 20 31 3b 20 7d 0a 20 20 7d   exp += 1; }.  }
5ae0: 0a 20 20 69 66 28 20 6e 65 67 20 29 7b 0a 20 20  .  if( neg ){.  
5af0: 20 20 65 78 70 20 3d 20 2d 65 78 70 3b 0a 20 20    exp = -exp;.  
5b00: 20 20 72 20 3d 20 2d 72 3b 0a 20 20 7d 0a 20 20    r = -r;.  }.  
5b10: 65 78 70 20 2b 3d 20 31 30 32 34 3b 0a 20 20 72  exp += 1024;.  r
5b20: 20 2b 3d 20 30 2e 35 3b 0a 20 20 69 66 28 20 65   += 0.5;.  if( e
5b30: 78 70 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  xp<0 ) return;. 
5b40: 20 69 66 28 20 65 78 70 3e 3d 32 30 34 38 20 7c   if( exp>=2048 |
5b50: 7c 20 72 3e 3d 31 2e 30 20 29 7b 0a 20 20 20 20  | r>=1.0 ){.    
5b60: 73 74 72 63 70 79 28 7a 2c 20 22 7e 7e 7e 7e 7e  strcpy(z, "~~~~~
5b70: 7e 7e 7e 7e 7e 7e 7e 22 29 3b 0a 20 20 20 20 72  ~~~~~~~");.    r
5b80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a 7a 2b  eturn;.  }.  *z+
5b90: 2b 20 3d 20 7a 44 69 67 69 74 5b 28 65 78 70 3e  + = zDigit[(exp>
5ba0: 3e 36 29 26 30 78 33 66 5d 3b 0a 20 20 2a 7a 2b  >6)&0x3f];.  *z+
5bb0: 2b 20 3d 20 7a 44 69 67 69 74 5b 65 78 70 20 26  + = zDigit[exp &
5bc0: 20 30 78 33 66 5d 3b 0a 20 20 77 68 69 6c 65 28   0x3f];.  while(
5bd0: 20 72 3e 30 2e 30 20 26 26 20 63 6e 74 3c 31 30   r>0.0 && cnt<10
5be0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 67 69   ){.    int digi
5bf0: 74 3b 0a 20 20 20 20 72 20 2a 3d 20 36 34 2e 30  t;.    r *= 64.0
5c00: 3b 0a 20 20 20 20 64 69 67 69 74 20 3d 20 72 3b  ;.    digit = r;
5c10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 69 67  .    assert( dig
5c20: 69 74 3e 3d 30 20 26 26 20 64 69 67 69 74 3c 36  it>=0 && digit<6
5c30: 34 20 29 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20  4 );.    *z++ = 
5c40: 7a 44 69 67 69 74 5b 64 69 67 69 74 20 26 20 30  zDigit[digit & 0
5c50: 78 33 66 5d 3b 0a 20 20 20 20 72 20 2d 3d 20 64  x3f];.    r -= d
5c60: 69 67 69 74 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b  igit;.    cnt++;
5c70: 0a 20 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  .  }.  *z = 0;.}
5c80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5c90: 55 54 46 38 0a 2f 2a 0a 2a 2a 20 58 20 69 73 20  UTF8./*.** X is 
5ca0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5cb0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
5cc0: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
5cd0: 2e 20 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20  .  Increment.** 
5ce0: 58 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  X so that it poi
5cf0: 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nts to the next 
5d00: 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69 73  character.  This
5d10: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67 68   only works righ
5d20: 74 0a 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74 73  t.** if X points
5d30: 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   to a well-forme
5d40: 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a  d UTF-8 string..
5d50: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
5d60: 65 4e 65 78 74 43 68 61 72 28 58 29 20 20 77 68  eNextChar(X)  wh
5d70: 69 6c 65 28 20 28 30 78 63 30 26 2a 2b 2b 28 58  ile( (0xc0&*++(X
5d80: 29 29 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64 65  ))==0x80 ){}.#de
5d90: 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72 56  fine sqliteCharV
5da0: 61 6c 28 58 29 20 20 20 73 71 6c 69 74 65 5f 75  al(X)   sqlite_u
5db0: 74 66 38 5f 74 6f 5f 69 6e 74 28 58 29 0a 0a 23  tf8_to_int(X)..#
5dc0: 65 6c 73 65 20 2f 2a 20 21 64 65 66 69 6e 65 64  else /* !defined
5dd0: 28 53 51 4c 49 54 45 5f 55 54 46 38 29 20 2a 2f  (SQLITE_UTF8) */
5de0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 69 73 6f 38 38  ./*.** For iso88
5df0: 35 39 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  59 encoding, the
5e00: 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 20   next character 
5e10: 69 73 20 6a 75 73 74 20 74 68 65 20 6e 65 78 74  is just the next
5e20: 20 62 79 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e   byte..*/.#defin
5e30: 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72  e sqliteNextChar
5e40: 28 58 29 20 20 28 2b 2b 28 58 29 29 3b 0a 23 64  (X)  (++(X));.#d
5e50: 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72  efine sqliteChar
5e60: 56 61 6c 28 58 29 20 20 20 28 28 69 6e 74 29 2a  Val(X)   ((int)*
5e70: 28 58 29 29 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  (X))..#endif /* 
5e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
5e90: 54 46 38 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66  TF8) */...#ifdef
5ea0: 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 2f 2a 0a   SQLITE_UTF8./*.
5eb0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 55  ** Convert the U
5ec0: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 74  TF-8 character t
5ed0: 6f 20 77 68 69 63 68 20 7a 20 70 6f 69 6e 74 73  o which z points
5ee0: 20 69 6e 74 6f 20 61 20 33 31 2d 62 69 74 0a 2a   into a 31-bit.*
5ef0: 2a 20 55 43 53 20 63 68 61 72 61 63 74 65 72 2e  * UCS character.
5f00: 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
5f10: 73 20 72 69 67 68 74 20 69 66 20 7a 20 70 6f 69  s right if z poi
5f20: 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f  nts to a well-fo
5f30: 72 6d 65 64 0a 2a 2a 20 55 54 46 2d 38 20 73 74  rmed.** UTF-8 st
5f40: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
5f50: 69 6e 74 20 73 71 6c 69 74 65 5f 75 74 66 38 5f  int sqlite_utf8_
5f60: 74 6f 5f 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73  to_int(const uns
5f70: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a  igned char *z){.
5f80: 20 20 69 6e 74 20 63 3b 0a 20 20 73 74 61 74 69    int c;.  stati
5f90: 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 6e 69 74  c const int init
5fa0: 56 61 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  Val[] = {.      
5fb0: 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33  0,   1,   2,   3
5fc0: 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c  ,   4,   5,   6,
5fd0: 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c 20     7,   8,   9, 
5fe0: 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20 20   10,  11,  12,  
5ff0: 31 33 2c 20 20 31 34 2c 0a 20 20 20 20 20 31 35  13,  14,.     15
6000: 2c 20 20 31 36 2c 20 20 31 37 2c 20 20 31 38 2c  ,  16,  17,  18,
6010: 20 20 31 39 2c 20 20 32 30 2c 20 20 32 31 2c 20    19,  20,  21, 
6020: 20 32 32 2c 20 20 32 33 2c 20 20 32 34 2c 20 20   22,  23,  24,  
6030: 32 35 2c 20 20 32 36 2c 20 20 32 37 2c 20 20 32  25,  26,  27,  2
6040: 38 2c 20 20 32 39 2c 0a 20 20 20 20 20 33 30 2c  8,  29,.     30,
6050: 20 20 33 31 2c 20 20 33 32 2c 20 20 33 33 2c 20    31,  32,  33, 
6060: 20 33 34 2c 20 20 33 35 2c 20 20 33 36 2c 20 20   34,  35,  36,  
6070: 33 37 2c 20 20 33 38 2c 20 20 33 39 2c 20 20 34  37,  38,  39,  4
6080: 30 2c 20 20 34 31 2c 20 20 34 32 2c 20 20 34 33  0,  41,  42,  43
6090: 2c 20 20 34 34 2c 0a 20 20 20 20 20 34 35 2c 20  ,  44,.     45, 
60a0: 20 34 36 2c 20 20 34 37 2c 20 20 34 38 2c 20 20   46,  47,  48,  
60b0: 34 39 2c 20 20 35 30 2c 20 20 35 31 2c 20 20 35  49,  50,  51,  5
60c0: 32 2c 20 20 35 33 2c 20 20 35 34 2c 20 20 35 35  2,  53,  54,  55
60d0: 2c 20 20 35 36 2c 20 20 35 37 2c 20 20 35 38 2c  ,  56,  57,  58,
60e0: 20 20 35 39 2c 0a 20 20 20 20 20 36 30 2c 20 20    59,.     60,  
60f0: 36 31 2c 20 20 36 32 2c 20 20 36 33 2c 20 20 36  61,  62,  63,  6
6100: 34 2c 20 20 36 35 2c 20 20 36 36 2c 20 20 36 37  4,  65,  66,  67
6110: 2c 20 20 36 38 2c 20 20 36 39 2c 20 20 37 30 2c  ,  68,  69,  70,
6120: 20 20 37 31 2c 20 20 37 32 2c 20 20 37 33 2c 20    71,  72,  73, 
6130: 20 37 34 2c 0a 20 20 20 20 20 37 35 2c 20 20 37   74,.     75,  7
6140: 36 2c 20 20 37 37 2c 20 20 37 38 2c 20 20 37 39  6,  77,  78,  79
6150: 2c 20 20 38 30 2c 20 20 38 31 2c 20 20 38 32 2c  ,  80,  81,  82,
6160: 20 20 38 33 2c 20 20 38 34 2c 20 20 38 35 2c 20    83,  84,  85, 
6170: 20 38 36 2c 20 20 38 37 2c 20 20 38 38 2c 20 20   86,  87,  88,  
6180: 38 39 2c 0a 20 20 20 20 20 39 30 2c 20 20 39 31  89,.     90,  91
6190: 2c 20 20 39 32 2c 20 20 39 33 2c 20 20 39 34 2c  ,  92,  93,  94,
61a0: 20 20 39 35 2c 20 20 39 36 2c 20 20 39 37 2c 20    95,  96,  97, 
61b0: 20 39 38 2c 20 20 39 39 2c 20 31 30 30 2c 20 31   98,  99, 100, 1
61c0: 30 31 2c 20 31 30 32 2c 20 31 30 33 2c 20 31 30  01, 102, 103, 10
61d0: 34 2c 0a 20 20 20 20 31 30 35 2c 20 31 30 36 2c  4,.    105, 106,
61e0: 20 31 30 37 2c 20 31 30 38 2c 20 31 30 39 2c 20   107, 108, 109, 
61f0: 31 31 30 2c 20 31 31 31 2c 20 31 31 32 2c 20 31  110, 111, 112, 1
6200: 31 33 2c 20 31 31 34 2c 20 31 31 35 2c 20 31 31  13, 114, 115, 11
6210: 36 2c 20 31 31 37 2c 20 31 31 38 2c 20 31 31 39  6, 117, 118, 119
6220: 2c 0a 20 20 20 20 31 32 30 2c 20 31 32 31 2c 20  ,.    120, 121, 
6230: 31 32 32 2c 20 31 32 33 2c 20 31 32 34 2c 20 31  122, 123, 124, 1
6240: 32 35 2c 20 31 32 36 2c 20 31 32 37 2c 20 31 32  25, 126, 127, 12
6250: 38 2c 20 31 32 39 2c 20 31 33 30 2c 20 31 33 31  8, 129, 130, 131
6260: 2c 20 31 33 32 2c 20 31 33 33 2c 20 31 33 34 2c  , 132, 133, 134,
6270: 0a 20 20 20 20 31 33 35 2c 20 31 33 36 2c 20 31  .    135, 136, 1
6280: 33 37 2c 20 31 33 38 2c 20 31 33 39 2c 20 31 34  37, 138, 139, 14
6290: 30 2c 20 31 34 31 2c 20 31 34 32 2c 20 31 34 33  0, 141, 142, 143
62a0: 2c 20 31 34 34 2c 20 31 34 35 2c 20 31 34 36 2c  , 144, 145, 146,
62b0: 20 31 34 37 2c 20 31 34 38 2c 20 31 34 39 2c 0a   147, 148, 149,.
62c0: 20 20 20 20 31 35 30 2c 20 31 35 31 2c 20 31 35      150, 151, 15
62d0: 32 2c 20 31 35 33 2c 20 31 35 34 2c 20 31 35 35  2, 153, 154, 155
62e0: 2c 20 31 35 36 2c 20 31 35 37 2c 20 31 35 38 2c  , 156, 157, 158,
62f0: 20 31 35 39 2c 20 31 36 30 2c 20 31 36 31 2c 20   159, 160, 161, 
6300: 31 36 32 2c 20 31 36 33 2c 20 31 36 34 2c 0a 20  162, 163, 164,. 
6310: 20 20 20 31 36 35 2c 20 31 36 36 2c 20 31 36 37     165, 166, 167
6320: 2c 20 31 36 38 2c 20 31 36 39 2c 20 31 37 30 2c  , 168, 169, 170,
6330: 20 31 37 31 2c 20 31 37 32 2c 20 31 37 33 2c 20   171, 172, 173, 
6340: 31 37 34 2c 20 31 37 35 2c 20 31 37 36 2c 20 31  174, 175, 176, 1
6350: 37 37 2c 20 31 37 38 2c 20 31 37 39 2c 0a 20 20  77, 178, 179,.  
6360: 20 20 31 38 30 2c 20 31 38 31 2c 20 31 38 32 2c    180, 181, 182,
6370: 20 31 38 33 2c 20 31 38 34 2c 20 31 38 35 2c 20   183, 184, 185, 
6380: 31 38 36 2c 20 31 38 37 2c 20 31 38 38 2c 20 31  186, 187, 188, 1
6390: 38 39 2c 20 31 39 30 2c 20 31 39 31 2c 20 20 20  89, 190, 191,   
63a0: 30 2c 20 20 20 31 2c 20 20 20 32 2c 0a 20 20 20  0,   1,   2,.   
63b0: 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20     3,   4,   5, 
63c0: 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20 20    6,   7,   8,  
63d0: 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20 31   9,  10,  11,  1
63e0: 32 2c 20 20 31 33 2c 20 20 31 34 2c 20 20 31 35  2,  13,  14,  15
63f0: 2c 20 20 31 36 2c 20 20 31 37 2c 0a 20 20 20 20  ,  16,  17,.    
6400: 20 31 38 2c 20 20 31 39 2c 20 20 32 30 2c 20 20   18,  19,  20,  
6410: 32 31 2c 20 20 32 32 2c 20 20 32 33 2c 20 20 32  21,  22,  23,  2
6420: 34 2c 20 20 32 35 2c 20 20 32 36 2c 20 20 32 37  4,  25,  26,  27
6430: 2c 20 20 32 38 2c 20 20 32 39 2c 20 20 33 30 2c  ,  28,  29,  30,
6440: 20 20 33 31 2c 20 20 20 30 2c 0a 20 20 20 20 20    31,   0,.     
6450: 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20 20   1,   2,   3,   
6460: 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37  4,   5,   6,   7
6470: 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30 2c  ,   8,   9,  10,
6480: 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c 20    11,  12,  13, 
6490: 20 31 34 2c 20 20 31 35 2c 0a 20 20 20 20 20 20   14,  15,.      
64a0: 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33  0,   1,   2,   3
64b0: 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c  ,   4,   5,   6,
64c0: 20 20 20 37 2c 20 20 20 30 2c 20 20 20 31 2c 20     7,   0,   1, 
64d0: 20 20 32 2c 20 20 20 33 2c 20 20 20 30 2c 20 20    2,   3,   0,  
64e0: 20 31 2c 20 32 35 34 2c 0a 20 20 20 20 32 35 35   1, 254,.    255
64f0: 2c 0a 20 20 7d 3b 0a 20 20 63 20 3d 20 69 6e 69  ,.  };.  c = ini
6500: 74 56 61 6c 5b 2a 28 7a 2b 2b 29 5d 3b 0a 20 20  tVal[*(z++)];.  
6510: 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a 7a 29  while( (0xc0&*z)
6520: 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 63 20  ==0x80 ){.    c 
6530: 3d 20 28 63 3c 3c 36 29 20 7c 20 28 30 78 33 66  = (c<<6) | (0x3f
6540: 26 2a 28 7a 2b 2b 29 29 3b 0a 20 20 7d 0a 20 20  &*(z++));.  }.  
6550: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 23 65 6e 64  return c;.}.#end
6560: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  if../*.** Compar
6570: 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69  e two UTF-8 stri
6580: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79  ngs for equality
6590: 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
65a0: 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70   string can.** p
65b0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20  otentially be a 
65c0: 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f  "glob" expressio
65d0: 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  n.  Return true 
65e0: 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61  (1) if they.** a
65f0: 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  re the same and 
6600: 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68 65  false (0) if the
6610: 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  y are different.
6620: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
6630: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
6640: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
6650: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
6660: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
6670: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
6680: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
6690: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
66a0: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
66b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
66c0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
66d0: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
66e0: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
66f0: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
6700: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
6710: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
6720: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
6730: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
6740: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
6750: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57  ed list..**.** W
6760: 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e  ith the [...] an
6770: 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e  d [^...] matchin
6780: 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63 74  g, a ']' charact
6790: 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64  er can be includ
67a0: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ed.** in the lis
67b0: 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74  t by making it t
67c0: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
67d0: 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20  er after '[' or 
67e0: 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65  '^'.  A.** range
67f0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63   of characters c
6800: 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64 20  an be specified 
6810: 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d  using '-'.  Exam
6820: 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20  ple:.** "[a-z]" 
6830: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67  matches any sing
6840: 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65  le lower-case le
6850: 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20  tter.  To match 
6860: 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69  a '-', make.** i
6870: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
6880: 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  cter in the list
6890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
68a0: 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20  tine is usually 
68b0: 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62  quick, but can b
68c0: 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f  e N**2 in the wo
68d0: 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  rst case..**.** 
68e0: 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20  Hints: to match 
68f0: 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20  '*' or '?', put 
6900: 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c  them in "[]".  L
6910: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
6920: 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79          abc[*]xy
6930: 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  z        Matches
6940: 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a   "abc*xyz" only.
6950: 2a 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 47 6c  */.int .sqliteGl
6960: 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
6970: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6980: 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75  Pattern, const u
6990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
69a0: 74 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74  tring){.  regist
69b0: 65 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  er int c;.  int 
69c0: 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65  invert;.  int se
69d0: 65 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20  en;.  int c2;.. 
69e0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a 50   while( (c = *zP
69f0: 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20 20  attern)!=0 ){.  
6a00: 20 20 73 77 69 74 63 68 28 20 63 20 29 7b 0a 20    switch( c ){. 
6a10: 20 20 20 20 20 63 61 73 65 20 27 2a 27 3a 0a 20       case '*':. 
6a20: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
6a30: 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d  =zPattern[1]) ==
6a40: 20 27 2a 27 20 7c 7c 20 63 20 3d 3d 20 27 3f 27   '*' || c == '?'
6a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6a60: 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
6a70: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
6a80: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
6a90: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6aa0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
6ab0: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
6ac0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
6ad0: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20  Pattern++;.     
6ae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6af0: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   c==0 ) return 1
6b00: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 55 70  ;.        c = Up
6b10: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
6b20: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5b         if( c=='[
6b30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  ' ){.          w
6b40: 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26  hile( *zString &
6b50: 26 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70  & sqliteGlobComp
6b60: 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d  are(&zPattern[1]
6b70: 2c 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  ,zString)==0 ){.
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6b90: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
6ba0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ng);.          }
6bb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6bc0: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
6bd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6be0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
6bf0: 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d  c2 = *zString)!=
6c00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6c10: 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20   while( c2 != 0 
6c20: 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32  && c2 != c ){ c2
6c30: 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d   = *++zString; }
6c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6c50: 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
6c60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
6c70: 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d  f( sqliteGlobCom
6c80: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
6c90: 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65 74  ],zString) ) ret
6ca0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
6cb0: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
6cc0: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
6cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ce0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
6d00: 20 27 3f 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '?': {.        
6d10: 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  if( *zString==0 
6d20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6d30: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
6d40: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6d50: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
6d60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6d80: 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20 20  se '[': {.      
6d90: 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
6da0: 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 20  0;.        seen 
6db0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 76  = 0;.        inv
6dc0: 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ert = 0;.       
6dd0: 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56   c = sqliteCharV
6de0: 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  al(zString);.   
6df0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
6e00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6e10: 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65    c2 = *++zPatte
6e20: 72 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rn;.        if( 
6e30: 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65 72  c2=='^' ){ inver
6e40: 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b 7a  t = 1; c2 = *++z
6e50: 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20 20  Pattern; }.     
6e60: 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
6e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6e80: 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20  c==']' ) seen = 
6e90: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  1;.          c2 
6ea0: 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20  = *++zPattern;. 
6eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6ec0: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71   while( (c2 = sq
6ed0: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
6ee0: 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32 21  tern))!=0 && c2!
6ef0: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
6f00: 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26    if( c2=='-' &&
6f10: 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d   zPattern[1]!=']
6f20: 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d  ' && zPattern[1]
6f30: 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
6f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f50: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
6f60: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
6f70: 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74 74  iteCharVal(zPatt
6f80: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
6f90: 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63    if( c>=prior_c
6fa0: 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e   && c<=c2 ) seen
6fb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6fc0: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
6fd0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
6fe0: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
6ff0: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
7000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
7010: 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
7020: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7030: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
7040: 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 20   = c2;.         
7050: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
7060: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61 74  iteNextChar(zPat
7070: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tern);.        }
7080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
7090: 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
70a0: 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
70b0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 0;.        sql
70c0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
70d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ing);.        zP
70e0: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
70f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7100: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7110: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
7120: 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65  != *zString ) re
7130: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
7140: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
7150: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
7160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7180: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
7190: 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  g==0;.}../*.** C
71a0: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
71b0: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
71c0: 61 6c 69 74 79 20 75 73 69 6e 67 20 74 68 65 20  ality using the 
71d0: 22 4c 49 4b 45 22 20 6f 70 65 72 61 74 6f 72 20  "LIKE" operator 
71e0: 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20 54 68 65 20  of.** SQL.  The 
71f0: 27 25 27 20 63 68 61 72 61 63 74 65 72 20 6d 61  '%' character ma
7200: 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
7210: 63 65 20 6f 66 20 30 20 6f 72 20 6d 6f 72 65 0a  ce of 0 or more.
7220: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 6e  ** characters an
7230: 64 20 27 5f 27 20 6d 61 74 63 68 65 73 20 61 6e  d '_' matches an
7240: 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  y single charact
7250: 65 72 2e 20 20 43 61 73 65 20 69 73 0a 2a 2a 20  er.  Case is.** 
7260: 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74 2e  not significant.
7270: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7280: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 6e 20 61  ine is just an a
7290: 64 61 70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  daptation of the
72a0: 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61   sqliteGlobCompa
72b0: 72 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  re().** routine 
72c0: 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20 0a 73  above..*/.int .s
72d0: 71 6c 69 74 65 4c 69 6b 65 43 6f 6d 70 61 72 65  qliteLikeCompare
72e0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
72f0: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20  char *zPattern, 
7300: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7310: 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20  har *zString){. 
7320: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b   register int c;
7330: 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77 68  .  int c2;..  wh
7340: 69 6c 65 28 20 28 63 20 3d 20 55 70 70 65 72 54  ile( (c = UpperT
7350: 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74 74 65 72 6e  oLower[*zPattern
7360: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77 69  ])!=0 ){.    swi
7370: 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20  tch( c ){.      
7380: 63 61 73 65 20 27 25 27 3a 20 7b 0a 20 20 20 20  case '%': {.    
7390: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 50      while( (c=zP
73a0: 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27 25  attern[1]) == '%
73b0: 27 20 7c 7c 20 63 20 3d 3d 20 27 5f 27 20 29 7b  ' || c == '_' ){
73c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
73d0: 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='_' ){.       
73e0: 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e       if( *zStrin
73f0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
7400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
7410: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
7420: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
7430: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61 74  }.          zPat
7440: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tern++;.        
7450: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
7460: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7470: 20 20 20 20 20 20 20 63 20 3d 20 55 70 70 65 72         c = Upper
7480: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
7490: 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 3d 55      while( (c2=U
74a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53 74  pperToLower[*zSt
74b0: 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ring])!=0 ){.   
74c0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
74d0: 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63   != 0 && c2 != c
74e0: 20 29 7b 20 63 32 20 3d 20 55 70 70 65 72 54 6f   ){ c2 = UpperTo
74f0: 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72 69 6e 67  Lower[*++zString
7500: 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69  ]; }.          i
7510: 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72  f( c2==0 ) retur
7520: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n 0;.          i
7530: 66 28 20 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d  f( sqliteLikeCom
7540: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
7550: 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65 74  ],zString) ) ret
7560: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
7570: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
7580: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
7590: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
75a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
75b0: 20 20 20 20 63 61 73 65 20 27 5f 27 3a 20 7b 0a      case '_': {.
75c0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
75d0: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
75e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
75f0: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
7600: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 61  ng);.        zPa
7610: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
7640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21  .        if( c !
7650: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  = UpperToLower[*
7660: 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72  zString] ) retur
7670: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 50 61  n 0;.        zPa
7680: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
7690: 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20   zString++;.    
76a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
76b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
76c0: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
76d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
76e0: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
76f0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
7700: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
7710: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
7720: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
7730: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
7740: 2a 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74  *sqlite_error_st
7750: 72 69 6e 67 28 69 6e 74 20 72 63 29 7b 0a 20 20  ring(int rc){.  
7760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
7770: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
7780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
7790: 4b 3a 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22  K:         z = "
77a0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 3b 20 20  not an error";  
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
77d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
77e0: 52 52 4f 52 3a 20 20 20 20 20 20 7a 20 3d 20 22  RROR:      z = "
77f0: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20  SQL logic error 
7800: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62  or missing datab
7810: 61 73 65 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ase";   break;. 
7820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
7830: 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 20 3d 20 22  NTERNAL:   z = "
7840: 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 20  internal SQLite 
7850: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66  implementation f
7860: 6c 61 77 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  law";   break;. 
7870: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
7880: 45 52 4d 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ERM:       z = "
7890: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
78a0: 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20 20  n denied";      
78b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
78c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
78d0: 42 4f 52 54 3a 20 20 20 20 20 20 7a 20 3d 20 22  BORT:      z = "
78e0: 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74  callback request
78f0: 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 3b  ed query abort";
7900: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7910: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
7920: 55 53 59 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  USY:       z = "
7930: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
7940: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
7950: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
7970: 4f 43 4b 45 44 3a 20 20 20 20 20 7a 20 3d 20 22  OCKED:     z = "
7980: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
7990: 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20  s locked";      
79a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
79b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
79c0: 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 20 3d 20 22  OMEM:      z = "
79d0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 3b 20  out of memory"; 
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7a00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
7a10: 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20 22  EADONLY:   z = "
7a20: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
7a30: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
7a40: 62 61 73 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20  base";  break;. 
7a50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
7a60: 4e 54 45 52 52 55 50 54 3a 20 20 7a 20 3d 20 22  NTERRUPT:  z = "
7a70: 69 6e 74 65 72 72 75 70 74 65 64 22 3b 20 20 20  interrupted";   
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7aa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
7ab0: 4f 45 52 52 3a 20 20 20 20 20 20 7a 20 3d 20 22  OERR:      z = "
7ac0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 3b  disk I/O error";
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7af0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7b00: 4f 52 52 55 50 54 3a 20 20 20 20 7a 20 3d 20 22  ORRUPT:    z = "
7b10: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
7b20: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
7b30: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
7b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
7b50: 4f 54 46 4f 55 4e 44 3a 20 20 20 7a 20 3d 20 22  OTFOUND:   z = "
7b60: 74 61 62 6c 65 20 6f 72 20 72 65 63 6f 72 64 20  table or record 
7b70: 6e 6f 74 20 66 6f 75 6e 64 22 3b 20 20 20 20 20  not found";     
7b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7ba0: 55 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ULL:       z = "
7bb0: 64 61 74 61 62 61 73 65 20 69 73 20 66 75 6c 6c  database is full
7bc0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
7bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7be0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7bf0: 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 20 3d 20 22  ANTOPEN:   z = "
7c00: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
7c10: 61 74 61 62 61 73 65 20 66 69 6c 65 22 3b 20 20  atabase file";  
7c20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7c30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
7c40: 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a 20 3d 20 22  ROTOCOL:   z = "
7c50: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 69 6e 67  database locking
7c60: 20 70 72 6f 74 6f 63 6f 6c 20 66 61 69 6c 75 72   protocol failur
7c70: 65 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  e";     break;. 
7c80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
7c90: 4d 50 54 59 3a 20 20 20 20 20 20 7a 20 3d 20 22  MPTY:      z = "
7ca0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e  table contains n
7cb0: 6f 20 64 61 74 61 22 3b 20 20 20 20 20 20 20 20  o data";        
7cc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7cd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
7ce0: 43 48 45 4d 41 3a 20 20 20 20 20 7a 20 3d 20 22  CHEMA:     z = "
7cf0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
7d00: 68 61 73 20 63 68 61 6e 67 65 64 22 3b 20 20 20  has changed";   
7d10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7d20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
7d30: 4f 4f 42 49 47 3a 20 20 20 20 20 7a 20 3d 20 22  OOBIG:     z = "
7d40: 74 6f 6f 20 6d 75 63 68 20 64 61 74 61 20 66 6f  too much data fo
7d50: 72 20 6f 6e 65 20 74 61 62 6c 65 20 72 6f 77 22  r one table row"
7d60: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7d70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7d80: 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 20 3d 20 22  ONSTRAINT: z = "
7d90: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7da0: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
7db0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7dc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
7dd0: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
7de0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 20  unknown error"; 
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
7e20: 0a                                               .