/ Hex Artifact Content
Login

Artifact 1c01f0a54a77ae9fb638d026d18093ee1b61e3b3:


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: 39 20 32 30 30 32 2f 30 32 2f 32 38 20 30 30 3a  9 2002/02/28 00:
0230: 34 31 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a  41:11 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 3b 0a 20  .  char *zNew;. 
12a0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
12b0: 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73  rn 0;.  zNew = s
12c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f 28 73 74 72  qliteMalloc_(str
12d0: 6c 65 6e 28 7a 29 2b 31 2c 20 7a 46 69 6c 65 2c  len(z)+1, zFile,
12e0: 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a 4e   line);.  if( zN
12f0: 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65 77  ew ) strcpy(zNew
1300: 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  , z);.  return z
1310: 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c  New;.}.char *sql
1320: 69 74 65 53 74 72 4e 44 75 70 5f 28 63 6f 6e 73  iteStrNDup_(cons
1330: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1340: 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  , char *zFile, i
1350: 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72  nt line){.  char
1360: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
1370: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1380: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   zNew = sqliteMa
1390: 6c 6c 6f 63 5f 28 6e 2b 31 2c 20 7a 46 69 6c 65  lloc_(n+1, zFile
13a0: 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a  , line);.  if( z
13b0: 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  New ){.    memcp
13c0: 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20  y(zNew, z, n);. 
13d0: 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a     zNew[n] = 0;.
13e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65    }.  return zNe
13f0: 77 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d  w;.}.#endif /* M
1400: 45 4d 4f 52 59 5f 44 45 42 55 47 20 2a 2f 0a 0a  EMORY_DEBUG */..
1410: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1420: 69 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ing versions of 
1430: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 66 72 65  malloc() and fre
1440: 65 28 29 20 61 72 65 20 66 6f 72 20 75 73 65 20  e() are for use 
1450: 69 6e 20 61 0a 2a 2a 20 6e 6f 72 6d 61 6c 20 62  in a.** normal b
1460: 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  uild..*/.#if !de
1470: 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42  fined(MEMORY_DEB
1480: 55 47 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  UG)../*.** Alloc
1490: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61  ate new memory a
14a0: 6e 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72  nd set it to zer
14b0: 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  o.  Return NULL 
14c0: 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20  if.** no memory 
14d0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  is available..*/
14e0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c  .void *sqliteMal
14f0: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  loc(int n){.  vo
1500: 69 64 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 6e  id *p = malloc(n
1510: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
1520: 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  .    sqlite_mall
1530: 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 20  oc_failed++;.   
1540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1550: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e 29   memset(p, 0, n)
1560: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1570: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
1580: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62  ry previously ob
1590: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
15a0: 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 76 6f  teMalloc().*/.vo
15b0: 69 64 20 73 71 6c 69 74 65 46 72 65 65 28 76 6f  id sqliteFree(vo
15c0: 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  id *p){.  if( p 
15d0: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 29 3b 0a  ){.    free(p);.
15e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
15f0: 69 7a 65 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f  ize a prior allo
1600: 63 61 74 69 6f 6e 2e 20 20 49 66 20 70 3d 3d 30  cation.  If p==0
1610: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1620: 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73  ine.** works jus
1630: 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 4d 61 6c  t like sqliteMal
1640: 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d 3d 30 2c  loc().  If n==0,
1650: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1660: 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74  ne.** works just
1670: 20 6c 69 6b 65 20 73 71 6c 69 74 65 46 72 65 65   like sqliteFree
1680: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ()..*/.void *sql
1690: 69 74 65 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  iteRealloc(void 
16a0: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  *p, int n){.  vo
16b0: 69 64 20 2a 70 32 3b 0a 20 20 69 66 28 20 70 3d  id *p2;.  if( p=
16c0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
16d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 29   sqliteMalloc(n)
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30  ;.  }.  if( n==0
16f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1700: 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1710: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 32 20 3d 20  n 0;.  }.  p2 = 
1720: 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20  realloc(p, n);. 
1730: 20 69 66 28 20 70 32 3d 3d 30 20 29 7b 0a 20 20   if( p2==0 ){.  
1740: 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f    sqlite_malloc_
1750: 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 0a 20 20  failed++;.  }.  
1760: 72 65 74 75 72 6e 20 70 32 3b 0a 7d 0a 0a 2f 2a  return p2;.}../*
1770: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
1780: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
1790: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
17a0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
17b0: 28 29 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  ().*/.char *sqli
17c0: 74 65 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63  teStrDup(const c
17d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
17e0: 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61  *zNew = sqliteMa
17f0: 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 29 2b 31  lloc(strlen(z)+1
1800: 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20  );.  if( zNew ) 
1810: 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b  strcpy(zNew, z);
1820: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a  .  return zNew;.
1830: 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 53 74  }.char *sqliteSt
1840: 72 4e 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72  rNDup(const char
1850: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63   *z, int n){.  c
1860: 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69  har *zNew = sqli
1870: 74 65 4d 61 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20  teMalloc(n+1);. 
1880: 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20   if( zNew ){.   
1890: 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c   memcpy(zNew, z,
18a0: 20 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d   n);.    zNew[n]
18b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
18c0: 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69  rn zNew;.}.#endi
18d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4d 45  f /* !defined(ME
18e0: 4d 4f 52 59 5f 44 45 42 55 47 29 20 2a 2f 0a 0a  MORY_DEBUG) */..
18f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 73  /*.** Create a s
1900: 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 32  tring from the 2
1910: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1920: 74 20 61 72 67 75 6d 65 6e 74 73 20 28 75 70 20  t arguments (up 
1930: 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  to the.** first 
1940: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29 2c 20  NULL argument), 
1950: 73 74 6f 72 65 20 74 68 65 20 73 74 72 69 6e 67  store the string
1960: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
1970: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1980: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
1990: 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ake the pointer 
19a0: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
19b0: 20 31 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   1st argument.**
19c0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
19d0: 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tring..*/.void s
19e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 63  qliteSetString(c
19f0: 68 61 72 20 2a 2a 70 7a 2c 20 63 6f 6e 73 74 20  har **pz, const 
1a00: 63 68 61 72 20 2a 7a 46 69 72 73 74 2c 20 2e 2e  char *zFirst, ..
1a10: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1a20: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
1a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1a40: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
1a50: 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20  ..  if( pz==0 ) 
1a60: 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20  return;.  nByte 
1a70: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 72 73 74 29  = strlen(zFirst)
1a80: 20 2b 20 31 3b 0a 20 20 76 61 5f 73 74 61 72 74   + 1;.  va_start
1a90: 28 61 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20  (ap, zFirst);.  
1aa0: 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61  while( (z = va_a
1ab0: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
1ac0: 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  r*))!=0 ){.    n
1ad0: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 7a  Byte += strlen(z
1ae0: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  );.  }.  va_end(
1af0: 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ap);.  sqliteFre
1b00: 65 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20  e(*pz);.  *pz = 
1b10: 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  zResult = sqlite
1b20: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
1b30: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d  .  if( zResult==
1b40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
1b50: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 7a 52  .  }.  strcpy(zR
1b60: 65 73 75 6c 74 2c 20 7a 46 69 72 73 74 29 3b 0a  esult, zFirst);.
1b70: 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74 72    zResult += str
1b80: 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20  len(zResult);.  
1b90: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 69  va_start(ap, zFi
1ba0: 72 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  rst);.  while( (
1bb0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
1bc0: 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20  onst char*))!=0 
1bd0: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52  ){.    strcpy(zR
1be0: 65 73 75 6c 74 2c 20 7a 29 3b 0a 20 20 20 20 7a  esult, z);.    z
1bf0: 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c 65 6e  Result += strlen
1c00: 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20  (zResult);.  }. 
1c10: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 69 66   va_end(ap);.#if
1c20: 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47  def MEMORY_DEBUG
1c30: 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  .#if MEMORY_DEBU
1c40: 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74  G>1.  fprintf(st
1c50: 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61 74 20  derr,"string at 
1c60: 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c 20 28  0x%x is %s\n", (
1c70: 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a 23  int)*pz, *pz);.#
1c80: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d 0a 0a  endif.#endif.}..
1c90: 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65  /*.** Works like
1ca0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1cb0: 2c 20 62 75 74 20 65 61 63 68 20 73 74 72 69 6e  , but each strin
1cc0: 67 20 69 73 20 6e 6f 77 20 66 6f 6c 6c 6f 77 65  g is now followe
1cd0: 64 20 62 79 0a 2a 2a 20 61 20 6c 65 6e 67 74 68  d by.** a length
1ce0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 73   integer which s
1cf0: 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 75 63  pecifies how muc
1d00: 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  h of the source 
1d10: 73 74 72 69 6e 67 20 0a 2a 2a 20 74 6f 20 63 6f  string .** to co
1d20: 70 79 20 28 69 6e 20 62 79 74 65 73 29 2e 20 20  py (in bytes).  
1d30: 2d 31 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65  -1 means use the
1d40: 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 2e 0a 2a   whole string..*
1d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 74  /.void sqliteSet
1d60: 4e 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a 70  NString(char **p
1d70: 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  z, ...){.  va_li
1d80: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79  st ap;.  int nBy
1d90: 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
1da0: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65   *z;.  char *zRe
1db0: 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  sult;.  int n;..
1dc0: 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20 72 65    if( pz==0 ) re
1dd0: 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20 3d 20  turn;.  nByte = 
1de0: 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  0;.  va_start(ap
1df0: 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20  , pz);.  while( 
1e00: 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  (z = va_arg(ap, 
1e10: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30  const char*))!=0
1e20: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61 5f 61   ){.    n = va_a
1e30: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1e40: 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20   if( n<=0 ) n = 
1e50: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 6e  strlen(z);.    n
1e60: 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20  Byte += n;.  }. 
1e70: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
1e80: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a  qliteFree(*pz);.
1e90: 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20    *pz = zResult 
1ea0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1eb0: 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a 20 20 69  nByte + 1 );.  i
1ec0: 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( zResult==0 ) 
1ed0: 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61  return;.  va_sta
1ee0: 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68  rt(ap, pz);.  wh
1ef0: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
1f00: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1f10: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ))!=0 ){.    n =
1f20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1f30: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
1f40: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
1f50: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 73      strncpy(zRes
1f60: 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ult, z, n);.    
1f70: 7a 52 65 73 75 6c 74 20 2b 3d 20 6e 3b 0a 20 20  zResult += n;.  
1f80: 7d 0a 20 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  }.  *zResult = 0
1f90: 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f  ;.#ifdef MEMORY_
1fa0: 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f 52 59  DEBUG.#if MEMORY
1fb0: 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69 6e  _DEBUG>1.  fprin
1fc0: 74 66 28 73 74 64 65 72 72 2c 22 73 74 72 69 6e  tf(stderr,"strin
1fd0: 67 20 61 74 20 30 78 25 78 20 69 73 20 25 73 5c  g at 0x%x is %s\
1fe0: 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20 2a 70  n", (int)*pz, *p
1ff0: 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  z);.#endif.#endi
2000: 66 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  f.  va_end(ap);.
2010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
2020: 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75   an SQL-style qu
2030: 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f  oted string into
2040: 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67   a normal string
2050: 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20   by removing.** 
2060: 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61 63  the quote charac
2070: 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65  ters.  The conve
2080: 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e  rsion is done in
2090: 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a  -place.  If the.
20a0: 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f  ** input does no
20b0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 71  t begin with a q
20c0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c 20  uote character, 
20d0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
20e0: 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
20f0: 0a 2a 2a 0a 2a 2a 20 32 30 30 32 2d 46 65 62 2d  .**.** 2002-Feb-
2100: 31 34 3a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  14: This routine
2110: 20 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20   is extended to 
2120: 72 65 6d 6f 76 65 20 4d 53 2d 41 63 63 65 73 73  remove MS-Access
2130: 20 73 74 79 6c 65 0a 2a 2a 20 62 72 61 63 6b 65   style.** bracke
2140: 74 73 20 66 72 6f 6d 20 61 72 6f 75 6e 64 20 69  ts from around i
2150: 64 65 6e 74 69 66 65 72 73 2e 20 20 46 6f 72 20  dentifers.  For 
2160: 65 78 61 6d 70 6c 65 3a 20 20 22 5b 61 2d 62 2d  example:  "[a-b-
2170: 63 5d 22 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 22  c]" becomes.** "
2180: 61 2d 62 2d 63 22 2e 0a 2a 2f 0a 76 6f 69 64 20  a-b-c"..*/.void 
2190: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 63 68  sqliteDequote(ch
21a0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 71 75  ar *z){.  int qu
21b0: 6f 74 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ote;.  int i, j;
21c0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
21d0: 74 75 72 6e 3b 0a 20 20 71 75 6f 74 65 20 3d 20  turn;.  quote = 
21e0: 7a 5b 30 5d 3b 0a 20 20 73 77 69 74 63 68 28 20  z[0];.  switch( 
21f0: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 61 73  quote ){.    cas
2200: 65 20 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0a  e '\'':  break;.
2210: 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 20 20      case '"':   
2220: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2230: 27 5b 27 3a 20 20 20 71 75 6f 74 65 20 3d 20 27  '[':   quote = '
2240: 5d 27 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]';  break;.    
2250: 64 65 66 61 75 6c 74 3a 20 20 20 20 72 65 74 75  default:    retu
2260: 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
2270: 31 2c 20 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  1, j=0; z[i]; i+
2280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
2290: 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20  ==quote ){.     
22a0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f   if( z[i+1]==quo
22b0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b  te ){.        z[
22c0: 6a 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20  j++] = quote;.  
22d0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
22e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22f0: 7a 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  z[j++] = 0;.    
2300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2310: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2320: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
2330: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ];.    }.  }.}..
2340: 2f 2a 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d  /* An array to m
2350: 61 70 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73  ap all upper-cas
2360: 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74  e characters int
2370: 6f 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  o their correspo
2380: 6e 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63  nding.** lower-c
2390: 61 73 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a  ase character. .
23a0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
23b0: 65 64 20 63 68 61 72 20 55 70 70 65 72 54 6f 4c  ed char UpperToL
23c0: 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ower[] = {.     
23d0: 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
23e0: 20 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20   4,  5,  6,  7, 
23f0: 20 38 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20   8,  9, 10, 11, 
2400: 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20  12, 13, 14, 15, 
2410: 31 36 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c  16, 17,.     18,
2420: 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c   19, 20, 21, 22,
2430: 20 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c   23, 24, 25, 26,
2440: 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c   27, 28, 29, 30,
2450: 20 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c   31, 32, 33, 34,
2460: 20 33 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37   35,.     36, 37
2470: 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31  , 38, 39, 40, 41
2480: 2c 20 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35  , 42, 43, 44, 45
2490: 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39  , 46, 47, 48, 49
24a0: 2c 20 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33  , 50, 51, 52, 53
24b0: 2c 0a 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35  ,.     54, 55, 5
24c0: 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36  6, 57, 58, 59, 6
24d0: 30 2c 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36  0, 61, 62, 63, 6
24e0: 34 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30  4, 97, 98, 99,10
24f0: 30 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20  0,101,102,103,. 
2500: 20 20 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31     104,105,106,1
2510: 30 37 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31  07,108,109,110,1
2520: 31 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31  11,112,113,114,1
2530: 31 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31  15,116,117,118,1
2540: 31 39 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20  19,120,121,.    
2550: 31 32 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c  122, 91, 92, 93,
2560: 20 39 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c   94, 95, 96, 97,
2570: 20 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c   98, 99,100,101,
2580: 31 30 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c  102,103,104,105,
2590: 31 30 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38  106,107,.    108
25a0: 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32  ,109,110,111,112
25b0: 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36  ,113,114,115,116
25c0: 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30  ,117,118,119,120
25d0: 2c 31 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34  ,121,122,123,124
25e0: 2c 31 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32  ,125,.    126,12
25f0: 37 2c 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33  7,128,129,130,13
2600: 31 2c 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33  1,132,133,134,13
2610: 35 2c 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33  5,136,137,138,13
2620: 39 2c 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34  9,140,141,142,14
2630: 33 2c 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31  3,.    144,145,1
2640: 34 36 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31  46,147,148,149,1
2650: 35 30 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31  50,151,152,153,1
2660: 35 34 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31  54,155,156,157,1
2670: 35 38 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a  58,159,160,161,.
2680: 20 20 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c      162,163,164,
2690: 31 36 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c  165,166,167,168,
26a0: 31 36 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c  169,170,171,172,
26b0: 31 37 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c  173,174,175,176,
26c0: 31 37 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20  177,178,179,.   
26d0: 20 31 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33   180,181,182,183
26e0: 2c 31 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37  ,184,185,186,187
26f0: 2c 31 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31  ,188,189,190,191
2700: 2c 31 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35  ,192,193,194,195
2710: 2c 31 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39  ,196,197,.    19
2720: 38 2c 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30  8,199,200,201,20
2730: 32 2c 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30  2,203,204,205,20
2740: 36 2c 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31  6,207,208,209,21
2750: 30 2c 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31  0,211,212,213,21
2760: 34 2c 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32  4,215,.    216,2
2770: 31 37 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32  17,218,219,220,2
2780: 32 31 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32  21,222,223,224,2
2790: 32 35 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32  25,226,227,228,2
27a0: 32 39 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32  29,230,231,232,2
27b0: 33 33 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c  33,.    234,235,
27c0: 32 33 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c  236,237,238,239,
27d0: 32 34 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c  240,241,242,243,
27e0: 32 34 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c  244,245,246,247,
27f0: 32 34 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c  248,249,250,251,
2800: 0a 20 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34  .    252,253,254
2810: 2c 32 35 35 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ,255.};../*.** T
2820: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
2830: 70 75 74 65 73 20 61 20 68 61 73 68 20 6f 6e 20  putes a hash on 
2840: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6b 65  the name of a ke
2850: 79 77 6f 72 64 2e 0a 2a 2a 20 43 61 73 65 20 69  yword..** Case i
2860: 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e  s not significan
2870: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2880: 48 61 73 68 4e 6f 43 61 73 65 28 63 6f 6e 73 74  HashNoCase(const
2890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
28a0: 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
28b0: 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20   if( n<=0 ) n = 
28c0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69  strlen(z);.  whi
28d0: 6c 65 28 20 6e 20 3e 20 30 20 20 29 7b 0a 20 20  le( n > 0  ){.  
28e0: 20 20 68 20 3d 20 28 68 3c 3c 33 29 20 5e 20 68    h = (h<<3) ^ h
28f0: 20 5e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b   ^ UpperToLower[
2900: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 2a  (unsigned char)*
2910: 7a 2b 2b 5d 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  z++];.    n--;. 
2920: 20 7d 0a 20 20 69 66 28 20 68 3c 30 20 29 20 68   }.  if( h<0 ) h
2930: 20 3d 20 2d 68 3b 0a 20 20 72 65 74 75 72 6e 20   = -h;.  return 
2940: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  h;.}../*.** Some
2950: 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 73 74   systems have st
2960: 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 65 72 73  ricmp().  Others
2970: 20 68 61 76 65 20 73 74 72 63 61 73 65 63 6d 70   have strcasecmp
2980: 28 29 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a 20  ().  Because.** 
2990: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73  there is no cons
29a0: 69 73 74 65 6e 63 79 2c 20 77 65 20 77 69 6c 6c  istency, we will
29b0: 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 2e   define our own.
29c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 74  .*/.int sqliteSt
29d0: 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  rICmp(const char
29e0: 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63   *zLeft, const c
29f0: 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20  har *zRight){.  
2a00: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
2a10: 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20  d char *a, *b;. 
2a20: 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63   a = (unsigned c
2a30: 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62  har *)zLeft;.  b
2a40: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2a50: 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68  r *)zRight;.  wh
2a60: 69 6c 65 28 20 2a 61 21 3d 30 20 26 26 20 55 70  ile( *a!=0 && Up
2a70: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d  perToLower[*a]==
2a80: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
2a90: 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20  ){ a++; b++; }. 
2aa0: 20 72 65 74 75 72 6e 20 2a 61 20 2d 20 2a 62 3b   return *a - *b;
2ab0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 53 74 72  .}.int sqliteStr
2ac0: 4e 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  NICmp(const char
2ad0: 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63   *zLeft, const c
2ae0: 68 61 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e 74  har *zRight, int
2af0: 20 4e 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20   N){.  register 
2b00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2b10: 2c 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73  , *b;.  a = (uns
2b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65  igned char *)zLe
2b30: 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67  ft;.  b = (unsig
2b40: 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68  ned char *)zRigh
2b50: 74 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  t;.  while( N-- 
2b60: 3e 20 30 20 26 26 20 2a 61 21 3d 30 20 26 26 20  > 0 && *a!=0 && 
2b70: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d  UpperToLower[*a]
2b80: 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  ==UpperToLower[*
2b90: 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d  b]){ a++; b++; }
2ba0: 0a 20 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20  .  return N<0 ? 
2bb0: 30 20 3a 20 2a 61 20 2d 20 2a 62 3b 0a 7d 0a 0a  0 : *a - *b;.}..
2bc0: 2f 2a 20 0a 2a 2a 20 54 68 65 20 73 6f 72 74 53  /* .** The sortS
2bd0: 74 72 43 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  trCmp() function
2be0: 20 62 65 6c 6f 77 20 69 73 20 75 73 65 64 20 74   below is used t
2bf0: 6f 20 6f 72 64 65 72 20 65 6c 65 6d 65 6e 74 73  o order elements
2c00: 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f   according.** to
2c10: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2c20: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2c30: 2e 20 20 54 68 65 20 73 6f 72 74 20 6f 72 64 65  .  The sort orde
2c40: 72 20 69 73 20 61 20 6c 69 74 74 6c 65 20 64 69  r is a little di
2c50: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
2c60: 77 68 61 74 20 6f 6e 65 20 6d 69 67 68 74 20 65  what one might e
2c70: 78 70 65 63 74 2e 20 20 54 68 69 73 20 6e 6f 74  xpect.  This not
2c80: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
2c90: 73 63 72 69 62 65 20 77 68 61 74 20 69 73 0a 2a  scribe what is.*
2ca0: 2a 20 67 6f 69 6e 67 20 6f 6e 2e 0a 2a 2a 0a 2a  * going on..**.*
2cb0: 2a 20 57 65 20 77 61 6e 74 20 74 68 65 20 6d 61  * We want the ma
2cc0: 69 6e 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  in string compar
2cd0: 69 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75  ision function u
2ce0: 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  sed for sorting 
2cf0: 74 6f 0a 2a 2a 20 73 6f 72 74 20 62 6f 74 68 20  to.** sort both 
2d00: 6e 75 6d 62 65 72 73 20 61 6e 64 20 61 6c 70 68  numbers and alph
2d10: 61 6e 75 6d 65 72 69 63 20 77 6f 72 64 73 20 69  anumeric words i
2d20: 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
2d30: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 54 68 65  sequence..** The
2d40: 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 73 68   same routine sh
2d50: 6f 75 6c 64 20 64 6f 20 62 6f 74 68 20 77 69 74  ould do both wit
2d60: 68 6f 75 74 20 70 72 69 6f 72 20 6b 6e 6f 77 6c  hout prior knowl
2d70: 65 64 67 65 20 6f 66 20 77 68 69 63 68 0a 2a 2a  edge of which.**
2d80: 20 74 79 70 65 20 6f 66 20 74 65 78 74 20 74 68   type of text th
2d90: 65 20 69 6e 70 75 74 20 72 65 70 72 65 73 65 6e  e input represen
2da0: 74 73 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 65  ts.  It should e
2db0: 76 65 6e 20 77 6f 72 6b 20 66 6f 72 20 73 74 72  ven work for str
2dc0: 69 6e 67 73 0a 2a 2a 20 77 68 69 63 68 20 61 72  ings.** which ar
2dd0: 65 20 61 20 6d 69 78 74 75 72 65 20 6f 66 20 74  e a mixture of t
2de0: 65 78 74 20 61 6e 64 20 6e 75 6d 62 65 72 73 2e  ext and numbers.
2df0: 20 20 28 49 74 20 64 6f 65 73 20 6e 6f 74 20 77    (It does not w
2e00: 6f 72 6b 20 66 6f 72 0a 2a 2a 20 6e 75 6d 65 72  ork for.** numer
2e10: 69 63 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ic substrings in
2e20: 20 65 78 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74   exponential not
2e30: 61 74 69 6f 6e 2c 20 68 6f 77 65 76 65 72 2e 29  ation, however.)
2e40: 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 63 63 6f 6d 70  .**.** To accomp
2e50: 6c 69 73 68 20 74 68 69 73 2c 20 77 65 20 6b 65  lish this, we ke
2e60: 65 70 20 74 72 61 63 6b 20 6f 66 20 61 20 73 74  ep track of a st
2e70: 61 74 65 20 6e 75 6d 62 65 72 20 77 68 69 6c 65  ate number while
2e80: 20 73 63 61 6e 6e 69 6e 67 0a 2a 2a 20 74 68 65   scanning.** the
2e90: 20 74 77 6f 20 73 74 72 69 6e 67 73 2e 20 20 54   two strings.  T
2ea0: 68 65 20 73 74 61 74 65 73 20 61 72 65 20 61 73  he states are as
2eb0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2ec0: 20 20 20 31 20 20 20 20 20 20 42 65 67 69 6e 6e     1      Beginn
2ed0: 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20  ing of word.**  
2ee0: 20 20 32 20 20 20 20 20 20 41 72 62 69 74 72 61    2      Arbitra
2ef0: 72 79 20 74 65 78 74 0a 2a 2a 20 20 20 20 33 20  ry text.**    3 
2f00: 20 20 20 20 20 49 6e 74 65 67 65 72 0a 2a 2a 20       Integer.** 
2f10: 20 20 20 34 20 20 20 20 20 20 4e 65 67 61 74 69     4      Negati
2f20: 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ve integer.**   
2f30: 20 35 20 20 20 20 20 20 52 65 61 6c 20 6e 75 6d   5      Real num
2f40: 62 65 72 0a 2a 2a 20 20 20 20 36 20 20 20 20 20  ber.**    6     
2f50: 20 4e 65 67 61 74 69 76 65 20 72 65 61 6c 0a 2a   Negative real.*
2f60: 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 20 62 65  *.** The scan be
2f70: 67 69 6e 73 20 69 6e 20 73 74 61 74 65 20 31 2c  gins in state 1,
2f80: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f   beginning of wo
2f90: 72 64 2e 20 20 54 72 61 6e 73 69 74 69 6f 6e 73  rd.  Transitions
2fa0: 20 74 6f 20 6f 74 68 65 72 0a 2a 2a 20 73 74 61   to other.** sta
2fb0: 74 65 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e  tes are determin
2fc0: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 73  ed by characters
2fd0: 20 73 65 65 6e 2c 20 61 73 20 73 68 6f 77 6e 20   seen, as shown 
2fe0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2ff0: 0a 2a 2a 20 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a  .** chart:.**.**
3000: 20 20 20 20 20 20 43 75 72 72 65 6e 74 20 53 74        Current St
3010: 61 74 65 20 20 20 20 20 20 20 20 20 43 68 61 72  ate         Char
3020: 61 63 74 65 72 20 53 65 65 6e 20 20 4e 65 77 20  acter Seen  New 
3030: 53 74 61 74 65 0a 2a 2a 20 20 20 20 20 20 2d 2d  State.**      --
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
3060: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
3070: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
3080: 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77  0 Beginning of w
3090: 6f 72 64 20 20 20 22 2d 22 20 20 20 20 20 20 20  ord   "-"       
30a0: 20 20 20 20 20 20 33 20 4e 65 67 61 74 69 76 65        3 Negative
30b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20 20         digit    
30e0: 20 20 20 20 20 20 20 32 20 49 6e 74 65 67 65 72         2 Integer
30f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3110: 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30  pace           0
3120: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f   Beginning of wo
3130: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rd.**           
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
3160: 20 31 20 41 72 62 69 74 72 61 72 79 20 74 65 78   1 Arbitrary tex
3170: 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 20 41  t.**.**      1 A
3180: 72 62 69 74 72 61 72 79 20 74 65 78 74 20 20 20  rbitrary text   
3190: 20 20 20 73 70 61 63 65 20 20 20 20 20 20 20 20     space        
31a0: 20 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f     0 Beginning o
31b0: 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  f word.**       
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 64 69 67 69 74 20 20 20 20 20 20       digit      
31e0: 20 20 20 20 20 32 20 49 6e 74 65 67 65 72 0a 2a       2 Integer.*
31f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
3210: 65 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41  erwise       1 A
3220: 72 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a  rbitrary text.**
3230: 0a 2a 2a 20 20 20 20 20 20 32 20 49 6e 74 65 67  .**      2 Integ
3240: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 73  er             s
3250: 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30  pace           0
3260: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f   Beginning of wo
3270: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rd.**           
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 22 2e 22 20 20 20 20 20 20 20 20 20 20 20 20   "."            
32a0: 20 34 20 52 65 61 6c 20 6e 75 6d 62 65 72 0a 2a   4 Real number.*
32b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 67               dig
32d0: 69 74 20 20 20 20 20 20 20 20 20 20 20 32 20 49  it           2 I
32e0: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  nteger.**       
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20       otherwise  
3310: 20 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79       1 Arbitrary
3320: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20   text.**.**     
3330: 20 33 20 4e 65 67 61 74 69 76 65 20 69 6e 74 65   3 Negative inte
3340: 67 65 72 20 20 20 20 73 70 61 63 65 20 20 20 20  ger    space    
3350: 20 20 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69         0 Beginni
3360: 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20  ng of word.**   
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 20 20 20 20 20 22 2e 22 20 20 20 20           "."    
3390: 20 20 20 20 20 20 20 20 20 35 20 4e 65 67 61 74           5 Negat
33a0: 69 76 65 20 52 65 61 6c 20 6e 75 6d 0a 2a 2a 20  ive Real num.** 
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 20 20 20 20 20 20 20 64 69 67 69 74             digit
33d0: 20 20 20 20 20 20 20 20 20 20 20 33 20 4e 65 67             3 Neg
33e0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a  ative integer.**
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68 65              othe
3410: 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41 72  rwise       1 Ar
3420: 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a 0a  bitrary text.**.
3430: 2a 2a 20 20 20 20 20 20 34 20 52 65 61 6c 20 6e  **      4 Real n
3440: 75 6d 62 65 72 20 20 20 20 20 20 20 20 20 73 70  umber         sp
3450: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30 20  ace           0 
3460: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72  Beginning of wor
3470: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 64 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20  digit           
34a0: 34 20 52 65 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a  4 Real number.**
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68 65              othe
34d0: 72 77 69 73 65 20 20 20 20 20 20 20 31 20 41 72  rwise       1 Ar
34e0: 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a 2a 0a  bitrary text.**.
34f0: 2a 2a 20 20 20 20 20 20 35 20 4e 65 67 61 74 69  **      5 Negati
3500: 76 65 20 72 65 61 6c 20 6e 75 6d 20 20 20 73 70  ve real num   sp
3510: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 30 20  ace           0 
3520: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72  Beginning of wor
3530: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 64 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20  digit           
3560: 35 20 4e 65 67 61 74 69 76 65 20 72 65 61 6c 20  5 Negative real 
3570: 6e 75 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  num.**          
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
35a0: 20 20 31 20 41 72 62 69 74 72 61 72 79 20 74 65    1 Arbitrary te
35b0: 78 74 0a 2a 2a 0a 2a 2a 20 54 6f 20 69 6d 70 6c  xt.**.** To impl
35c0: 65 6d 65 6e 74 20 74 68 69 73 20 73 74 61 74 65  ement this state
35d0: 20 6d 61 63 68 69 6e 65 2c 20 77 65 20 66 69 72   machine, we fir
35e0: 73 74 20 63 6c 61 73 73 69 66 79 20 65 61 63 68  st classify each
35f0: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
3600: 74 6f 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  to on of the fol
3610: 6c 6f 77 69 6e 67 20 63 61 74 65 67 6f 72 69 65  lowing categorie
3620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 30 20  s:.**.**      0 
3630: 20 54 65 78 74 0a 2a 2a 20 20 20 20 20 20 31 20   Text.**      1 
3640: 20 53 70 61 63 65 0a 2a 2a 20 20 20 20 20 20 32   Space.**      2
3650: 20 20 44 69 67 69 74 0a 2a 2a 20 20 20 20 20 20    Digit.**      
3660: 33 20 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 34  3  "-".**      4
3670: 20 20 22 2e 22 0a 2a 2a 0a 2a 2a 20 47 69 76 65    ".".**.** Give
3680: 6e 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 63  n an arbitrary c
3690: 68 61 72 61 63 74 65 72 2c 20 74 68 65 20 61 72  haracter, the ar
36a0: 72 61 79 20 63 68 61 72 43 6c 61 73 73 5b 5d 20  ray charClass[] 
36b0: 6d 61 70 73 20 74 68 61 74 20 63 68 61 72 61 63  maps that charac
36c0: 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 6f 6e 65 20  ter.** into one 
36d0: 6f 66 20 74 68 65 20 61 74 6f 76 65 20 63 61 74  of the atove cat
36e0: 65 67 6f 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  egories..*/.stat
36f0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
3700: 64 20 63 68 61 72 20 63 68 61 72 43 6c 61 73 73  d char charClass
3710: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
3720: 2a 20 78 30 20 78 31 20 78 32 20 78 33 20 78 34  * x0 x1 x2 x3 x4
3730: 20 78 35 20 78 36 20 78 37 20 78 38 20 78 39 20   x5 x6 x7 x8 x9 
3740: 78 41 20 78 42 20 78 43 20 78 44 20 78 45 20 78  xA xB xC xD xE x
3750: 46 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20  F */./* 0x */   
3760: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3770: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 31 2c  , 0, 0, 0, 1, 1,
3780: 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 1, 0, 0, 0,.
3790: 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20 30 2c  /* 1x */   0, 0,
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 0a 2f 2a 20 32 78  , 0, 0, 0,./* 2x
37d0: 20 2a 2f 20 20 20 31 2c 20 30 2c 20 30 2c 20 30   */   1, 0, 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 33 2c 20   0, 0, 0, 0, 3, 
3800: 34 2c 20 30 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20  4, 0,./* 3x */  
3810: 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
3820: 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 30  2, 2, 2, 2, 2, 0
3830: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3840: 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20 30  ./* 4x */   0, 0
3850: 2c 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 0a 2f 2a 20 35  0, 0, 0, 0,./* 5
3880: 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20  x */   0, 0, 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 0a 2f 2a 20 36 78 20 2a 2f 20   0, 0,./* 6x */ 
38c0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
38d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
38e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
38f0: 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 30 2c 20  ,./* 7x */   0, 
3900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3910: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3920: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20   0, 0, 0, 0,./* 
3930: 38 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c  8x */   0, 0, 0,
3940: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3950: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3960: 2c 20 30 2c 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f  , 0, 0,./* 9x */
3970: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
3980: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
39a0: 30 2c 0a 2f 2a 20 41 78 20 2a 2f 20 20 20 30 2c  0,./* Ax */   0,
39b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
39c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
39d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a  , 0, 0, 0, 0,./*
39e0: 20 42 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30   Bx */   0, 0, 0
39f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3a00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3a10: 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 43 78 20 2a  0, 0, 0,./* Cx *
3a20: 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  /   0, 0, 0, 0, 
3a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3a40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3a50: 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20 20 20 30   0,./* Dx */   0
3a60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3a70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f  0, 0, 0, 0, 0,./
3a90: 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20  * Ex */   0, 0, 
3aa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3ab0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3ac0: 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 46 78 20   0, 0, 0,./* Fx 
3ad0: 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  */   0, 0, 0, 0,
3ae0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3af0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3b00: 2c 20 30 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  , 0,.};.#define 
3b10: 4e 5f 43 48 41 52 5f 43 4c 41 53 53 20 35 0a 0a  N_CHAR_CLASS 5..
3b20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
3b30: 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6e 75  current state nu
3b40: 6d 62 65 72 20 28 30 20 74 68 72 75 20 35 29 2c  mber (0 thru 5),
3b50: 20 74 68 69 73 20 61 72 72 61 79 20 66 69 67 75   this array figu
3b60: 72 65 73 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  res.** the new s
3b70: 74 61 74 65 20 6e 75 6d 62 65 72 20 67 69 76 65  tate number give
3b80: 6e 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  n the character 
3b90: 63 6c 61 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  class..*/.static
3ba0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3bb0: 63 68 61 72 20 73 74 61 74 65 4d 61 63 68 69 6e  char stateMachin
3bc0: 65 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 54 65 78 74  e[] = {. /* Text
3bd0: 2c 20 20 53 70 61 63 65 2c 20 44 69 67 69 74 2c  ,  Space, Digit,
3be0: 20 22 2d 22 2c 20 22 2e 22 20 2a 2f 0a 20 20 20   "-", "." */.   
3bf0: 20 20 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20     1,      0,   
3c00: 20 32 2c 20 20 20 20 33 2c 20 20 20 31 2c 20 20   2,    3,   1,  
3c10: 20 20 20 20 2f 2a 20 53 74 61 74 65 20 30 3a 20      /* State 0: 
3c20: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77 6f 72  Beginning of wor
3c30: 64 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20  d */.      1,   
3c40: 20 20 20 30 2c 20 20 20 20 32 2c 20 20 20 20 31     0,    2,    1
3c50: 2c 20 20 20 31 2c 20 20 20 20 20 20 2f 2a 20 53  ,   1,      /* S
3c60: 74 61 74 65 20 31 3a 20 41 72 62 69 74 72 61 72  tate 1: Arbitrar
3c70: 79 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  y text */.      
3c80: 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20 32 2c  1,      0,    2,
3c90: 20 20 20 20 31 2c 20 20 20 34 2c 20 20 20 20 20      1,   4,     
3ca0: 20 2f 2a 20 53 74 61 74 65 20 32 3a 20 49 6e 74   /* State 2: Int
3cb0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 31 2c  eger */.      1,
3cc0: 20 20 20 20 20 20 30 2c 20 20 20 20 33 2c 20 20        0,    3,  
3cd0: 20 20 31 2c 20 20 20 35 2c 20 20 20 20 20 20 2f    1,   5,      /
3ce0: 2a 20 53 74 61 74 65 20 33 3a 20 4e 65 67 61 74  * State 3: Negat
3cf0: 69 76 65 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ive integer */. 
3d00: 20 20 20 20 20 31 2c 20 20 20 20 20 20 30 2c 20       1,      0, 
3d10: 20 20 20 34 2c 20 20 20 20 31 2c 20 20 20 31 2c     4,    1,   1,
3d20: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 34        /* State 4
3d30: 3a 20 52 65 61 6c 20 6e 75 6d 62 65 72 20 2a 2f  : Real number */
3d40: 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 30  .      1,      0
3d50: 2c 20 20 20 20 35 2c 20 20 20 20 31 2c 20 20 20  ,    5,    1,   
3d60: 31 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65  1,      /* State
3d70: 20 35 3a 20 4e 65 67 61 74 69 76 65 20 72 65 61   5: Negative rea
3d80: 6c 20 6e 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  l num */.};../* 
3d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
3da0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
3db0: 66 20 74 77 6f 20 73 74 72 69 6e 67 73 2e 20 20  f two strings.  
3dc0: 43 61 73 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  Case is used onl
3dd0: 79 0a 2a 2a 20 69 66 20 75 73 65 43 61 73 65 21  y.** if useCase!
3de0: 3d 30 2e 20 20 4e 75 6d 65 72 69 63 20 73 75 62  =0.  Numeric sub
3df0: 73 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 65 20  strings compare 
3e00: 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64  in numerical ord
3e10: 65 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  er for the.** mo
3e20: 73 74 20 70 61 72 74 20 62 75 74 20 74 68 69 73  st part but this
3e30: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
3e40: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 65 78 70  t understand exp
3e50: 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69 6f  onential notatio
3e60: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3e70: 20 73 6f 72 74 53 74 72 43 6d 70 28 63 6f 6e 73   sortStrCmp(cons
3e80: 74 20 63 68 61 72 20 2a 61 74 65 78 74 2c 20 63  t char *atext, c
3e90: 6f 6e 73 74 20 63 68 61 72 20 2a 62 74 65 78 74  onst char *btext
3ea0: 2c 20 69 6e 74 20 75 73 65 43 61 73 65 29 7b 0a  , int useCase){.
3eb0: 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67    register unsig
3ec0: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 2c  ned char *a, *b,
3ed0: 20 2a 6d 61 70 2c 20 63 61 2c 20 63 62 3b 0a 20   *map, ca, cb;. 
3ee0: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 72   int result;.  r
3ef0: 65 67 69 73 74 65 72 20 69 6e 74 20 63 63 6c 61  egister int ccla
3f00: 73 73 20 3d 20 30 3b 0a 0a 20 20 61 20 3d 20 28  ss = 0;..  a = (
3f10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3f20: 61 74 65 78 74 3b 0a 20 20 62 20 3d 20 28 75 6e  atext;.  b = (un
3f30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 62 74  signed char *)bt
3f40: 65 78 74 3b 0a 20 20 69 66 28 20 75 73 65 43 61  ext;.  if( useCa
3f50: 73 65 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20  se ){.    do{.  
3f60: 20 20 20 20 69 66 28 20 28 63 61 3d 20 2a 61 2b      if( (ca= *a+
3f70: 2b 29 21 3d 28 63 62 3d 20 2a 62 2b 2b 29 20 29  +)!=(cb= *b++) )
3f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 63   break;.      cc
3f90: 6c 61 73 73 20 3d 20 73 74 61 74 65 4d 61 63 68  lass = stateMach
3fa0: 69 6e 65 5b 63 63 6c 61 73 73 2a 4e 5f 43 48 41  ine[cclass*N_CHA
3fb0: 52 5f 43 4c 41 53 53 20 2b 20 63 68 61 72 43 6c  R_CLASS + charCl
3fc0: 61 73 73 5b 63 61 5d 5d 3b 0a 20 20 20 20 7d 77  ass[ca]];.    }w
3fd0: 68 69 6c 65 28 20 63 61 21 3d 30 20 29 3b 0a 20  hile( ca!=0 );. 
3fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 70 20   }else{.    map 
3ff0: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 3b 0a  = UpperToLower;.
4000: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
4010: 28 20 28 63 61 3d 6d 61 70 5b 2a 61 2b 2b 5d 29  ( (ca=map[*a++])
4020: 21 3d 28 63 62 3d 6d 61 70 5b 2a 62 2b 2b 5d 29  !=(cb=map[*b++])
4030: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4040: 63 63 6c 61 73 73 20 3d 20 73 74 61 74 65 4d 61  cclass = stateMa
4050: 63 68 69 6e 65 5b 63 63 6c 61 73 73 2a 4e 5f 43  chine[cclass*N_C
4060: 48 41 52 5f 43 4c 41 53 53 20 2b 20 63 68 61 72  HAR_CLASS + char
4070: 43 6c 61 73 73 5b 63 61 5d 5d 3b 0a 20 20 20 20  Class[ca]];.    
4080: 7d 77 68 69 6c 65 28 20 63 61 21 3d 30 20 29 3b  }while( ca!=0 );
4090: 0a 20 20 20 20 69 66 28 20 63 61 3e 3d 27 5b 27  .    if( ca>='['
40a0: 20 26 26 20 63 61 3c 3d 27 60 27 20 29 20 63 62   && ca<='`' ) cb
40b0: 20 3d 20 62 5b 2d 31 5d 3b 0a 20 20 20 20 69 66   = b[-1];.    if
40c0: 28 20 63 62 3e 3d 27 5b 27 20 26 26 20 63 62 3c  ( cb>='[' && cb<
40d0: 3d 27 60 27 20 29 20 63 61 20 3d 20 61 5b 2d 31  ='`' ) ca = a[-1
40e0: 5d 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  ];.  }.  switch(
40f0: 20 63 63 6c 61 73 73 20 29 7b 0a 20 20 20 20 63   cclass ){.    c
4100: 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
4110: 31 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 69  1: {.      if( i
4120: 73 64 69 67 69 74 28 63 61 29 20 26 26 20 69 73  sdigit(ca) && is
4130: 64 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20 20  digit(cb) ){.   
4140: 20 20 20 20 20 63 63 6c 61 73 73 20 3d 20 32 3b       cclass = 2;
4150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4170: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4190: 7d 0a 20 20 73 77 69 74 63 68 28 20 63 63 6c 61  }.  switch( ccla
41a0: 73 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32  ss ){.    case 2
41b0: 3a 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 0a  :.    case 3: {.
41c0: 20 20 20 20 20 20 69 66 28 20 69 73 64 69 67 69        if( isdigi
41d0: 74 28 63 61 29 20 29 7b 0a 20 20 20 20 20 20 20  t(ca) ){.       
41e0: 20 69 66 28 20 69 73 64 69 67 69 74 28 63 62 29   if( isdigit(cb)
41f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4200: 74 20 61 63 6e 74 2c 20 62 63 6e 74 3b 0a 20 20  t acnt, bcnt;.  
4210: 20 20 20 20 20 20 20 20 61 63 6e 74 20 3d 20 62          acnt = b
4220: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cnt = 0;.       
4230: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
4240: 74 28 2a 61 2b 2b 29 20 29 20 61 63 6e 74 2b 2b  t(*a++) ) acnt++
4250: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
4260: 65 28 20 69 73 64 69 67 69 74 28 2a 62 2b 2b 29  e( isdigit(*b++)
4270: 20 29 20 62 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   ) bcnt++;.     
4280: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 61 63       result = ac
4290: 6e 74 20 2d 20 62 63 6e 74 3b 0a 20 20 20 20 20  nt - bcnt;.     
42a0: 20 20 20 20 20 69 66 28 20 72 65 73 75 6c 74 3d       if( result=
42b0: 3d 30 20 29 20 72 65 73 75 6c 74 20 3d 20 63 61  =0 ) result = ca
42c0: 2d 63 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -cb;.        }el
42d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
42e0: 73 75 6c 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  sult = 1;.      
42f0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
4300: 69 66 28 20 69 73 64 69 67 69 74 28 63 62 29 20  if( isdigit(cb) 
4310: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ){.        resul
4320: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
4330: 6c 73 65 20 69 66 28 20 63 61 3d 3d 27 2e 27 20  lse if( ca=='.' 
4340: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  ){.        resul
4350: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
4360: 73 65 20 69 66 28 20 63 62 3d 3d 27 2e 27 20 29  se if( cb=='.' )
4370: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
4380: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
4390: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75  se{.        resu
43a0: 6c 74 20 3d 20 63 61 20 2d 20 63 62 3b 0a 20 20  lt = ca - cb;.  
43b0: 20 20 20 20 20 20 63 63 6c 61 73 73 20 3d 20 32        cclass = 2
43c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
43d0: 69 66 28 20 63 63 6c 61 73 73 3d 3d 33 20 29 20  if( cclass==3 ) 
43e0: 72 65 73 75 6c 74 20 3d 20 2d 72 65 73 75 6c 74  result = -result
43f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4400: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 30 3a     }.    case 0:
4410: 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
4420: 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
4430: 20 72 65 73 75 6c 74 20 3d 20 63 61 20 2d 20 63   result = ca - c
4440: 62 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  b;.      break;.
4450: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
4460: 3a 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  : {.      result
4470: 20 3d 20 63 62 20 2d 20 63 61 3b 0a 20 20 20 20   = cb - ca;.    
4480: 7d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  };.  }.  return 
4490: 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  result;.}../*.**
44a0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
44b0: 7a 20 69 73 20 61 20 70 75 72 65 20 6e 75 6d 65  z is a pure nume
44c0: 72 69 63 20 73 74 72 69 6e 67 2e 20 20 52 65 74  ric string.  Ret
44d0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
44e0: 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  .** string conta
44f0: 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65  ins any characte
4500: 72 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 70  r which is not p
4510: 61 72 74 20 6f 66 20 61 20 6e 75 6d 62 65 72 2e  art of a number.
4520: 0a 2a 2a 0a 2a 2a 20 41 6d 20 65 6d 70 74 79 20  .**.** Am empty 
4530: 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 69 64  string is consid
4540: 65 72 65 64 20 6e 75 6d 65 72 69 63 2e 0a 2a 2f  ered numeric..*/
4550: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
4560: 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  m(const char *z)
4570: 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20  {.  if( *z=='-' 
4580: 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b  || *z=='+' ) z++
4590: 3b 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74  ;.  if( !isdigit
45a0: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (*z) ){.    retu
45b0: 72 6e 20 2a 7a 3d 3d 30 3b 0a 20 20 7d 0a 20 20  rn *z==0;.  }.  
45c0: 7a 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  z++;.  while( is
45d0: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
45e0: 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e  ; }.  if( *z=='.
45f0: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
4600: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
4610: 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
4620: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
4630: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
4640: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20      if( *z=='e' 
4650: 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20  || *z=='E' ){.  
4660: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69      z++;.      i
4670: 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a  f( *z=='+' || *z
4680: 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
4690: 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28     if( !isdigit(
46a0: 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  *z) ) return 0;.
46b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
46c0: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
46d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
46e0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
46f0: 2f 2a 20 54 68 69 73 20 63 6f 6d 70 61 72 69 73  /* This comparis
4700: 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 77 68  on routine is wh
4710: 61 74 20 77 65 20 75 73 65 20 66 6f 72 20 63 6f  at we use for co
4720: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
4730: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 6e 20 53 51 4c  ons.** in an SQL
4740: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 28 45   expression.  (E
4750: 78 3a 20 20 6e 61 6d 65 3c 27 48 65 6c 6c 6f 27  x:  name<'Hello'
4760: 20 6f 72 20 76 61 6c 75 65 3c 35 29 2e 20 0a 2a   or value<5). .*
4770: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 61 6c 20 73  *.** Numerical s
4780: 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 65 20 69  trings compare i
4790: 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64 65  n numerical orde
47a0: 72 2e 20 20 4e 75 6d 65 72 69 63 61 6c 20 73 74  r.  Numerical st
47b0: 72 69 6e 67 73 0a 2a 2a 20 61 72 65 20 61 6c 77  rings.** are alw
47c0: 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 6e 6f  ays less than no
47d0: 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67  n-numeric string
47e0: 73 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63 20  s.  Non-numeric 
47f0: 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 61  strings.** compa
4800: 72 65 20 69 6e 20 6c 65 78 69 67 72 61 70 68 69  re in lexigraphi
4810: 63 61 6c 20 6f 72 64 65 72 20 28 74 68 65 20 73  cal order (the s
4820: 61 6d 65 20 6f 72 64 65 72 20 61 73 20 73 74 72  ame order as str
4830: 63 6d 70 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  cmp())..**.** Th
4840: 69 73 20 69 73 20 4e 4f 54 20 74 68 65 20 63 6f  is is NOT the co
4850: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
4860: 6e 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69  n used for sorti
4870: 6e 67 2e 20 20 54 68 65 20 73 6f 72 74 0a 2a 2a  ng.  The sort.**
4880: 20 6f 72 64 65 72 20 69 73 20 61 20 6c 69 74 74   order is a litt
4890: 6c 65 20 62 69 74 20 64 69 66 66 65 72 65 6e 74  le bit different
48a0: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 53 6f 72  .  See sqliteSor
48b0: 74 43 6f 6d 70 61 72 65 20 62 65 6c 6f 77 0a 2a  tCompare below.*
48c0: 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
48d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
48e0: 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6d 70 61  .int sqliteCompa
48f0: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  re(const char *a
4900: 74 65 78 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  text, const char
4910: 20 2a 62 74 65 78 74 29 7b 0a 20 20 69 6e 74 20   *btext){.  int 
4920: 72 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 73  result;.  int is
4930: 4e 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a 20 20  NumA, isNumB;.  
4940: 69 66 28 20 61 74 65 78 74 3d 3d 30 20 29 7b 0a  if( atext==0 ){.
4950: 20 20 20 20 72 65 74 75 72 6e 20 2d 28 62 74 65      return -(bte
4960: 78 74 21 3d 30 29 3b 0a 20 20 7d 65 6c 73 65 20  xt!=0);.  }else 
4970: 69 66 28 20 62 74 65 78 74 3d 3d 30 20 29 7b 0a  if( btext==0 ){.
4980: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4990: 7d 0a 20 20 69 73 4e 75 6d 41 20 3d 20 69 73 4e  }.  isNumA = isN
49a0: 75 6d 28 61 74 65 78 74 29 3b 0a 20 20 69 73 4e  um(atext);.  isN
49b0: 75 6d 42 20 3d 20 69 73 4e 75 6d 28 62 74 65 78  umB = isNum(btex
49c0: 74 29 3b 0a 20 20 69 66 28 20 69 73 4e 75 6d 41  t);.  if( isNumA
49d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 4e   ){.    if( !isN
49e0: 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 72 65 73  umB ){.      res
49f0: 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  ult = -1;.    }e
4a00: 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  lse{.      doubl
4a10: 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20 20 20  e rA, rB;.      
4a20: 72 41 20 3d 20 61 74 6f 66 28 61 74 65 78 74 29  rA = atof(atext)
4a30: 3b 0a 20 20 20 20 20 20 72 42 20 3d 20 61 74 6f  ;.      rB = ato
4a40: 66 28 62 74 65 78 74 29 3b 0a 20 20 20 20 20 20  f(btext);.      
4a50: 69 66 28 20 72 41 3c 72 42 20 29 7b 0a 20 20 20  if( rA<rB ){.   
4a60: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31       result = -1
4a70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4a80: 28 20 72 41 3e 72 42 20 29 7b 0a 20 20 20 20 20  ( rA>rB ){.     
4a90: 20 20 20 72 65 73 75 6c 74 20 3d 20 2b 31 3b 0a     result = +1;.
4aa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4ab0: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
4ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4ad0: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
4ae0: 42 20 29 7b 0a 20 20 20 20 72 65 73 75 6c 74 20  B ){.    result 
4af0: 3d 20 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 7b 0a  = +1;.  }else {.
4b00: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 74 72      result = str
4b10: 63 6d 70 28 61 74 65 78 74 2c 20 62 74 65 78 74  cmp(atext, btext
4b20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4b30: 72 65 73 75 6c 74 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  result; .}../*.*
4b40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4b50: 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69  s used for sorti
4b60: 6e 67 2e 20 20 45 61 63 68 20 6b 65 79 20 69 73  ng.  Each key is
4b70: 20 61 20 6c 69 73 74 20 6f 66 20 6f 6e 65 20 6f   a list of one o
4b80: 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c 6c 2d 74  r more.** null-t
4b90: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
4ba0: 73 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  s.  The list is 
4bb0: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 74 77  terminated by tw
4bc0: 6f 20 6e 75 6c 6c 73 20 69 6e 0a 2a 2a 20 61 20  o nulls in.** a 
4bd0: 72 6f 77 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  row.  For exampl
4be0: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
4bf0: 20 74 65 78 74 20 69 73 20 6b 65 79 20 77 69 74   text is key wit
4c00: 68 20 74 68 72 65 65 20 73 74 72 69 6e 67 73 3a  h three strings:
4c10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
4c20: 20 20 2b 6f 6e 65 5c 30 30 30 2d 74 77 6f 5c 30    +one\000-two\0
4c30: 30 30 2b 74 68 72 65 65 5c 30 30 30 5c 30 30 30  00+three\000\000
4c40: 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 61 72 67 75  .**.** Both argu
4c50: 6d 65 6e 74 73 20 77 69 6c 6c 20 68 61 76 65 20  ments will have 
4c60: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
4c70: 6f 66 20 73 74 72 69 6e 67 73 2e 20 20 54 68 69  of strings.  Thi
4c80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
4c90: 75 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  urns negative, z
4ca0: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
4cb0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
4cc0: 67 75 6d 65 6e 74 20 69 73 20 6c 65 73 73 0a 2a  gument is less.*
4cd0: 2a 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  * than, equal to
4ce0: 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
4cf0: 6e 20 74 68 65 20 66 69 72 73 74 2e 20 20 28 52  n the first.  (R
4d00: 65 73 75 6c 74 20 69 73 20 61 2d 62 29 2e 0a 2a  esult is a-b)..*
4d10: 2a 0a 2a 2a 20 45 76 65 72 79 20 73 74 72 69 6e  *.** Every strin
4d20: 67 20 62 65 67 69 6e 73 20 77 69 74 68 20 65 69  g begins with ei
4d30: 74 68 65 72 20 61 20 22 2b 22 20 6f 72 20 22 2d  ther a "+" or "-
4d40: 22 20 63 68 61 72 61 63 74 65 72 2e 20 20 49 66  " character.  If
4d50: 20 74 68 65 0a 2a 2a 20 63 68 61 72 61 63 74 65   the.** characte
4d60: 72 20 69 73 20 22 2d 22 20 74 68 65 6e 20 74 68  r is "-" then th
4d70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
4d80: 73 20 6e 65 67 61 74 65 64 2e 20 20 54 68 69 73  s negated.  This
4d90: 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20 69   is done.** to i
4da0: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 6f 72 74 20  mplement a sort 
4db0: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4dc0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  der..**.** For s
4dd0: 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2c  orting purposes,
4de0: 20 70 75 72 20 6e 75 6d 65 72 69 63 20 73 74 72   pur numeric str
4df0: 69 6e 67 73 20 28 73 74 72 69 6e 67 73 20 66 6f  ings (strings fo
4e00: 72 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 69  r which the.** i
4e10: 73 4e 75 6d 28 29 20 66 75 6e 63 74 69 6f 6e 20  sNum() function 
4e20: 61 62 6f 76 65 20 72 65 74 75 72 6e 73 20 54 52  above returns TR
4e30: 55 45 29 20 61 6c 77 61 79 73 20 63 6f 6d 70 61  UE) always compa
4e40: 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74 72  re less than str
4e50: 69 6e 67 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ings.** that are
4e60: 20 6e 6f 74 20 70 75 72 65 20 6e 75 6d 65 72 69   not pure numeri
4e70: 63 73 2e 20 20 57 69 74 68 69 6e 20 6e 6f 6e 2d  cs.  Within non-
4e80: 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73 2c  numeric strings,
4e90: 20 73 75 62 73 74 72 69 6e 67 73 0a 2a 2a 20 6f   substrings.** o
4ea0: 66 20 64 69 67 69 74 73 20 63 6f 6d 70 61 72 65  f digits compare
4eb0: 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72   in numerical or
4ec0: 64 65 72 2e 20 20 46 69 6e 61 6c 6c 79 2c 20 63  der.  Finally, c
4ed0: 61 73 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ase is used only
4ee0: 0a 2a 2a 20 74 6f 20 62 72 65 61 6b 20 61 20 74  .** to break a t
4ef0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ie..**.** Note t
4f00: 68 61 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64  hat the sort ord
4f10: 65 72 20 69 6d 70 6f 73 65 64 20 62 79 20 74 68  er imposed by th
4f20: 65 20 72 75 6c 65 73 20 61 62 6f 76 65 20 69 73  e rules above is
4f30: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
4f40: 6f 6d 20 74 68 65 20 6f 72 64 65 72 69 6e 67 20  om the ordering 
4f50: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 22  defined by the "
4f60: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 61  <", "<=", ">", a
4f70: 6e 64 20 22 3e 3d 22 20 6f 70 65 72 61 74 6f 72  nd ">=" operator
4f80: 73 0a 2a 2a 20 6f 66 20 65 78 70 72 65 73 73 69  s.** of expressi
4f90: 6f 6e 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74  ons.  The operat
4fa0: 6f 72 73 20 63 6f 6d 70 61 72 65 20 6e 6f 6e 2d  ors compare non-
4fb0: 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73 20  numeric strings 
4fc0: 69 6e 0a 2a 2a 20 6c 65 78 69 67 72 61 70 68 69  in.** lexigraphi
4fd0: 63 61 6c 20 6f 72 64 65 72 2e 20 20 54 68 69 73  cal order.  This
4fe0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
4ff0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 70 72 6f  e additional pro
5000: 63 65 73 73 69 6e 67 0a 2a 2a 20 74 6f 20 73 6f  cessing.** to so
5010: 72 74 20 73 75 62 73 74 72 69 6e 67 73 20 6f 66  rt substrings of
5020: 20 64 69 67 69 74 73 20 69 6e 74 6f 20 6e 75 6d   digits into num
5030: 65 72 69 63 61 6c 20 6f 72 64 65 72 20 61 6e 64  erical order and
5040: 20 74 6f 20 75 73 65 20 63 61 73 65 0a 2a 2a 20   to use case.** 
5050: 6f 6e 6c 79 20 61 73 20 61 20 74 69 65 2d 62 72  only as a tie-br
5060: 65 61 6b 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eaker..*/.int sq
5070: 6c 69 74 65 53 6f 72 74 43 6f 6d 70 61 72 65 28  liteSortCompare(
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 2c 20 63  const char *a, c
5090: 6f 6e 73 74 20 63 68 61 72 20 2a 62 29 7b 0a 20  onst char *b){. 
50a0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
50b0: 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  res = 0;.  int i
50c0: 73 4e 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a 0a  sNumA, isNumB;..
50d0: 20 20 77 68 69 6c 65 28 20 72 65 73 3d 3d 30 20    while( res==0 
50e0: 26 26 20 2a 61 20 26 26 20 2a 62 20 29 7b 0a 20  && *a && *b ){. 
50f0: 20 20 20 69 73 4e 75 6d 41 20 3d 20 69 73 4e 75     isNumA = isNu
5100: 6d 28 26 61 5b 31 5d 29 3b 0a 20 20 20 20 69 73  m(&a[1]);.    is
5110: 4e 75 6d 42 20 3d 20 69 73 4e 75 6d 28 26 62 5b  NumB = isNum(&b[
5120: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4e  1]);.    if( isN
5130: 75 6d 41 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  umA ){.      dou
5140: 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20  ble rA, rB;.    
5150: 20 20 69 66 28 20 21 69 73 4e 75 6d 42 20 29 7b    if( !isNumB ){
5160: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d  .        res = -
5170: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
5180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5190: 72 41 20 3d 20 61 74 6f 66 28 26 61 5b 31 5d 29  rA = atof(&a[1])
51a0: 3b 0a 20 20 20 20 20 20 72 42 20 3d 20 61 74 6f  ;.      rB = ato
51b0: 66 28 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20  f(&b[1]);.      
51c0: 69 66 28 20 72 41 3c 72 42 20 29 7b 0a 20 20 20  if( rA<rB ){.   
51d0: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
51e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
51f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5200: 72 41 3e 72 42 20 29 7b 0a 20 20 20 20 20 20 20  rA>rB ){.       
5210: 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20   res = +1;.     
5220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5230: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
5240: 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20  isNumB ){.      
5250: 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20  res = +1;.      
5260: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
5270: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 6f  {.      res = so
5280: 72 74 53 74 72 43 6d 70 28 26 61 5b 31 5d 2c 26  rtStrCmp(&a[1],&
5290: 62 5b 31 5d 2c 30 29 3b 0a 20 20 20 20 20 20 69  b[1],0);.      i
52a0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
52b0: 20 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74 53       res = sortS
52c0: 74 72 43 6d 70 28 26 61 5b 31 5d 2c 26 62 5b 31  trCmp(&a[1],&b[1
52d0: 5d 2c 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ],1);.      }.  
52e0: 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
52f0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5310: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
5320: 26 61 5b 31 5d 29 20 2b 20 32 3b 0a 20 20 20 20  &a[1]) + 2;.    
5330: 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 62 20  a += len;.    b 
5340: 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  += len;.  }.  if
5350: 28 20 2a 61 3d 3d 27 2d 27 20 29 20 72 65 73 20  ( *a=='-' ) res 
5360: 3d 20 2d 72 65 73 3b 0a 20 20 72 65 74 75 72 6e  = -res;.  return
5370: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   res;.}../*.** S
5380: 6f 6d 65 20 70 6f 77 65 72 73 20 6f 66 20 36 34  ome powers of 64
5390: 2e 20 20 54 68 65 73 65 20 63 6f 6e 73 74 61 6e  .  These constan
53a0: 74 73 20 61 72 65 20 6e 65 65 64 65 64 20 69 6e  ts are needed in
53b0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 52 65   the.** sqliteRe
53c0: 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 29 20 72  alToSortable() r
53d0: 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f  outine below..*/
53e0: 0a 23 64 65 66 69 6e 65 20 5f 36 34 65 33 20 20  .#define _64e3  
53f0: 28 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20 36  (64.0 * 64.0 * 6
5400: 34 2e 30 29 0a 23 64 65 66 69 6e 65 20 5f 36 34  4.0).#define _64
5410: 65 34 20 20 28 36 34 2e 30 20 2a 20 36 34 2e 30  e4  (64.0 * 64.0
5420: 20 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30 29 0a   * 64.0 * 64.0).
5430: 23 64 65 66 69 6e 65 20 5f 36 34 65 31 35 20 28  #define _64e15 (
5440: 5f 36 34 65 33 20 2a 20 5f 36 34 65 34 20 2a 20  _64e3 * _64e4 * 
5450: 5f 36 34 65 34 20 2a 20 5f 36 34 65 34 29 0a 23  _64e4 * _64e4).#
5460: 64 65 66 69 6e 65 20 5f 36 34 65 31 36 20 28 5f  define _64e16 (_
5470: 36 34 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f  64e4 * _64e4 * _
5480: 36 34 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64  64e4 * _64e4).#d
5490: 65 66 69 6e 65 20 5f 36 34 65 36 33 20 28 5f 36  efine _64e63 (_6
54a0: 34 65 31 35 20 2a 20 5f 36 34 65 31 36 20 2a 20  4e15 * _64e16 * 
54b0: 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 29  _64e16 * _64e16)
54c0: 0a 23 64 65 66 69 6e 65 20 5f 36 34 65 36 34 20  .#define _64e64 
54d0: 28 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36  (_64e16 * _64e16
54e0: 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f 36 34 65   * _64e16 * _64e
54f0: 31 36 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  16)../*.** The f
5500: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
5510: 72 65 20 63 6f 6e 76 65 72 74 73 20 61 20 64 6f  re converts a do
5520: 75 62 6c 65 2d 70 72 65 63 69 73 69 6f 6e 20 66  uble-precision f
5530: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
5540: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 61 20 73   number into a s
5550: 74 72 69 6e 67 2e 20 20 54 68 65 20 72 65 73 75  tring.  The resu
5560: 6c 74 69 6e 67 20 73 74 72 69 6e 67 20 68 61 73  lting string has
5570: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 74 68   the property th
5580: 61 74 0a 2a 2a 20 74 77 6f 20 73 75 63 68 20 73  at.** two such s
5590: 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 69 65 64  trings comparied
55a0: 20 75 73 69 6e 67 20 73 74 72 63 6d 70 28 29 20   using strcmp() 
55b0: 6f 72 20 6d 65 6d 63 6d 70 28 29 20 77 69 6c 6c  or memcmp() will
55c0: 20 67 69 76 65 20 74 68 65 0a 2a 2a 20 73 61 6d   give the.** sam
55d0: 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6e  e results as a n
55e0: 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f  umeric compariso
55f0: 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  n of the origina
5600: 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  l floating point
5610: 0a 2a 2a 20 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a  .** numbers..**.
5620: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5630: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
5640: 61 74 65 20 64 61 74 61 62 61 73 65 20 6b 65 79  ate database key
5650: 73 20 66 72 6f 6d 20 66 6c 6f 61 74 69 6e 67 20  s from floating 
5660: 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 73  point.** numbers
5670: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 6b   such that the k
5680: 65 79 73 20 73 6f 72 74 20 69 6e 20 74 68 65 20  eys sort in the 
5690: 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68  same order as th
56a0: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 66 6c  e original.** fl
56b0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
56c0: 62 65 72 73 20 65 76 65 6e 20 74 68 6f 75 67 68  bers even though
56d0: 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
56e0: 6d 70 61 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20  mpared using.** 
56f0: 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
5700: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
5710: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65  tion should have
5720: 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 6c 65   allocated at le
5730: 61 73 74 20 31 34 20 63 68 61 72 61 63 74 65 72  ast 14 character
5740: 73 0a 2a 2a 20 6f 66 20 73 70 61 63 65 20 66 6f  s.** of space fo
5750: 72 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 5d  r the buffer z[]
5760: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5770: 52 65 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 64  RealToSortable(d
5780: 6f 75 62 6c 65 20 72 2c 20 63 68 61 72 20 2a 7a  ouble r, char *z
5790: 29 7b 0a 20 20 69 6e 74 20 6e 65 67 3b 0a 20 20  ){.  int neg;.  
57a0: 69 6e 74 20 65 78 70 3b 0a 20 20 69 6e 74 20 63  int exp;.  int c
57b0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  nt = 0;..  /* Th
57c0: 69 73 20 61 72 72 61 79 20 6d 61 70 73 20 69 6e  is array maps in
57d0: 74 65 67 65 72 73 20 62 65 74 77 65 65 6e 20 30  tegers between 0
57e0: 20 61 6e 64 20 36 33 20 69 6e 74 6f 20 62 61 73   and 63 into bas
57f0: 65 2d 36 34 20 64 69 67 69 74 73 2e 0a 20 20 2a  e-64 digits..  *
5800: 2a 20 54 68 65 20 64 69 67 69 74 73 20 6d 75 73  * The digits mus
5810: 74 20 62 65 20 63 68 6f 73 65 6e 20 73 75 63 68  t be chosen such
5820: 20 61 74 20 74 68 65 69 72 20 41 53 43 49 49 20   at their ASCII 
5830: 63 6f 64 65 73 20 61 72 65 20 69 6e 63 72 65 61  codes are increa
5840: 73 69 6e 67 2e 0a 20 20 2a 2a 20 54 68 69 73 20  sing..  ** This 
5850: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6e 6f 74  means we can not
5860: 20 75 73 65 20 74 68 65 20 74 72 61 64 69 74 69   use the traditi
5870: 6f 6e 61 6c 20 62 61 73 65 2d 36 34 20 64 69 67  onal base-64 dig
5880: 69 74 20 73 65 74 2e 20 2a 2f 0a 20 20 73 74 61  it set. */.  sta
5890: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
58a0: 44 69 67 69 74 5b 5d 20 3d 20 0a 20 20 20 20 20  Digit[] = .     
58b0: 22 30 31 32 33 34 35 36 37 38 39 22 0a 20 20 20  "0123456789".   
58c0: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
58d0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
58e0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
58f0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
5900: 0a 20 20 20 20 20 22 7c 7e 22 3b 0a 20 20 69 66  .     "|~";.  if
5910: 28 20 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 6e  ( r<0.0 ){.    n
5920: 65 67 20 3d 20 31 3b 0a 20 20 20 20 72 20 3d 20  eg = 1;.    r = 
5930: 2d 72 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27  -r;.    *z++ = '
5940: 2d 27 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  -';.  } else {. 
5950: 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20 20 20     neg = 0;.    
5960: 2a 7a 2b 2b 20 3d 20 27 30 27 3b 0a 20 20 7d 0a  *z++ = '0';.  }.
5970: 20 20 65 78 70 20 3d 20 30 3b 0a 0a 20 20 69 66    exp = 0;..  if
5980: 28 20 72 3d 3d 30 2e 30 20 29 7b 0a 20 20 20 20  ( r==0.0 ){.    
5990: 65 78 70 20 3d 20 2d 31 30 32 34 3b 0a 20 20 7d  exp = -1024;.  }
59a0: 65 6c 73 65 20 69 66 28 20 72 3c 28 30 2e 35 2f  else if( r<(0.5/
59b0: 36 34 2e 30 29 20 29 7b 0a 20 20 20 20 77 68 69  64.0) ){.    whi
59c0: 6c 65 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65  le( r < 0.5/_64e
59d0: 36 34 20 26 26 20 65 78 70 20 3e 20 2d 39 36 31  64 && exp > -961
59e0: 20 20 29 7b 20 72 20 2a 3d 20 5f 36 34 65 36 34    ){ r *= _64e64
59f0: 3b 20 20 65 78 70 20 2d 3d 20 36 34 3b 20 7d 0a  ;  exp -= 64; }.
5a00: 20 20 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30      while( r < 0
5a10: 2e 35 2f 5f 36 34 65 31 36 20 26 26 20 65 78 70  .5/_64e16 && exp
5a20: 20 3e 20 2d 31 30 30 39 20 29 7b 20 72 20 2a 3d   > -1009 ){ r *=
5a30: 20 5f 36 34 65 31 36 3b 20 20 65 78 70 20 2d 3d   _64e16;  exp -=
5a40: 20 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65   16; }.    while
5a50: 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 34 20  ( r < 0.5/_64e4 
5a60: 20 26 26 20 65 78 70 20 3e 20 2d 31 30 32 31 20   && exp > -1021 
5a70: 29 7b 20 72 20 2a 3d 20 5f 36 34 65 34 3b 20 20  ){ r *= _64e4;  
5a80: 20 65 78 70 20 2d 3d 20 34 3b 20 7d 0a 20 20 20   exp -= 4; }.   
5a90: 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f   while( r < 0.5/
5aa0: 36 34 2e 30 20 20 20 26 26 20 65 78 70 20 3e 20  64.0   && exp > 
5ab0: 2d 31 30 32 34 20 29 7b 20 72 20 2a 3d 20 36 34  -1024 ){ r *= 64
5ac0: 2e 30 3b 20 20 20 20 65 78 70 20 2d 3d 20 31 3b  .0;    exp -= 1;
5ad0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72   }.  }else if( r
5ae0: 3e 3d 30 2e 35 20 29 7b 0a 20 20 20 20 77 68 69  >=0.5 ){.    whi
5af0: 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34  le( r >= 0.5*_64
5b00: 65 36 33 20 26 26 20 65 78 70 20 3c 20 39 36 30  e63 && exp < 960
5b10: 20 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36    ){ r *= 1.0/_6
5b20: 34 65 36 34 3b 20 65 78 70 20 2b 3d 20 36 34 3b  4e64; exp += 64;
5b30: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20   }.    while( r 
5b40: 3e 3d 20 30 2e 35 2a 5f 36 34 65 31 35 20 26 26  >= 0.5*_64e15 &&
5b50: 20 65 78 70 20 3c 20 31 30 30 38 20 29 7b 20 72   exp < 1008 ){ r
5b60: 20 2a 3d 20 31 2e 30 2f 5f 36 34 65 31 36 3b 20   *= 1.0/_64e16; 
5b70: 65 78 70 20 2b 3d 20 31 36 3b 20 7d 0a 20 20 20  exp += 16; }.   
5b80: 20 77 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35   while( r >= 0.5
5b90: 2a 5f 36 34 65 33 20 20 26 26 20 65 78 70 20 3c  *_64e3  && exp <
5ba0: 20 31 30 32 30 20 29 7b 20 72 20 2a 3d 20 31 2e   1020 ){ r *= 1.
5bb0: 30 2f 5f 36 34 65 34 3b 20 20 65 78 70 20 2b 3d  0/_64e4;  exp +=
5bc0: 20 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28   4; }.    while(
5bd0: 20 72 20 3e 3d 20 30 2e 35 20 20 20 20 20 20 20   r >= 0.5       
5be0: 20 26 26 20 65 78 70 20 3c 20 31 30 32 33 20 29   && exp < 1023 )
5bf0: 7b 20 72 20 2a 3d 20 31 2e 30 2f 36 34 2e 30 3b  { r *= 1.0/64.0;
5c00: 20 20 20 65 78 70 20 2b 3d 20 31 3b 20 7d 0a 20     exp += 1; }. 
5c10: 20 7d 0a 20 20 69 66 28 20 6e 65 67 20 29 7b 0a   }.  if( neg ){.
5c20: 20 20 20 20 65 78 70 20 3d 20 2d 65 78 70 3b 0a      exp = -exp;.
5c30: 20 20 20 20 72 20 3d 20 2d 72 3b 0a 20 20 7d 0a      r = -r;.  }.
5c40: 20 20 65 78 70 20 2b 3d 20 31 30 32 34 3b 0a 20    exp += 1024;. 
5c50: 20 72 20 2b 3d 20 30 2e 35 3b 0a 20 20 69 66 28   r += 0.5;.  if(
5c60: 20 65 78 70 3c 30 20 29 20 72 65 74 75 72 6e 3b   exp<0 ) return;
5c70: 0a 20 20 69 66 28 20 65 78 70 3e 3d 32 30 34 38  .  if( exp>=2048
5c80: 20 7c 7c 20 72 3e 3d 31 2e 30 20 29 7b 0a 20 20   || r>=1.0 ){.  
5c90: 20 20 73 74 72 63 70 79 28 7a 2c 20 22 7e 7e 7e    strcpy(z, "~~~
5ca0: 7e 7e 7e 7e 7e 7e 7e 7e 7e 22 29 3b 0a 20 20 20  ~~~~~~~~~");.   
5cb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a   return;.  }.  *
5cc0: 7a 2b 2b 20 3d 20 7a 44 69 67 69 74 5b 28 65 78  z++ = zDigit[(ex
5cd0: 70 3e 3e 36 29 26 30 78 33 66 5d 3b 0a 20 20 2a  p>>6)&0x3f];.  *
5ce0: 7a 2b 2b 20 3d 20 7a 44 69 67 69 74 5b 65 78 70  z++ = zDigit[exp
5cf0: 20 26 20 30 78 33 66 5d 3b 0a 20 20 77 68 69 6c   & 0x3f];.  whil
5d00: 65 28 20 72 3e 30 2e 30 20 26 26 20 63 6e 74 3c  e( r>0.0 && cnt<
5d10: 31 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69  10 ){.    int di
5d20: 67 69 74 3b 0a 20 20 20 20 72 20 2a 3d 20 36 34  git;.    r *= 64
5d30: 2e 30 3b 0a 20 20 20 20 64 69 67 69 74 20 3d 20  .0;.    digit = 
5d40: 28 69 6e 74 29 72 3b 0a 20 20 20 20 61 73 73 65  (int)r;.    asse
5d50: 72 74 28 20 64 69 67 69 74 3e 3d 30 20 26 26 20  rt( digit>=0 && 
5d60: 64 69 67 69 74 3c 36 34 20 29 3b 0a 20 20 20 20  digit<64 );.    
5d70: 2a 7a 2b 2b 20 3d 20 7a 44 69 67 69 74 5b 64 69  *z++ = zDigit[di
5d80: 67 69 74 20 26 20 30 78 33 66 5d 3b 0a 20 20 20  git & 0x3f];.   
5d90: 20 72 20 2d 3d 20 64 69 67 69 74 3b 0a 20 20 20   r -= digit;.   
5da0: 20 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 7a   cnt++;.  }.  *z
5db0: 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = 0;.}..#ifdef 
5dc0: 53 51 4c 49 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a  SQLITE_UTF8./*.*
5dd0: 2a 20 58 20 69 73 20 61 20 70 6f 69 6e 74 65 72  * X is a pointer
5de0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
5df0: 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63 68  te of a UTF-8 ch
5e00: 61 72 61 63 74 65 72 2e 20 20 49 6e 63 72 65 6d  aracter.  Increm
5e10: 65 6e 74 0a 2a 2a 20 58 20 73 6f 20 74 68 61 74  ent.** X so that
5e20: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
5e30: 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72  e next character
5e40: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
5e50: 6b 73 20 72 69 67 68 74 0a 2a 2a 20 69 66 20 58  ks right.** if X
5e60: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 65 6c   points to a wel
5e70: 6c 2d 66 6f 72 6d 65 64 20 55 54 46 2d 38 20 73  l-formed UTF-8 s
5e80: 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tring..*/.#defin
5e90: 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72  e sqliteNextChar
5ea0: 28 58 29 20 20 77 68 69 6c 65 28 20 28 30 78 63  (X)  while( (0xc
5eb0: 30 26 2a 2b 2b 28 58 29 29 3d 3d 30 78 38 30 20  0&*++(X))==0x80 
5ec0: 29 7b 7d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  ){}.#define sqli
5ed0: 74 65 43 68 61 72 56 61 6c 28 58 29 20 20 20 73  teCharVal(X)   s
5ee0: 71 6c 69 74 65 5f 75 74 66 38 5f 74 6f 5f 69 6e  qlite_utf8_to_in
5ef0: 74 28 58 29 0a 0a 23 65 6c 73 65 20 2f 2a 20 21  t(X)..#else /* !
5f00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
5f10: 54 46 38 29 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 6f  TF8) */./*.** Fo
5f20: 72 20 69 73 6f 38 38 35 39 20 65 6e 63 6f 64 69  r iso8859 encodi
5f30: 6e 67 2c 20 74 68 65 20 6e 65 78 74 20 63 68 61  ng, the next cha
5f40: 72 61 63 74 65 72 20 69 73 20 6a 75 73 74 20 74  racter is just t
5f50: 68 65 20 6e 65 78 74 20 62 79 74 65 2e 0a 2a 2f  he next byte..*/
5f60: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 4e  .#define sqliteN
5f70: 65 78 74 43 68 61 72 28 58 29 20 20 28 2b 2b 28  extChar(X)  (++(
5f80: 58 29 29 3b 0a 23 64 65 66 69 6e 65 20 73 71 6c  X));.#define sql
5f90: 69 74 65 43 68 61 72 56 61 6c 28 58 29 20 20 20  iteCharVal(X)   
5fa0: 28 28 69 6e 74 29 2a 28 58 29 29 0a 0a 23 65 6e  ((int)*(X))..#en
5fb0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
5fc0: 51 4c 49 54 45 5f 55 54 46 38 29 20 2a 2f 0a 0a  QLITE_UTF8) */..
5fd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
5fe0: 54 46 38 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  TF8./*.** Conver
5ff0: 74 20 74 68 65 20 55 54 46 2d 38 20 63 68 61 72  t the UTF-8 char
6000: 61 63 74 65 72 20 74 6f 20 77 68 69 63 68 20 7a  acter to which z
6010: 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 33   points into a 3
6020: 31 2d 62 69 74 0a 2a 2a 20 55 43 53 20 63 68 61  1-bit.** UCS cha
6030: 72 61 63 74 65 72 2e 20 20 54 68 69 73 20 6f 6e  racter.  This on
6040: 6c 79 20 77 6f 72 6b 73 20 72 69 67 68 74 20 69  ly works right i
6050: 66 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  f z points to a 
6060: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55  well-formed.** U
6070: 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  TF-8 string..*/.
6080: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
6090: 65 5f 75 74 66 38 5f 74 6f 5f 69 6e 74 28 63 6f  e_utf8_to_int(co
60a0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
60b0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  r *z){.  int c;.
60c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
60d0: 6e 74 20 69 6e 69 74 56 61 6c 5b 5d 20 3d 20 7b  nt initVal[] = {
60e0: 0a 20 20 20 20 20 20 30 2c 20 20 20 31 2c 20 20  .      0,   1,  
60f0: 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20 20 20   2,   3,   4,   
6100: 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20 38  5,   6,   7,   8
6110: 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31 31 2c  ,   9,  10,  11,
6120: 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34 2c 0a    12,  13,  14,.
6130: 20 20 20 20 20 31 35 2c 20 20 31 36 2c 20 20 31       15,  16,  1
6140: 37 2c 20 20 31 38 2c 20 20 31 39 2c 20 20 32 30  7,  18,  19,  20
6150: 2c 20 20 32 31 2c 20 20 32 32 2c 20 20 32 33 2c  ,  21,  22,  23,
6160: 20 20 32 34 2c 20 20 32 35 2c 20 20 32 36 2c 20    24,  25,  26, 
6170: 20 32 37 2c 20 20 32 38 2c 20 20 32 39 2c 0a 20   27,  28,  29,. 
6180: 20 20 20 20 33 30 2c 20 20 33 31 2c 20 20 33 32      30,  31,  32
6190: 2c 20 20 33 33 2c 20 20 33 34 2c 20 20 33 35 2c  ,  33,  34,  35,
61a0: 20 20 33 36 2c 20 20 33 37 2c 20 20 33 38 2c 20    36,  37,  38, 
61b0: 20 33 39 2c 20 20 34 30 2c 20 20 34 31 2c 20 20   39,  40,  41,  
61c0: 34 32 2c 20 20 34 33 2c 20 20 34 34 2c 0a 20 20  42,  43,  44,.  
61d0: 20 20 20 34 35 2c 20 20 34 36 2c 20 20 34 37 2c     45,  46,  47,
61e0: 20 20 34 38 2c 20 20 34 39 2c 20 20 35 30 2c 20    48,  49,  50, 
61f0: 20 35 31 2c 20 20 35 32 2c 20 20 35 33 2c 20 20   51,  52,  53,  
6200: 35 34 2c 20 20 35 35 2c 20 20 35 36 2c 20 20 35  54,  55,  56,  5
6210: 37 2c 20 20 35 38 2c 20 20 35 39 2c 0a 20 20 20  7,  58,  59,.   
6220: 20 20 36 30 2c 20 20 36 31 2c 20 20 36 32 2c 20    60,  61,  62, 
6230: 20 36 33 2c 20 20 36 34 2c 20 20 36 35 2c 20 20   63,  64,  65,  
6240: 36 36 2c 20 20 36 37 2c 20 20 36 38 2c 20 20 36  66,  67,  68,  6
6250: 39 2c 20 20 37 30 2c 20 20 37 31 2c 20 20 37 32  9,  70,  71,  72
6260: 2c 20 20 37 33 2c 20 20 37 34 2c 0a 20 20 20 20  ,  73,  74,.    
6270: 20 37 35 2c 20 20 37 36 2c 20 20 37 37 2c 20 20   75,  76,  77,  
6280: 37 38 2c 20 20 37 39 2c 20 20 38 30 2c 20 20 38  78,  79,  80,  8
6290: 31 2c 20 20 38 32 2c 20 20 38 33 2c 20 20 38 34  1,  82,  83,  84
62a0: 2c 20 20 38 35 2c 20 20 38 36 2c 20 20 38 37 2c  ,  85,  86,  87,
62b0: 20 20 38 38 2c 20 20 38 39 2c 0a 20 20 20 20 20    88,  89,.     
62c0: 39 30 2c 20 20 39 31 2c 20 20 39 32 2c 20 20 39  90,  91,  92,  9
62d0: 33 2c 20 20 39 34 2c 20 20 39 35 2c 20 20 39 36  3,  94,  95,  96
62e0: 2c 20 20 39 37 2c 20 20 39 38 2c 20 20 39 39 2c  ,  97,  98,  99,
62f0: 20 31 30 30 2c 20 31 30 31 2c 20 31 30 32 2c 20   100, 101, 102, 
6300: 31 30 33 2c 20 31 30 34 2c 0a 20 20 20 20 31 30  103, 104,.    10
6310: 35 2c 20 31 30 36 2c 20 31 30 37 2c 20 31 30 38  5, 106, 107, 108
6320: 2c 20 31 30 39 2c 20 31 31 30 2c 20 31 31 31 2c  , 109, 110, 111,
6330: 20 31 31 32 2c 20 31 31 33 2c 20 31 31 34 2c 20   112, 113, 114, 
6340: 31 31 35 2c 20 31 31 36 2c 20 31 31 37 2c 20 31  115, 116, 117, 1
6350: 31 38 2c 20 31 31 39 2c 0a 20 20 20 20 31 32 30  18, 119,.    120
6360: 2c 20 31 32 31 2c 20 31 32 32 2c 20 31 32 33 2c  , 121, 122, 123,
6370: 20 31 32 34 2c 20 31 32 35 2c 20 31 32 36 2c 20   124, 125, 126, 
6380: 31 32 37 2c 20 31 32 38 2c 20 31 32 39 2c 20 31  127, 128, 129, 1
6390: 33 30 2c 20 31 33 31 2c 20 31 33 32 2c 20 31 33  30, 131, 132, 13
63a0: 33 2c 20 31 33 34 2c 0a 20 20 20 20 31 33 35 2c  3, 134,.    135,
63b0: 20 31 33 36 2c 20 31 33 37 2c 20 31 33 38 2c 20   136, 137, 138, 
63c0: 31 33 39 2c 20 31 34 30 2c 20 31 34 31 2c 20 31  139, 140, 141, 1
63d0: 34 32 2c 20 31 34 33 2c 20 31 34 34 2c 20 31 34  42, 143, 144, 14
63e0: 35 2c 20 31 34 36 2c 20 31 34 37 2c 20 31 34 38  5, 146, 147, 148
63f0: 2c 20 31 34 39 2c 0a 20 20 20 20 31 35 30 2c 20  , 149,.    150, 
6400: 31 35 31 2c 20 31 35 32 2c 20 31 35 33 2c 20 31  151, 152, 153, 1
6410: 35 34 2c 20 31 35 35 2c 20 31 35 36 2c 20 31 35  54, 155, 156, 15
6420: 37 2c 20 31 35 38 2c 20 31 35 39 2c 20 31 36 30  7, 158, 159, 160
6430: 2c 20 31 36 31 2c 20 31 36 32 2c 20 31 36 33 2c  , 161, 162, 163,
6440: 20 31 36 34 2c 0a 20 20 20 20 31 36 35 2c 20 31   164,.    165, 1
6450: 36 36 2c 20 31 36 37 2c 20 31 36 38 2c 20 31 36  66, 167, 168, 16
6460: 39 2c 20 31 37 30 2c 20 31 37 31 2c 20 31 37 32  9, 170, 171, 172
6470: 2c 20 31 37 33 2c 20 31 37 34 2c 20 31 37 35 2c  , 173, 174, 175,
6480: 20 31 37 36 2c 20 31 37 37 2c 20 31 37 38 2c 20   176, 177, 178, 
6490: 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 20 31 38  179,.    180, 18
64a0: 31 2c 20 31 38 32 2c 20 31 38 33 2c 20 31 38 34  1, 182, 183, 184
64b0: 2c 20 31 38 35 2c 20 31 38 36 2c 20 31 38 37 2c  , 185, 186, 187,
64c0: 20 31 38 38 2c 20 31 38 39 2c 20 31 39 30 2c 20   188, 189, 190, 
64d0: 31 39 31 2c 20 20 20 30 2c 20 20 20 31 2c 20 20  191,   0,   1,  
64e0: 20 32 2c 0a 20 20 20 20 20 20 33 2c 20 20 20 34   2,.      3,   4
64f0: 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c  ,   5,   6,   7,
6500: 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30 2c 20     8,   9,  10, 
6510: 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c 20 20   11,  12,  13,  
6520: 31 34 2c 20 20 31 35 2c 20 20 31 36 2c 20 20 31  14,  15,  16,  1
6530: 37 2c 0a 20 20 20 20 20 31 38 2c 20 20 31 39 2c  7,.     18,  19,
6540: 20 20 32 30 2c 20 20 32 31 2c 20 20 32 32 2c 20    20,  21,  22, 
6550: 20 32 33 2c 20 20 32 34 2c 20 20 32 35 2c 20 20   23,  24,  25,  
6560: 32 36 2c 20 20 32 37 2c 20 20 32 38 2c 20 20 32  26,  27,  28,  2
6570: 39 2c 20 20 33 30 2c 20 20 33 31 2c 20 20 20 30  9,  30,  31,   0
6580: 2c 0a 20 20 20 20 20 20 31 2c 20 20 20 32 2c 20  ,.      1,   2, 
6590: 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20    3,   4,   5,  
65a0: 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20   6,   7,   8,   
65b0: 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32  9,  10,  11,  12
65c0: 2c 20 20 31 33 2c 20 20 31 34 2c 20 20 31 35 2c  ,  13,  14,  15,
65d0: 0a 20 20 20 20 20 20 30 2c 20 20 20 31 2c 20 20  .      0,   1,  
65e0: 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20 20 20   2,   3,   4,   
65f0: 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20 30  5,   6,   7,   0
6600: 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c  ,   1,   2,   3,
6610: 20 20 20 30 2c 20 20 20 31 2c 20 32 35 34 2c 0a     0,   1, 254,.
6620: 20 20 20 20 32 35 35 2c 0a 20 20 7d 3b 0a 20 20      255,.  };.  
6630: 63 20 3d 20 69 6e 69 74 56 61 6c 5b 2a 28 7a 2b  c = initVal[*(z+
6640: 2b 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 30  +)];.  while( (0
6650: 78 63 30 26 2a 7a 29 3d 3d 30 78 38 30 20 29 7b  xc0&*z)==0x80 ){
6660: 0a 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20  .    c = (c<<6) 
6670: 7c 20 28 30 78 33 66 26 2a 28 7a 2b 2b 29 29 3b  | (0x3f&*(z++));
6680: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
6690: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
66a0: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46   Compare two UTF
66b0: 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65  -8 strings for e
66c0: 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74 68  quality where th
66d0: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 63  e first string c
66e0: 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  an.** potentiall
66f0: 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78  y be a "glob" ex
6700: 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72  pression.  Retur
6710: 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  n true (1) if th
6720: 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  ey.** are the sa
6730: 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29  me and false (0)
6740: 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69 66   if they are dif
6750: 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c  ferent..**.** Gl
6760: 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
6770: 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
6780: 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
6790: 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
67a0: 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
67b0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
67c0: 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
67d0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
67e0: 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
67f0: 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
6800: 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
6810: 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
6820: 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
6840: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
6850: 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
6860: 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
6870: 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
6880: 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
6890: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b  **.** With the [
68a0: 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20  ...] and [^...] 
68b0: 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20  matching, a ']' 
68c0: 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62 65  character can be
68d0: 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20   included.** in 
68e0: 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69  the list by maki
68f0: 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74 20  ng it the first 
6900: 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20  character after 
6910: 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a  '[' or '^'.  A.*
6920: 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61  * range of chara
6930: 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70 65  cters can be spe
6940: 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27  cified using '-'
6950: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22  .  Example:.** "
6960: 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61  [a-z]" matches a
6970: 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d  ny single lower-
6980: 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f  case letter.  To
6990: 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61   match a '-', ma
69a0: 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73  ke.** it the las
69b0: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  t character in t
69c0: 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  he list..**.** T
69d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
69e0: 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75  sually quick, bu
69f0: 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e  t can be N**2 in
6a00: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
6a10: 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f  .**.** Hints: to
6a20: 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f   match '*' or '?
6a30: 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22  ', put them in "
6a40: 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  []".  Like this:
6a50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  .**.**         a
6a60: 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20  bc[*]xyz        
6a70: 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a  Matches "abc*xyz
6a80: 22 20 6f 6e 6c 79 0a 2a 2f 0a 69 6e 74 20 0a 73  " only.*/.int .s
6a90: 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61 72 65  qliteGlobCompare
6aa0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
6ab0: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20  char *zPattern, 
6ac0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6ad0: 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20  har *zString){. 
6ae0: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b   register int c;
6af0: 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20  .  int invert;. 
6b00: 20 69 6e 74 20 73 65 65 6e 3b 0a 20 20 69 6e 74   int seen;.  int
6b10: 20 63 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28   c2;..  while( (
6b20: 63 20 3d 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d  c = *zPattern)!=
6b30: 30 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  0 ){.    switch(
6b40: 20 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65   c ){.      case
6b50: 20 27 2a 27 3a 0a 20 20 20 20 20 20 20 20 77 68   '*':.        wh
6b60: 69 6c 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e  ile( (c=zPattern
6b70: 5b 31 5d 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63  [1]) == '*' || c
6b80: 20 3d 3d 20 27 3f 27 20 29 7b 0a 20 20 20 20 20   == '?' ){.     
6b90: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20       if( c=='?' 
6ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6bb0: 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29  f( *zString==0 )
6bc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6bd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78         sqliteNex
6be0: 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a  tChar(zString);.
6bf0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6c00: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
6c10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6c20: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
6c30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
6c40: 20 63 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65   c = UpperToLowe
6c50: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  r[c];.        if
6c60: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
6c70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
6c80: 74 72 69 6e 67 20 26 26 20 73 71 6c 69 74 65 47  tring && sqliteG
6c90: 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50 61 74  lobCompare(&zPat
6ca0: 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29  tern[1],zString)
6cb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6cc0: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
6cd0: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
6ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6cf0: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
6d00: 67 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  g!=0;.        }e
6d10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
6d20: 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 7a 53 74  hile( (c2 = *zSt
6d30: 72 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ring)!=0 ){.    
6d40: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
6d50: 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  2 != 0 && c2 != 
6d60: 63 20 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53 74  c ){ c2 = *++zSt
6d70: 72 69 6e 67 3b 20 7d 0a 20 20 20 20 20 20 20 20  ring; }.        
6d80: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
6d90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6da0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6db0: 47 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50 61  GlobCompare(&zPa
6dc0: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
6dd0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
6de0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6df0: 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67  NextChar(zString
6e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
6e10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6e20: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6e30: 20 20 20 63 61 73 65 20 27 3f 27 3a 20 7b 0a 20     case '?': {. 
6e40: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72         if( *zStr
6e50: 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ing==0 ) return 
6e60: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
6e70: 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e  eNextChar(zStrin
6e80: 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 61 74  g);.        zPat
6e90: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tern++;.        
6ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6eb0: 20 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20 7b       case '[': {
6ec0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 69  .        int pri
6ed0: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
6ee0: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
6ef0: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
6f00: 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
6f10: 74 65 43 68 61 72 56 61 6c 28 7a 53 74 72 69 6e  teCharVal(zStrin
6f20: 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
6f30: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
6f40: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 2b  .        c2 = *+
6f50: 2b 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20  +zPattern;.     
6f60: 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29     if( c2=='^' )
6f70: 7b 20 69 6e 76 65 72 74 20 3d 20 31 3b 20 63 32  { invert = 1; c2
6f80: 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 20   = *++zPattern; 
6f90: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
6fa0: 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
6fb0: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
6fc0: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
6fd0: 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74      c2 = *++zPat
6fe0: 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tern;.        }.
6ff0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
7000: 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56  c2 = sqliteCharV
7010: 61 6c 28 7a 50 61 74 74 65 72 6e 29 29 21 3d 30  al(zPattern))!=0
7020: 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
7030: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d           if( c2=
7040: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
7050: 5b 31 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [1]!=']' && zPat
7060: 74 65 72 6e 5b 31 5d 21 3d 30 20 26 26 20 70 72  tern[1]!=0 && pr
7070: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
7080: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
7090: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
70a0: 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56 61  2 = sqliteCharVa
70b0: 6c 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  l(zPattern);.   
70c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
70d0: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
70e0: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
70f0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
7100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7110: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 63 32 20  }else if( c==c2 
7120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
7130: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
7140: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
7150: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  2;.          }el
7160: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7170: 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
7180: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7190: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
71a0: 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ar(zPattern);.  
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71c0: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
71d0: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
71e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
71f0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
7200: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
7210: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
7220: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
7240: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7250: 20 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72 69   if( c != *zStri
7260: 6e 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ng ) return 0;. 
7270: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
7280: 2b 3b 0a 20 20 20 20 20 20 20 20 7a 53 74 72 69  +;.        zStri
7290: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  ng++;.        br
72a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
72b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
72c0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a  *zString==0;.}..
72d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
72e0: 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20  o UTF-8 strings 
72f0: 66 6f 72 20 65 71 75 61 6c 69 74 79 20 75 73 69  for equality usi
7300: 6e 67 20 74 68 65 20 22 4c 49 4b 45 22 20 6f 70  ng the "LIKE" op
7310: 65 72 61 74 6f 72 20 6f 66 0a 2a 2a 20 53 51 4c  erator of.** SQL
7320: 2e 20 20 54 68 65 20 27 25 27 20 63 68 61 72 61  .  The '%' chara
7330: 63 74 65 72 20 6d 61 74 63 68 65 73 20 61 6e 79  cter matches any
7340: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 30 20 6f   sequence of 0 o
7350: 72 20 6d 6f 72 65 0a 2a 2a 20 63 68 61 72 61 63  r more.** charac
7360: 74 65 72 73 20 61 6e 64 20 27 5f 27 20 6d 61 74  ters and '_' mat
7370: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
7380: 63 68 61 72 61 63 74 65 72 2e 20 20 43 61 73 65  character.  Case
7390: 20 69 73 0a 2a 2a 20 6e 6f 74 20 73 69 67 6e 69   is.** not signi
73a0: 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ficant..**.** Th
73b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
73c0: 73 74 20 61 6e 20 61 64 61 70 74 61 74 69 6f 6e  st an adaptation
73d0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 47 6c   of the sqliteGl
73e0: 6f 62 43 6f 6d 70 61 72 65 28 29 0a 2a 2a 20 72  obCompare().** r
73f0: 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 0a 2a 2f  outine above..*/
7400: 0a 69 6e 74 20 0a 73 71 6c 69 74 65 4c 69 6b 65  .int .sqliteLike
7410: 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75 6e  Compare(const un
7420: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61  signed char *zPa
7430: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73  ttern, const uns
7440: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72  igned char *zStr
7450: 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65 72  ing){.  register
7460: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 32   int c;.  int c2
7470: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
7480: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a   UpperToLower[*z
7490: 50 61 74 74 65 72 6e 5d 29 21 3d 30 20 29 7b 0a  Pattern])!=0 ){.
74a0: 20 20 20 20 73 77 69 74 63 68 28 20 63 20 29 7b      switch( c ){
74b0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 25 27 3a  .      case '%':
74c0: 20 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   {.        while
74d0: 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d  ( (c=zPattern[1]
74e0: 29 20 3d 3d 20 27 25 27 20 7c 7c 20 63 20 3d 3d  ) == '%' || c ==
74f0: 20 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 20 20   '_' ){.        
7500: 20 20 69 66 28 20 63 3d 3d 27 5f 27 20 29 7b 0a    if( c=='_' ){.
7510: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7520: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
7530: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
7540: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
7550: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
7560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7570: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
7580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7590: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
75a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 63 20  rn 1;.        c 
75b0: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  = UpperToLower[c
75c0: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
75d0: 28 20 28 63 32 3d 55 70 70 65 72 54 6f 4c 6f 77  ( (c2=UpperToLow
75e0: 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 29 21 3d 30  er[*zString])!=0
75f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
7600: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
7610: 63 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20  c2 != c ){ c2 = 
7620: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b  UpperToLower[*++
7630: 7a 53 74 72 69 6e 67 5d 3b 20 7d 0a 20 20 20 20  zString]; }.    
7640: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
7650: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7660: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7670: 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50 61  LikeCompare(&zPa
7680: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
7690: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
76a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
76b0: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
76c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
76d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
76e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
76f0: 27 5f 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  '_': {.        i
7700: 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29  f( *zString==0 )
7710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
7720: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
7730: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
7740: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
7750: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
7770: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7780: 69 66 28 20 63 20 21 3d 20 55 70 70 65 72 54 6f  if( c != UpperTo
7790: 4c 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20  Lower[*zString] 
77a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
77b0: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
77c0: 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b          zString+
77d0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
77e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
77f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
7800: 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  tring==0;.}../*.
7810: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
7820: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  ic string that d
7830: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
7840: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
7850: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
7860: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
7870: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 65  t char *sqlite_e
7880: 72 72 6f 72 5f 73 74 72 69 6e 67 28 69 6e 74 20  rror_string(int 
7890: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
78a0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
78b0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
78c0: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
78d0: 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72    z = "not an er
78e0: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7900: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7910: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
7920: 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63    z = "SQL logic
7930: 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e   error or missin
7940: 67 20 64 61 74 61 62 61 73 65 22 3b 20 20 20 62  g database";   b
7950: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7960: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20  QLITE_INTERNAL: 
7970: 20 20 7a 20 3d 20 22 69 6e 74 65 72 6e 61 6c 20    z = "internal 
7980: 53 51 4c 69 74 65 20 69 6d 70 6c 65 6d 65 6e 74  SQLite implement
7990: 61 74 69 6f 6e 20 66 6c 61 77 22 3b 20 20 20 62  ation flaw";   b
79a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
79b0: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
79c0: 20 20 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65    z = "access pe
79d0: 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22  rmission denied"
79e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
79f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7a00: 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20  QLITE_ABORT:    
7a10: 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20    z = "callback 
7a20: 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20  requested query 
7a30: 61 62 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62  abort";        b
7a40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7a50: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
7a60: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7a70: 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20  is locked";     
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7a90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7aa0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
7ab0: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7ac0: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
7ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
7ae0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7af0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
7b00: 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65    z = "out of me
7b10: 6d 6f 72 79 22 3b 20 20 20 20 20 20 20 20 20 20  mory";          
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7b30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7b40: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
7b50: 20 20 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74    z = "attempt t
7b60: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
7b70: 6c 79 20 64 61 74 61 62 61 73 65 22 3b 20 20 62  ly database";  b
7b80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7b90: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
7ba0: 20 20 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74    z = "interrupt
7bb0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7bd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7be0: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
7bf0: 20 20 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20    z = "disk I/O 
7c00: 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20  error";         
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7c20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7c30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
7c40: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7c50: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
7c60: 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62  lformed";      b
7c70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7c80: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
7c90: 20 20 7a 20 3d 20 22 74 61 62 6c 65 20 6f 72 20    z = "table or 
7ca0: 72 65 63 6f 72 64 20 6e 6f 74 20 66 6f 75 6e 64  record not found
7cb0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
7cc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7cd0: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
7ce0: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7cf0: 69 73 20 66 75 6c 6c 22 3b 20 20 20 20 20 20 20  is full";       
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7d10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7d20: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
7d30: 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f    z = "unable to
7d40: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
7d50: 69 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 62  ile";          b
7d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7d70: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
7d80: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7d90: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
7da0: 20 66 61 69 6c 75 72 65 22 3b 20 20 20 20 20 62   failure";     b
7db0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7dc0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
7dd0: 20 20 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e    z = "table con
7de0: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20  tains no data"; 
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7e00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7e10: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
7e20: 20 20 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20    z = "database 
7e30: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
7e40: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  ed";           b
7e50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7e60: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
7e70: 20 20 7a 20 3d 20 22 74 6f 6f 20 6d 75 63 68 20    z = "too much 
7e80: 64 61 74 61 20 66 6f 72 20 6f 6e 65 20 74 61 62  data for one tab
7e90: 6c 65 20 72 6f 77 22 3b 20 20 20 20 20 20 20 62  le row";       b
7ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7eb0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
7ec0: 3a 20 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e  : z = "constrain
7ed0: 74 20 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20  t failed";      
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7f00: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
7f10: 20 20 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20    z = "datatype 
7f20: 6d 69 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20  mismatch";      
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7f40: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
7f50: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
7f60: 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65    z = "unknown e
7f70: 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20  rror";          
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7f90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
7fa0: 72 6e 20 7a 3b 0a 7d 0a                          rn z;.}.