/ Hex Artifact Content
Login

Artifact b2287b07ddf55ef7aaa8888a9473123995a69f40:


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 37  Id: util.c,v 1.7
0220: 35 20 32 30 30 34 2f 30 34 2f 32 36 20 31 34 3a  5 2004/04/26 14:
0230: 31 30 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a  10:22 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 23 69 66 20 4d 45 4d  calls */.#if MEM
0500: 4f 52 59 5f 44 45 42 55 47 3e 31 0a 73 74 61 74  ORY_DEBUG>1.stat
0510: 69 63 20 69 6e 74 20 6d 65 6d 63 6e 74 20 3d 20  ic int memcnt = 
0520: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
0530: 20 4e 75 6d 62 65 72 20 6f 66 20 33 32 2d 62 69   Number of 32-bi
0540: 74 20 67 75 61 72 64 20 77 6f 72 64 73 0a 2a 2f  t guard words.*/
0550: 0a 23 64 65 66 69 6e 65 20 4e 5f 47 55 41 52 44  .#define N_GUARD
0560: 20 31 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61   1../*.** Alloca
0570: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6e  te new memory an
0580: 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  d set it to zero
0590: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
05a0: 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69  f.** no memory i
05b0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
05c0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c  void *sqliteMall
05d0: 6f 63 5f 28 69 6e 74 20 6e 2c 20 69 6e 74 20 62  oc_(int n, int b
05e0: 5a 65 72 6f 2c 20 63 68 61 72 20 2a 7a 46 69 6c  Zero, char *zFil
05f0: 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20  e, int line){.  
0600: 76 6f 69 64 20 2a 70 3b 0a 20 20 69 6e 74 20 2a  void *p;.  int *
0610: 70 69 3b 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a  pi;.  int i, k;.
0620: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 69 4d 61    if( sqlite_iMa
0630: 6c 6c 6f 63 46 61 69 6c 3e 3d 30 20 29 7b 0a 20  llocFail>=0 ){. 
0640: 20 20 20 73 71 6c 69 74 65 5f 69 4d 61 6c 6c 6f     sqlite_iMallo
0650: 63 46 61 69 6c 2d 2d 3b 0a 20 20 20 20 69 66 28  cFail--;.    if(
0660: 20 73 71 6c 69 74 65 5f 69 4d 61 6c 6c 6f 63 46   sqlite_iMallocF
0670: 61 69 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ail==0 ){.      
0680: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
0690: 69 6c 65 64 2b 2b 3b 0a 23 69 66 20 4d 45 4d 4f  iled++;.#if MEMO
06a0: 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 20 20 20  RY_DEBUG>1.     
06b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
06c0: 22 2a 2a 2a 2a 20 66 61 69 6c 65 64 20 74 6f 20  "**** failed to 
06d0: 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74 65  allocate %d byte
06e0: 73 20 61 74 20 25 73 3a 25 64 5c 6e 22 2c 0a 20  s at %s:%d\n",. 
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2c 20               n, 
0700: 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65 6e  zFile,line);.#en
0710: 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
0720: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b 0a  _iMallocFail--;.
0730: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0740: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0750: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
0760: 0a 20 20 6b 20 3d 20 28 6e 2b 73 69 7a 65 6f 66  .  k = (n+sizeof
0770: 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f 66 28  (int)-1)/sizeof(
0780: 69 6e 74 29 3b 0a 20 20 70 69 20 3d 20 6d 61 6c  int);.  pi = mal
0790: 6c 6f 63 28 20 28 4e 5f 47 55 41 52 44 2a 32 2b  loc( (N_GUARD*2+
07a0: 31 2b 6b 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29  1+k)*sizeof(int)
07b0: 29 3b 0a 20 20 69 66 28 20 70 69 3d 3d 30 20 29  );.  if( pi==0 )
07c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c  {.    sqlite_mal
07d0: 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20  loc_failed++;.  
07e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
07f0: 20 20 73 71 6c 69 74 65 5f 6e 4d 61 6c 6c 6f 63    sqlite_nMalloc
0800: 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ++;.  for(i=0; i
0810: 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29 20 70  <N_GUARD; i++) p
0820: 69 5b 69 5d 20 3d 20 30 78 64 65 61 64 31 31 32  i[i] = 0xdead112
0830: 32 3b 0a 20 20 70 69 5b 4e 5f 47 55 41 52 44 5d  2;.  pi[N_GUARD]
0840: 20 3d 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = n;.  for(i=0;
0850: 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29   i<N_GUARD; i++)
0860: 20 70 69 5b 6b 2b 31 2b 4e 5f 47 55 41 52 44 2b   pi[k+1+N_GUARD+
0870: 69 5d 20 3d 20 30 78 64 65 61 64 33 33 34 34 3b  i] = 0xdead3344;
0880: 0a 20 20 70 20 3d 20 26 70 69 5b 4e 5f 47 55 41  .  p = &pi[N_GUA
0890: 52 44 2b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  RD+1];.  memset(
08a0: 70 2c 20 62 5a 65 72 6f 3d 3d 30 2c 20 6e 29 3b  p, bZero==0, n);
08b0: 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  .#if MEMORY_DEBU
08c0: 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74  G>1.  fprintf(st
08d0: 64 65 72 72 2c 22 25 30 36 64 20 6d 61 6c 6c 6f  derr,"%06d mallo
08e0: 63 20 25 64 20 62 79 74 65 73 20 61 74 20 30 78  c %d bytes at 0x
08f0: 25 78 20 66 72 6f 6d 20 25 73 3a 25 64 5c 6e 22  %x from %s:%d\n"
0900: 2c 0a 20 20 20 20 20 20 2b 2b 6d 65 6d 63 6e 74  ,.      ++memcnt
0910: 2c 20 6e 2c 20 28 69 6e 74 29 70 2c 20 7a 46 69  , n, (int)p, zFi
0920: 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65 6e 64 69 66  le,line);.#endif
0930: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
0940: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0950: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
0960: 70 6f 69 6e 74 65 72 20 77 61 73 20 6f 62 74 61  pointer was obta
0970: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
0980: 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20  Malloc().** and 
0990: 69 73 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  is able to hold 
09a0: 61 74 20 6c 65 61 73 74 20 4e 20 62 79 74 65 73  at least N bytes
09b0: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
09c0: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
09d0: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
09e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
09f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
0a00: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
0a10: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  s only..*/.void 
0a20: 73 71 6c 69 74 65 43 68 65 63 6b 4d 65 6d 6f 72  sqliteCheckMemor
0a30: 79 28 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 4e  y(void *p, int N
0a40: 29 7b 0a 20 20 69 6e 74 20 2a 70 69 20 3d 20 70  ){.  int *pi = p
0a50: 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6b 3b  ;.  int n, i, k;
0a60: 0a 20 20 70 69 20 2d 3d 20 4e 5f 47 55 41 52 44  .  pi -= N_GUARD
0a70: 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  +1;.  for(i=0; i
0a80: 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a  <N_GUARD; i++){.
0a90: 20 20 20 20 61 73 73 65 72 74 28 20 70 69 5b 69      assert( pi[i
0aa0: 5d 3d 3d 30 78 64 65 61 64 31 31 32 32 20 29 3b  ]==0xdead1122 );
0ab0: 0a 20 20 7d 0a 20 20 6e 20 3d 20 70 69 5b 4e 5f  .  }.  n = pi[N_
0ac0: 47 55 41 52 44 5d 3b 0a 20 20 61 73 73 65 72 74  GUARD];.  assert
0ad0: 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 20 29 3b  ( N>=0 && N<n );
0ae0: 0a 20 20 6b 20 3d 20 28 6e 2b 73 69 7a 65 6f 66  .  k = (n+sizeof
0af0: 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f 66 28  (int)-1)/sizeof(
0b00: 69 6e 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  int);.  for(i=0;
0b10: 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29   i<N_GUARD; i++)
0b20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 69  {.    assert( pi
0b30: 5b 6b 2b 4e 5f 47 55 41 52 44 2b 31 2b 69 5d 3d  [k+N_GUARD+1+i]=
0b40: 3d 30 78 64 65 61 64 33 33 34 34 20 29 3b 0a 20  =0xdead3344 );. 
0b50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
0b60: 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
0b70: 6c 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ly obtained from
0b80: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
0b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 72  */.void sqliteFr
0ba0: 65 65 5f 28 76 6f 69 64 20 2a 70 2c 20 63 68 61  ee_(void *p, cha
0bb0: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69  r *zFile, int li
0bc0: 6e 65 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ne){.  if( p ){.
0bd0: 20 20 20 20 69 6e 74 20 2a 70 69 2c 20 69 2c 20      int *pi, i, 
0be0: 6b 2c 20 6e 3b 0a 20 20 20 20 70 69 20 3d 20 70  k, n;.    pi = p
0bf0: 3b 0a 20 20 20 20 70 69 20 2d 3d 20 4e 5f 47 55  ;.    pi -= N_GU
0c00: 41 52 44 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74  ARD+1;.    sqlit
0c10: 65 5f 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20 66  e_nFree++;.    f
0c20: 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52  or(i=0; i<N_GUAR
0c30: 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  D; i++){.      i
0c40: 66 28 20 70 69 5b 69 5d 21 3d 30 78 64 65 61 64  f( pi[i]!=0xdead
0c50: 31 31 32 32 20 29 7b 0a 20 20 20 20 20 20 20 20  1122 ){.        
0c60: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
0c70: 4c 6f 77 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63  Low-end memory c
0c80: 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25  orruption at 0x%
0c90: 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20  x\n", (int)p);. 
0ca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
0cb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
0cc0: 20 6e 20 3d 20 70 69 5b 4e 5f 47 55 41 52 44 5d   n = pi[N_GUARD]
0cd0: 3b 0a 20 20 20 20 6b 20 3d 20 28 6e 2b 73 69 7a  ;.    k = (n+siz
0ce0: 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65  eof(int)-1)/size
0cf0: 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20 66 6f 72  of(int);.    for
0d00: 28 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b  (i=0; i<N_GUARD;
0d10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
0d20: 20 70 69 5b 6b 2b 4e 5f 47 55 41 52 44 2b 31 2b   pi[k+N_GUARD+1+
0d30: 69 5d 21 3d 30 78 64 65 61 64 33 33 34 34 20 29  i]!=0xdead3344 )
0d40: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0d50: 66 28 73 74 64 65 72 72 2c 22 48 69 67 68 2d 65  f(stderr,"High-e
0d60: 6e 64 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70  nd memory corrup
0d70: 74 69 6f 6e 20 61 74 20 30 78 25 78 5c 6e 22 2c  tion at 0x%x\n",
0d80: 20 28 69 6e 74 29 70 29 3b 0a 20 20 20 20 20 20   (int)p);.      
0d90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
0da0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  }.    }.    mems
0db0: 65 74 28 70 69 2c 20 30 78 66 66 2c 20 28 6b 2b  et(pi, 0xff, (k+
0dc0: 4e 5f 47 55 41 52 44 2a 32 2b 31 29 2a 73 69 7a  N_GUARD*2+1)*siz
0dd0: 65 6f 66 28 69 6e 74 29 29 3b 0a 23 69 66 20 4d  eof(int));.#if M
0de0: 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20  EMORY_DEBUG>1.  
0df0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0e00: 2c 22 25 30 36 64 20 66 72 65 65 20 25 64 20 62  ,"%06d free %d b
0e10: 79 74 65 73 20 61 74 20 30 78 25 78 20 66 72 6f  ytes at 0x%x fro
0e20: 6d 20 25 73 3a 25 64 5c 6e 22 2c 0a 20 20 20 20  m %s:%d\n",.    
0e30: 20 20 20 20 20 2b 2b 6d 65 6d 63 6e 74 2c 20 6e       ++memcnt, n
0e40: 2c 20 28 69 6e 74 29 70 2c 20 7a 46 69 6c 65 2c  , (int)p, zFile,
0e50: 6c 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  line);.#endif.  
0e60: 20 20 66 72 65 65 28 70 69 29 3b 0a 20 20 7d 0a    free(pi);.  }.
0e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
0e80: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
0e90: 6f 6e 2e 20 20 49 66 20 70 3d 3d 30 2c 20 74 68  on.  If p==0, th
0ea0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
0eb0: 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  ** works just li
0ec0: 6b 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ke sqliteMalloc(
0ed0: 29 2e 20 20 49 66 20 6e 3d 3d 30 2c 20 74 68 65  ).  If n==0, the
0ee0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
0ef0: 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  * works just lik
0f00: 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a  e sqliteFree()..
0f10: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 52  */.void *sqliteR
0f20: 65 61 6c 6c 6f 63 5f 28 76 6f 69 64 20 2a 6f 6c  ealloc_(void *ol
0f30: 64 50 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  dP, int n, char 
0f40: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65  *zFile, int line
0f50: 29 7b 0a 20 20 69 6e 74 20 2a 6f 6c 64 50 69 2c  ){.  int *oldPi,
0f60: 20 2a 70 69 2c 20 69 2c 20 6b 2c 20 6f 6c 64 4e   *pi, i, k, oldN
0f70: 2c 20 6f 6c 64 4b 3b 0a 20 20 76 6f 69 64 20 2a  , oldK;.  void *
0f80: 70 3b 0a 20 20 69 66 28 20 6f 6c 64 50 3d 3d 30  p;.  if( oldP==0
0f90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
0fa0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f 28 6e 2c 31  qliteMalloc_(n,1
0fb0: 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 20 20  ,zFile,line);.  
0fc0: 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  }.  if( n==0 ){.
0fd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 5f 28      sqliteFree_(
0fe0: 6f 6c 64 50 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29  oldP,zFile,line)
0ff0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1000: 20 20 7d 0a 20 20 6f 6c 64 50 69 20 3d 20 6f 6c    }.  oldPi = ol
1010: 64 50 3b 0a 20 20 6f 6c 64 50 69 20 2d 3d 20 4e  dP;.  oldPi -= N
1020: 5f 47 55 41 52 44 2b 31 3b 0a 20 20 69 66 28 20  _GUARD+1;.  if( 
1030: 6f 6c 64 50 69 5b 30 5d 21 3d 30 78 64 65 61 64  oldPi[0]!=0xdead
1040: 31 31 32 32 20 29 7b 0a 20 20 20 20 66 70 72 69  1122 ){.    fpri
1050: 6e 74 66 28 73 74 64 65 72 72 2c 22 4c 6f 77 2d  ntf(stderr,"Low-
1060: 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75  end memory corru
1070: 70 74 69 6f 6e 20 69 6e 20 72 65 61 6c 6c 6f 63  ption in realloc
1080: 20 61 74 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e   at 0x%x\n", (in
1090: 74 29 6f 6c 64 50 29 3b 0a 20 20 20 20 72 65 74  t)oldP);.    ret
10a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f 6c 64  urn 0;.  }.  old
10b0: 4e 20 3d 20 6f 6c 64 50 69 5b 4e 5f 47 55 41 52  N = oldPi[N_GUAR
10c0: 44 5d 3b 0a 20 20 6f 6c 64 4b 20 3d 20 28 6f 6c  D];.  oldK = (ol
10d0: 64 4e 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d 31  dN+sizeof(int)-1
10e0: 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  )/sizeof(int);. 
10f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 47 55   for(i=0; i<N_GU
1100: 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ARD; i++){.    i
1110: 66 28 20 6f 6c 64 50 69 5b 6f 6c 64 4b 2b 4e 5f  f( oldPi[oldK+N_
1120: 47 55 41 52 44 2b 31 2b 69 5d 21 3d 30 78 64 65  GUARD+1+i]!=0xde
1130: 61 64 33 33 34 34 20 29 7b 0a 20 20 20 20 20 20  ad3344 ){.      
1140: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1150: 48 69 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79 20  High-end memory 
1160: 63 6f 72 72 75 70 74 69 6f 6e 20 69 6e 20 72 65  corruption in re
1170: 61 6c 6c 6f 63 20 61 74 20 30 78 25 78 5c 6e 22  alloc at 0x%x\n"
1180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1190: 28 69 6e 74 29 6f 6c 64 50 29 3b 0a 20 20 20 20  (int)oldP);.    
11a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11b0: 7d 0a 20 20 7d 0a 20 20 6b 20 3d 20 28 6e 20 2b  }.  }.  k = (n +
11c0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2d 20 31   sizeof(int) - 1
11d0: 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  )/sizeof(int);. 
11e0: 20 70 69 20 3d 20 6d 61 6c 6c 6f 63 28 20 28 6b   pi = malloc( (k
11f0: 2b 4e 5f 47 55 41 52 44 2a 32 2b 31 29 2a 73 69  +N_GUARD*2+1)*si
1200: 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 69  zeof(int) );.  i
1210: 66 28 20 70 69 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pi==0 ){.    
1220: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
1230: 69 6c 65 64 2b 2b 3b 0a 20 20 20 20 72 65 74 75  iled++;.    retu
1240: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
1250: 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20  i=0; i<N_GUARD; 
1260: 69 2b 2b 29 20 70 69 5b 69 5d 20 3d 20 30 78 64  i++) pi[i] = 0xd
1270: 65 61 64 31 31 32 32 3b 0a 20 20 70 69 5b 4e 5f  ead1122;.  pi[N_
1280: 47 55 41 52 44 5d 20 3d 20 6e 3b 0a 20 20 66 6f  GUARD] = n;.  fo
1290: 72 28 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44  r(i=0; i<N_GUARD
12a0: 3b 20 69 2b 2b 29 20 70 69 5b 6b 2b 4e 5f 47 55  ; i++) pi[k+N_GU
12b0: 41 52 44 2b 31 2b 69 5d 20 3d 20 30 78 64 65 61  ARD+1+i] = 0xdea
12c0: 64 33 33 34 34 3b 0a 20 20 70 20 3d 20 26 70 69  d3344;.  p = &pi
12d0: 5b 4e 5f 47 55 41 52 44 2b 31 5d 3b 0a 20 20 6d  [N_GUARD+1];.  m
12e0: 65 6d 63 70 79 28 70 2c 20 6f 6c 64 50 2c 20 6e  emcpy(p, oldP, n
12f0: 3e 6f 6c 64 4e 20 3f 20 6f 6c 64 4e 20 3a 20 6e  >oldN ? oldN : n
1300: 29 3b 0a 20 20 69 66 28 20 6e 3e 6f 6c 64 4e 20  );.  if( n>oldN 
1310: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  ){.    memset(&(
1320: 28 63 68 61 72 2a 29 70 29 5b 6f 6c 64 4e 5d 2c  (char*)p)[oldN],
1330: 20 30 2c 20 6e 2d 6f 6c 64 4e 29 3b 0a 20 20 7d   0, n-oldN);.  }
1340: 0a 20 20 6d 65 6d 73 65 74 28 6f 6c 64 50 69 2c  .  memset(oldPi,
1350: 20 30 78 61 62 2c 20 28 6f 6c 64 4b 2b 4e 5f 47   0xab, (oldK+N_G
1360: 55 41 52 44 2b 32 29 2a 73 69 7a 65 6f 66 28 69  UARD+2)*sizeof(i
1370: 6e 74 29 29 3b 0a 20 20 66 72 65 65 28 6f 6c 64  nt));.  free(old
1380: 50 69 29 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f  Pi);.#if MEMORY_
1390: 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74  DEBUG>1.  fprint
13a0: 66 28 73 74 64 65 72 72 2c 22 25 30 36 64 20 72  f(stderr,"%06d r
13b0: 65 61 6c 6c 6f 63 20 25 64 20 74 6f 20 25 64 20  ealloc %d to %d 
13c0: 62 79 74 65 73 20 61 74 20 30 78 25 78 20 74 6f  bytes at 0x%x to
13d0: 20 30 78 25 78 20 61 74 20 25 73 3a 25 64 5c 6e   0x%x at %s:%d\n
13e0: 22 2c 0a 20 20 20 20 2b 2b 6d 65 6d 63 6e 74 2c  ",.    ++memcnt,
13f0: 20 6f 6c 64 4e 2c 20 6e 2c 20 28 69 6e 74 29 6f   oldN, n, (int)o
1400: 6c 64 50 2c 20 28 69 6e 74 29 70 2c 20 7a 46 69  ldP, (int)p, zFi
1410: 6c 65 2c 20 6c 69 6e 65 29 3b 0a 23 65 6e 64 69  le, line);.#endi
1420: 66 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  f.  return p;.}.
1430: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 64 75  ./*.** Make a du
1440: 70 6c 69 63 61 74 65 20 6f 66 20 61 20 73 74 72  plicate of a str
1450: 69 6e 67 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ing into memory 
1460: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
1470: 6c 6c 6f 63 28 29 0a 2a 2a 20 46 72 65 65 20 74  lloc().** Free t
1480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 72 69  he original stri
1490: 6e 67 20 75 73 69 6e 67 20 73 71 6c 69 74 65 46  ng using sqliteF
14a0: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
14b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14c0: 6c 65 64 20 6f 6e 20 61 6c 6c 20 73 74 72 69 6e  led on all strin
14d0: 67 73 20 74 68 61 74 20 61 72 65 20 70 61 73 73  gs that are pass
14e0: 65 64 20 6f 75 74 73 69 64 65 20 6f 66 0a 2a 2a  ed outside of.**
14f0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
1500: 61 72 79 2e 20 20 54 68 61 74 20 77 61 79 20 63  ary.  That way c
1510: 6c 69 65 6e 74 73 20 63 61 6e 20 66 72 65 65 20  lients can free 
1520: 74 68 65 20 73 74 72 69 6e 67 20 75 73 69 6e 67  the string using
1530: 20 66 72 65 65 28 29 0a 2a 2a 20 72 61 74 68 65   free().** rathe
1540: 72 20 74 68 61 6e 20 68 61 76 69 6e 67 20 74 6f  r than having to
1550: 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65   call sqliteFree
1560: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1570: 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 63 68 61  teStrRealloc(cha
1580: 72 20 2a 2a 70 7a 29 7b 0a 20 20 63 68 61 72 20  r **pz){.  char 
1590: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 7a 3d  *zNew;.  if( pz=
15a0: 3d 30 20 7c 7c 20 2a 70 7a 3d 3d 30 20 29 20 72  =0 || *pz==0 ) r
15b0: 65 74 75 72 6e 3b 0a 20 20 7a 4e 65 77 20 3d 20  eturn;.  zNew = 
15c0: 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 2a  malloc( strlen(*
15d0: 70 7a 29 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  pz) + 1 );.  if(
15e0: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
15f0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
1600: 69 6c 65 64 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  iled++;.    sqli
1610: 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 20  teFree(*pz);.   
1620: 20 2a 70 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pz = 0;.  }.  
1630: 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 2a 70 7a  strcpy(zNew, *pz
1640: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1650: 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 4e  *pz);.  *pz = zN
1660: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  ew;.}../*.** Mak
1670: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74  e a copy of a st
1680: 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ring in memory o
1690: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
16a0: 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 63  iteMalloc().*/.c
16b0: 68 61 72 20 2a 73 71 6c 69 74 65 53 74 72 44 75  har *sqliteStrDu
16c0: 70 5f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p_(const char *z
16d0: 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  , char *zFile, i
16e0: 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72  nt line){.  char
16f0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
1700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1710: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   zNew = sqliteMa
1720: 6c 6c 6f 63 5f 28 73 74 72 6c 65 6e 28 7a 29 2b  lloc_(strlen(z)+
1730: 31 2c 20 30 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e  1, 0, zFile, lin
1740: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29  e);.  if( zNew )
1750: 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29   strcpy(zNew, z)
1760: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b  ;.  return zNew;
1770: 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 53  .}.char *sqliteS
1780: 74 72 4e 44 75 70 5f 28 63 6f 6e 73 74 20 63 68  trNDup_(const ch
1790: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 68  ar *z, int n, ch
17a0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c  ar *zFile, int l
17b0: 69 6e 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ine){.  char *zN
17c0: 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ew;.  if( z==0 )
17d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65   return 0;.  zNe
17e0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
17f0: 5f 28 6e 2b 31 2c 20 30 2c 20 7a 46 69 6c 65 2c  _(n+1, 0, zFile,
1800: 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a 4e   line);.  if( zN
1810: 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ew ){.    memcpy
1820: 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20  (zNew, z, n);.  
1830: 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20    zNew[n] = 0;. 
1840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77   }.  return zNew
1850: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d 45  ;.}.#endif /* ME
1860: 4d 4f 52 59 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  MORY_DEBUG */../
1870: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1880: 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d  ng versions of m
1890: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 66 72 65 65  alloc() and free
18a0: 28 29 20 61 72 65 20 66 6f 72 20 75 73 65 20 69  () are for use i
18b0: 6e 20 61 0a 2a 2a 20 6e 6f 72 6d 61 6c 20 62 75  n a.** normal bu
18c0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
18d0: 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42 55  ined(MEMORY_DEBU
18e0: 47 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  G)../*.** Alloca
18f0: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6e  te new memory an
1900: 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  d set it to zero
1910: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1920: 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69  f.** no memory i
1930: 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 65  s available.  Se
1940: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4d 61 6c  e also sqliteMal
1950: 6c 6f 63 52 61 77 28 29 2e 0a 2a 2f 0a 76 6f 69  locRaw()..*/.voi
1960: 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  d *sqliteMalloc(
1970: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
1980: 70 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 6d 61  p;.  if( (p = ma
1990: 6c 6c 6f 63 28 6e 29 29 3d 3d 30 20 29 7b 0a 20  lloc(n))==0 ){. 
19a0: 20 20 20 69 66 28 20 6e 3e 30 20 29 20 73 71 6c     if( n>0 ) sql
19b0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
19c0: 64 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d++;.  }else{.  
19d0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e    memset(p, 0, n
19e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
1a00: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
1a10: 62 75 74 20 64 6f 20 6e 6f 74 20 73 65 74 20 69  but do not set i
1a20: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 52 65 74 75  t to zero.  Retu
1a30: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 6e 6f  rn NULL if.** no
1a40: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
1a50: 61 62 6c 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  able.  See also 
1a60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
1a70: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d  */.void *sqliteM
1a80: 61 6c 6c 6f 63 52 61 77 28 69 6e 74 20 6e 29 7b  allocRaw(int n){
1a90: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69 66  .  void *p;.  if
1aa0: 28 20 28 70 20 3d 20 6d 61 6c 6c 6f 63 28 6e 29  ( (p = malloc(n)
1ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
1ac0: 6e 3e 30 20 29 20 73 71 6c 69 74 65 5f 6d 61 6c  n>0 ) sqlite_mal
1ad0: 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20  loc_failed++;.  
1ae0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1af0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
1b00: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 62  ry previously ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 76 6f  teMalloc().*/.vo
1b30: 69 64 20 73 71 6c 69 74 65 46 72 65 65 28 76 6f  id sqliteFree(vo
1b40: 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  id *p){.  if( p 
1b50: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 29 3b 0a  ){.    free(p);.
1b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
1b70: 69 7a 65 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f  ize a prior allo
1b80: 63 61 74 69 6f 6e 2e 20 20 49 66 20 70 3d 3d 30  cation.  If p==0
1b90: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1ba0: 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73  ine.** works jus
1bb0: 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 4d 61 6c  t like sqliteMal
1bc0: 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d 3d 30 2c  loc().  If n==0,
1bd0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1be0: 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74  ne.** works just
1bf0: 20 6c 69 6b 65 20 73 71 6c 69 74 65 46 72 65 65   like sqliteFree
1c00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ()..*/.void *sql
1c10: 69 74 65 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  iteRealloc(void 
1c20: 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  *p, int n){.  vo
1c30: 69 64 20 2a 70 32 3b 0a 20 20 69 66 28 20 70 3d  id *p2;.  if( p=
1c40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 29   sqliteMalloc(n)
1c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30  ;.  }.  if( n==0
1c70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1c80: 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1c90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 32 20 3d 20  n 0;.  }.  p2 = 
1ca0: 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20  realloc(p, n);. 
1cb0: 20 69 66 28 20 70 32 3d 3d 30 20 29 7b 0a 20 20   if( p2==0 ){.  
1cc0: 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f    sqlite_malloc_
1cd0: 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 0a 20 20  failed++;.  }.  
1ce0: 72 65 74 75 72 6e 20 70 32 3b 0a 7d 0a 0a 2f 2a  return p2;.}../*
1cf0: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
1d00: 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  of a string in m
1d10: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1d20: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
1d30: 28 29 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  ().*/.char *sqli
1d40: 74 65 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63  teStrDup(const c
1d50: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
1d60: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d  *zNew;.  if( z==
1d70: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d80: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  zNew = sqliteMal
1d90: 6c 6f 63 52 61 77 28 73 74 72 6c 65 6e 28 7a 29  locRaw(strlen(z)
1da0: 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20  +1);.  if( zNew 
1db0: 29 20 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a  ) strcpy(zNew, z
1dc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77  );.  return zNew
1dd0: 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  ;.}.char *sqlite
1de0: 53 74 72 4e 44 75 70 28 63 6f 6e 73 74 20 63 68  StrNDup(const ch
1df0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1e00: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69   char *zNew;.  i
1e10: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1e20: 20 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c   0;.  zNew = sql
1e30: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6e 2b 31  iteMallocRaw(n+1
1e40: 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b  );.  if( zNew ){
1e50: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77  .    memcpy(zNew
1e60: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e 65  , z, n);.    zNe
1e70: 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  w[n] = 0;.  }.  
1e80: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23  return zNew;.}.#
1e90: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1ea0: 64 28 4d 45 4d 4f 52 59 5f 44 45 42 55 47 29 20  d(MEMORY_DEBUG) 
1eb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  */../*.** Create
1ec0: 20 61 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74   a string from t
1ed0: 68 65 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  he 2nd and subse
1ee0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
1ef0: 28 75 70 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  (up to the.** fi
1f00: 72 73 74 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  rst NULL argumen
1f10: 74 29 2c 20 73 74 6f 72 65 20 74 68 65 20 73 74  t), store the st
1f20: 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ring in memory o
1f30: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1f40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
1f50: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 6f 69 6e  nd make the poin
1f60: 74 65 72 20 69 6e 64 69 63 61 74 65 64 20 62 79  ter indicated by
1f70: 20 74 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e   the 1st argumen
1f80: 74 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  t.** point to th
1f90: 61 74 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  at string.  The 
1fa0: 31 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  1st argument mus
1fb0: 74 20 65 69 74 68 65 72 20 62 65 20 4e 55 4c 4c  t either be NULL
1fc0: 20 6f 72 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   or .** point to
1fd0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1fe0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1ff0: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oc()..*/.void sq
2000: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 63 68  liteSetString(ch
2010: 61 72 20 2a 2a 70 7a 2c 20 63 6f 6e 73 74 20 63  ar **pz, const c
2020: 68 61 72 20 2a 7a 46 69 72 73 74 2c 20 2e 2e 2e  har *zFirst, ...
2030: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2040: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
2050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2060: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
2070: 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20 72  .  if( pz==0 ) r
2080: 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20 3d  eturn;.  nByte =
2090: 20 73 74 72 6c 65 6e 28 7a 46 69 72 73 74 29 20   strlen(zFirst) 
20a0: 2b 20 31 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  + 1;.  va_start(
20b0: 61 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 77  ap, zFirst);.  w
20c0: 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72  hile( (z = va_ar
20d0: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
20e0: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 42  *))!=0 ){.    nB
20f0: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29  yte += strlen(z)
2100: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2110: 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p);.  sqliteFree
2120: 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a  (*pz);.  *pz = z
2130: 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 4d  Result = sqliteM
2140: 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20  allocRaw( nByte 
2150: 29 3b 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74  );.  if( zResult
2160: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2170: 6e 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28  n;.  }.  strcpy(
2180: 7a 52 65 73 75 6c 74 2c 20 7a 46 69 72 73 74 29  zResult, zFirst)
2190: 3b 0a 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73  ;.  zResult += s
21a0: 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a  trlen(zResult);.
21b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
21c0: 46 69 72 73 74 29 3b 0a 20 20 77 68 69 6c 65 28  First);.  while(
21d0: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
21e0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
21f0: 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
2200: 7a 52 65 73 75 6c 74 2c 20 7a 29 3b 0a 20 20 20  zResult, z);.   
2210: 20 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c   zResult += strl
2220: 65 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d  en(zResult);.  }
2230: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
2240: 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ifdef MEMORY_DEB
2250: 55 47 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45  UG.#if MEMORY_DE
2260: 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28  BUG>1.  fprintf(
2270: 73 74 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61  stderr,"string a
2280: 74 20 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c  t 0x%x is %s\n",
2290: 20 28 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b   (int)*pz, *pz);
22a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 7d  .#endif.#endif.}
22b0: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69  ../*.** Works li
22c0: 6b 65 20 73 71 6c 69 74 65 53 65 74 53 74 72 69  ke sqliteSetStri
22d0: 6e 67 2c 20 62 75 74 20 65 61 63 68 20 73 74 72  ng, but each str
22e0: 69 6e 67 20 69 73 20 6e 6f 77 20 66 6f 6c 6c 6f  ing is now follo
22f0: 77 65 64 20 62 79 0a 2a 2a 20 61 20 6c 65 6e 67  wed by.** a leng
2300: 74 68 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  th integer which
2310: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d   specifies how m
2320: 75 63 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63  uch of the sourc
2330: 65 20 73 74 72 69 6e 67 20 0a 2a 2a 20 74 6f 20  e string .** to 
2340: 63 6f 70 79 20 28 69 6e 20 62 79 74 65 73 29 2e  copy (in bytes).
2350: 20 20 2d 31 20 6d 65 61 6e 73 20 75 73 65 20 74    -1 means use t
2360: 68 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 2e  he whole string.
2370: 20 20 54 68 65 20 31 73 74 20 0a 2a 2a 20 61 72    The 1st .** ar
2380: 67 75 6d 65 6e 74 20 6d 75 73 74 20 65 69 74 68  gument must eith
2390: 65 72 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  er be NULL or po
23a0: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  int to memory ob
23b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 0a 2a 2a 20  tained from .** 
23c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
23d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  */.void sqliteSe
23e0: 74 4e 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a  tNString(char **
23f0: 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  pz, ...){.  va_l
2400: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42  ist ap;.  int nB
2410: 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  yte;.  const cha
2420: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52  r *z;.  char *zR
2430: 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  esult;.  int n;.
2440: 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20 72  .  if( pz==0 ) r
2450: 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20 3d  eturn;.  nByte =
2460: 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   0;.  va_start(a
2470: 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28  p, pz);.  while(
2480: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
2490: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
24a0: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61 5f  0 ){.    n = va_
24b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
24c0: 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d    if( n<=0 ) n =
24d0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
24e0: 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a  nByte += n;.  }.
24f0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2500: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b  sqliteFree(*pz);
2510: 0a 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74  .  *pz = zResult
2520: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2530: 61 77 28 20 6e 42 79 74 65 20 2b 20 31 20 29 3b  aw( nByte + 1 );
2540: 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d  .  if( zResult==
2550: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  0 ) return;.  va
2560: 5f 73 74 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a  _start(ap, pz);.
2570: 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61    while( (z = va
2580: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
2590: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
25a0: 20 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20   n = va_arg(ap, 
25b0: 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  int);.    if( n<
25c0: 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28  =0 ) n = strlen(
25d0: 7a 29 3b 0a 20 20 20 20 73 74 72 6e 63 70 79 28  z);.    strncpy(
25e0: 7a 52 65 73 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a  zResult, z, n);.
25f0: 20 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20 6e      zResult += n
2600: 3b 0a 20 20 7d 0a 20 20 2a 7a 52 65 73 75 6c 74  ;.  }.  *zResult
2610: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 4d 45 4d   = 0;.#ifdef MEM
2620: 4f 52 59 5f 44 45 42 55 47 0a 23 69 66 20 4d 45  ORY_DEBUG.#if ME
2630: 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66  MORY_DEBUG>1.  f
2640: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 73  printf(stderr,"s
2650: 74 72 69 6e 67 20 61 74 20 30 78 25 78 20 69 73  tring at 0x%x is
2660: 20 25 73 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a   %s\n", (int)*pz
2670: 2c 20 2a 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23  , *pz);.#endif.#
2680: 65 6e 64 69 66 0a 20 20 76 61 5f 65 6e 64 28 61  endif.  va_end(a
2690: 70 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  p);.}..#if 0./*.
26a0: 2a 2a 20 41 64 64 20 61 6e 20 65 72 72 6f 72 20  ** Add an error 
26b0: 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72 73  message to pPars
26c0: 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20 69  e->zErrMsg and i
26d0: 6e 63 72 65 6d 65 6e 74 20 70 50 61 72 73 65 2d  ncrement pParse-
26e0: 3e 6e 45 72 72 2e 0a 2a 2a 20 54 68 65 20 66 6f  >nErr..** The fo
26f0: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 74 69  llowing formatti
2700: 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 61 72  ng characters ar
2710: 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
2720: 20 20 20 20 20 20 25 73 20 20 20 20 20 20 49 6e        %s      In
2730: 73 65 72 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  sert a string.**
2740: 20 20 20 20 20 20 25 7a 20 20 20 20 20 20 41 20        %z      A 
2750: 73 74 72 69 6e 67 20 74 68 61 74 20 73 68 6f 75  string that shou
2760: 6c 64 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ld be freed afte
2770: 72 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 25 64  r use.**      %d
2780: 20 20 20 20 20 20 49 6e 73 65 72 74 20 61 6e 20        Insert an 
2790: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
27a0: 25 54 20 20 20 20 20 20 49 6e 73 65 72 74 20 61  %T      Insert a
27b0: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 20 25   token.**      %
27c0: 53 20 20 20 20 20 20 49 6e 73 65 72 74 20 74 68  S      Insert th
27d0: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
27e0: 6f 66 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  of a SrcList.*/.
27f0: 76 6f 69 64 20 73 71 6c 69 74 65 45 72 72 6f 72  void sqliteError
2800: 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
2810: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
2820: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
2830: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 70 50  va_list ap;.  pP
2840: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2850: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72 73  sqliteFree(pPars
2860: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  e->zErrMsg);.  v
2870: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2880: 6d 61 74 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  mat);.  pParse->
2890: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
28a0: 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  VMPrintf(zFormat
28b0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
28c0: 61 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ap);.}.#endif../
28d0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
28e0: 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65 64  SQL-style quoted
28f0: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 6e   string into a n
2900: 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79 20  ormal string by 
2910: 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65 20  removing.** the 
2920: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
2930: 2e 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f  .  The conversio
2940: 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61  n is done in-pla
2950: 63 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69  ce.  If the.** i
2960: 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  nput does not be
2970: 67 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74 65  gin with a quote
2980: 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65 6e   character, then
2990: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
29a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
29b0: 2a 2a 20 32 30 30 32 2d 46 65 62 2d 31 34 3a 20  ** 2002-Feb-14: 
29c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29d0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 6d 6f  extended to remo
29e0: 76 65 20 4d 53 2d 41 63 63 65 73 73 20 73 74 79  ve MS-Access sty
29f0: 6c 65 0a 2a 2a 20 62 72 61 63 6b 65 74 73 20 66  le.** brackets f
2a00: 72 6f 6d 20 61 72 6f 75 6e 64 20 69 64 65 6e 74  rom around ident
2a10: 69 66 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d  ifers.  For exam
2a20: 70 6c 65 3a 20 20 22 5b 61 2d 62 2d 63 5d 22 20  ple:  "[a-b-c]" 
2a30: 62 65 63 6f 6d 65 73 0a 2a 2a 20 22 61 2d 62 2d  becomes.** "a-b-
2a40: 63 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c"..*/.void sqli
2a50: 74 65 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  teDequote(char *
2a60: 7a 29 7b 0a 20 20 69 6e 74 20 71 75 6f 74 65 3b  z){.  int quote;
2a70: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2a80: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
2a90: 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d  ;.  quote = z[0]
2aa0: 3b 0a 20 20 73 77 69 74 63 68 28 20 71 75 6f 74  ;.  switch( quot
2ab0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 27 5c  e ){.    case '\
2ac0: 27 27 3a 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  '':  break;.    
2ad0: 63 61 73 65 20 27 22 27 3a 20 20 20 62 72 65 61  case '"':   brea
2ae0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 5b 27 3a  k;.    case '[':
2af0: 20 20 20 71 75 6f 74 65 20 3d 20 27 5d 27 3b 20     quote = ']'; 
2b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
2b10: 75 6c 74 3a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ult:    return;.
2b20: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6a    }.  for(i=1, j
2b30: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
2b40: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 71 75      if( z[i]==qu
2b50: 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ote ){.      if(
2b60: 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65 20 29   z[i+1]==quote )
2b70: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
2b80: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 20 20   = quote;.      
2b90: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
2ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
2bb0: 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  +] = 0;.        
2bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2be0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
2bf0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41     }.  }.}../* A
2c00: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70 20 61  n array to map a
2c10: 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20 63 68  ll upper-case ch
2c20: 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 74 68  aracters into th
2c30: 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
2c40: 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20  g.** lower-case 
2c50: 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2f 0a 73  character. .*/.s
2c60: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
2c70: 68 61 72 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  har UpperToLower
2c80: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 20  [] = {.      0, 
2c90: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
2ca0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38 2c 20   5,  6,  7,  8, 
2cb0: 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20   9, 10, 11, 12, 
2cc0: 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20  13, 14, 15, 16, 
2cd0: 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31 39 2c  17,.     18, 19,
2ce0: 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c   20, 21, 22, 23,
2cf0: 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32 37 2c   24, 25, 26, 27,
2d00: 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c   28, 29, 30, 31,
2d10: 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33 35 2c   32, 33, 34, 35,
2d20: 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20 33 38  .     36, 37, 38
2d30: 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20 34 32  , 39, 40, 41, 42
2d40: 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20 34 36  , 43, 44, 45, 46
2d50: 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20 35 30  , 47, 48, 49, 50
2d60: 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a 20 20  , 51, 52, 53,.  
2d70: 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c 20 35     54, 55, 56, 5
2d80: 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c 20 36  7, 58, 59, 60, 6
2d90: 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c 20 39  1, 62, 63, 64, 9
2da0: 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 31 30  7, 98, 99,100,10
2db0: 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20 20 31  1,102,103,.    1
2dc0: 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c 31  04,105,106,107,1
2dd0: 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c 31  08,109,110,111,1
2de0: 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c 31  12,113,114,115,1
2df0: 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c 31  16,117,118,119,1
2e00: 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32 32 2c  20,121,.    122,
2e10: 20 39 31 2c 20 39 32 2c 20 39 33 2c 20 39 34 2c   91, 92, 93, 94,
2e20: 20 39 35 2c 20 39 36 2c 20 39 37 2c 20 39 38 2c   95, 96, 97, 98,
2e30: 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c   99,100,101,102,
2e40: 31 30 33 2c 31 30 34 2c 31 30 35 2c 31 30 36 2c  103,104,105,106,
2e50: 31 30 37 2c 0a 20 20 20 20 31 30 38 2c 31 30 39  107,.    108,109
2e60: 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31 31 33  ,110,111,112,113
2e70: 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31 31 37  ,114,115,116,117
2e80: 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31 32 31  ,118,119,120,121
2e90: 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c 31 32 35  ,122,123,124,125
2ea0: 2c 0a 20 20 20 20 31 32 36 2c 31 32 37 2c 31 32  ,.    126,127,12
2eb0: 38 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c 31 33  8,129,130,131,13
2ec0: 32 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c 31 33  2,133,134,135,13
2ed0: 36 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c 31 34  6,137,138,139,14
2ee0: 30 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c 0a 20  0,141,142,143,. 
2ef0: 20 20 20 31 34 34 2c 31 34 35 2c 31 34 36 2c 31     144,145,146,1
2f00: 34 37 2c 31 34 38 2c 31 34 39 2c 31 35 30 2c 31  47,148,149,150,1
2f10: 35 31 2c 31 35 32 2c 31 35 33 2c 31 35 34 2c 31  51,152,153,154,1
2f20: 35 35 2c 31 35 36 2c 31 35 37 2c 31 35 38 2c 31  55,156,157,158,1
2f30: 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20 20 20 20  59,160,161,.    
2f40: 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 36 35 2c  162,163,164,165,
2f50: 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 36 39 2c  166,167,168,169,
2f60: 31 37 30 2c 31 37 31 2c 31 37 32 2c 31 37 33 2c  170,171,172,173,
2f70: 31 37 34 2c 31 37 35 2c 31 37 36 2c 31 37 37 2c  174,175,176,177,
2f80: 31 37 38 2c 31 37 39 2c 0a 20 20 20 20 31 38 30  178,179,.    180
2f90: 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c 31 38 34  ,181,182,183,184
2fa0: 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c 31 38 38  ,185,186,187,188
2fb0: 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c 31 39 32  ,189,190,191,192
2fc0: 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c 31 39 36  ,193,194,195,196
2fd0: 2c 31 39 37 2c 0a 20 20 20 20 31 39 38 2c 31 39  ,197,.    198,19
2fe0: 39 2c 32 30 30 2c 32 30 31 2c 32 30 32 2c 32 30  9,200,201,202,20
2ff0: 33 2c 32 30 34 2c 32 30 35 2c 32 30 36 2c 32 30  3,204,205,206,20
3000: 37 2c 32 30 38 2c 32 30 39 2c 32 31 30 2c 32 31  7,208,209,210,21
3010: 31 2c 32 31 32 2c 32 31 33 2c 32 31 34 2c 32 31  1,212,213,214,21
3020: 35 2c 0a 20 20 20 20 32 31 36 2c 32 31 37 2c 32  5,.    216,217,2
3030: 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31 2c 32  18,219,220,221,2
3040: 32 32 2c 32 32 33 2c 32 32 34 2c 32 32 35 2c 32  22,223,224,225,2
3050: 32 36 2c 32 32 37 2c 32 32 38 2c 32 32 39 2c 32  26,227,228,229,2
3060: 33 30 2c 32 33 31 2c 32 33 32 2c 32 33 33 2c 0a  30,231,232,233,.
3070: 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33 36 2c      234,235,236,
3080: 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34 30 2c  237,238,239,240,
3090: 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34 34 2c  241,242,243,244,
30a0: 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34 38 2c  245,246,247,248,
30b0: 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a 20 20 20  249,250,251,.   
30c0: 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32 35 35   252,253,254,255
30d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
30e0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74 65  function compute
30f0: 73 20 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20  s a hash on the 
3100: 6e 61 6d 65 20 6f 66 20 61 20 6b 65 79 77 6f 72  name of a keywor
3110: 64 2e 0a 2a 2a 20 43 61 73 65 20 69 73 20 6e 6f  d..** Case is no
3120: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a  t significant..*
3130: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 48 61 73 68  /.int sqliteHash
3140: 4e 6f 43 61 73 65 28 63 6f 6e 73 74 20 63 68 61  NoCase(const cha
3150: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
3160: 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 69 66 28  int h = 0;.  if(
3170: 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c   n<=0 ) n = strl
3180: 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20  en(z);.  while( 
3190: 6e 20 3e 20 30 20 20 29 7b 0a 20 20 20 20 68 20  n > 0  ){.    h 
31a0: 3d 20 28 68 3c 3c 33 29 20 5e 20 68 20 5e 20 55  = (h<<3) ^ h ^ U
31b0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 75 6e 73  pperToLower[(uns
31c0: 69 67 6e 65 64 20 63 68 61 72 29 2a 7a 2b 2b 5d  igned char)*z++]
31d0: 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20  ;.    n--;.  }. 
31e0: 20 72 65 74 75 72 6e 20 68 20 26 20 30 78 37 66   return h & 0x7f
31f0: 66 66 66 66 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffffff;.}../*.**
3200: 20 53 6f 6d 65 20 73 79 73 74 65 6d 73 20 68 61   Some systems ha
3210: 76 65 20 73 74 72 69 63 6d 70 28 29 2e 20 20 4f  ve stricmp().  O
3220: 74 68 65 72 73 20 68 61 76 65 20 73 74 72 63 61  thers have strca
3230: 73 65 63 6d 70 28 29 2e 20 20 42 65 63 61 75 73  secmp().  Becaus
3240: 65 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  e.** there is no
3250: 20 63 6f 6e 73 69 73 74 65 6e 63 79 2c 20 77 65   consistency, we
3260: 20 77 69 6c 6c 20 64 65 66 69 6e 65 20 6f 75 72   will define our
3270: 20 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   own..*/.int sql
3280: 69 74 65 53 74 72 49 43 6d 70 28 63 6f 6e 73 74  iteStrICmp(const
3290: 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f   char *zLeft, co
32a0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74  nst char *zRight
32b0: 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e  ){.  register un
32c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20  signed char *a, 
32d0: 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67  *b;.  a = (unsig
32e0: 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74  ned char *)zLeft
32f0: 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  b = (unsigne
3300: 64 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b  d char *)zRight;
3310: 0a 20 20 77 68 69 6c 65 28 20 2a 61 21 3d 30 20  .  while( *a!=0 
3320: 26 26 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  && UpperToLower[
3330: 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65  *a]==UpperToLowe
3340: 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b  r[*b]){ a++; b++
3350: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 61 20  ; }.  return *a 
3360: 2d 20 2a 62 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  - *b;.}.int sqli
3370: 74 65 53 74 72 4e 49 43 6d 70 28 63 6f 6e 73 74  teStrNICmp(const
3380: 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f   char *zLeft, co
3390: 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74  nst char *zRight
33a0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67 69  , int N){.  regi
33b0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68  ster unsigned ch
33c0: 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d  ar *a, *b;.  a =
33d0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
33e0: 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28  *)zLeft;.  b = (
33f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3400: 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28  zRight;.  while(
3410: 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a 61 21 3d   N-- > 0 && *a!=
3420: 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77 65  0 && UpperToLowe
3430: 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f  r[*a]==UpperToLo
3440: 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62  wer[*b]){ a++; b
3450: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e  ++; }.  return N
3460: 3c 30 20 3f 20 30 20 3a 20 2a 61 20 2d 20 2a 62  <0 ? 0 : *a - *b
3470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3480: 6e 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 61  n TRUE if z is a
3490: 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74   pure numeric st
34a0: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 41  ring.  Return FA
34b0: 4c 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 74  LSE if the.** st
34c0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ring contains an
34d0: 79 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  y character whic
34e0: 68 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  h is not part of
34f0: 20 61 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a   a number..**.**
3500: 20 41 6d 20 65 6d 70 74 79 20 73 74 72 69 6e 67   Am empty string
3510: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6e   is considered n
3520: 6f 6e 2d 6e 75 6d 65 72 69 63 2e 0a 2a 2f 0a 69  on-numeric..*/.i
3530: 6e 74 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65  nt sqliteIsNumbe
3540: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  r(const char *z)
3550: 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20  {.  if( *z=='-' 
3560: 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b  || *z=='+' ) z++
3570: 3b 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74  ;.  if( !isdigit
3580: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (*z) ){.    retu
3590: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b  rn 0;.  }.  z++;
35a0: 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69  .  while( isdigi
35b0: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
35c0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
35d0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
35e0: 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20 29  ( !isdigit(*z) )
35f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
3600: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a  hile( isdigit(*z
3610: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a  ) ){ z++; }.  }.
3620: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3630: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3640: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3650: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3660: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3670: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65  isdigit(*z) ) re
3680: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3690: 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29  e( isdigit(*z) )
36a0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { z++; }.  }.  r
36b0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
36c0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67  /*.** The string
36d0: 20 7a 5b 5d 20 69 73 20 61 6e 20 61 73 63 69 69   z[] is an ascii
36e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
36f0: 6f 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72  of a real number
3700: 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69  ..** Convert thi
3710: 73 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f  s string to a do
3720: 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  uble..**.** This
3730: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
3740: 20 74 68 61 74 20 7a 5b 5d 20 72 65 61 6c 6c 79   that z[] really
3750: 20 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62   is a valid numb
3760: 65 72 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73  er.  If it.** is
3770: 20 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74   not, the result
3780: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
3790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37a0: 65 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  e is used instea
37b0: 64 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  d of the library
37c0: 20 61 74 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e   atof() function
37d0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20   because.** the 
37e0: 6c 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 6d  library atof() m
37f0: 69 67 68 74 20 77 61 6e 74 20 74 6f 20 75 73 65  ight want to use
3800: 20 22 2c 22 20 61 73 20 74 68 65 20 64 65 63 69   "," as the deci
3810: 6d 61 6c 20 70 6f 69 6e 74 20 69 6e 73 74 65 61  mal point instea
3820: 64 0a 2a 2a 20 6f 66 20 22 2e 22 20 64 65 70 65  d.** of "." depe
3830: 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20 6c 6f 63  nding on how loc
3840: 61 6c 65 20 69 73 20 73 65 74 2e 20 20 42 75 74  ale is set.  But
3850: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 61 75 73   that would caus
3860: 65 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f  e problems.** fo
3870: 72 20 53 51 4c 2e 20 20 53 6f 20 74 68 69 73 20  r SQL.  So this 
3880: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 75  routine always u
3890: 73 65 73 20 22 2e 22 20 72 65 67 61 72 64 6c 65  ses "." regardle
38a0: 73 73 20 6f 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f  ss of locale..*/
38b0: 0a 64 6f 75 62 6c 65 20 73 71 6c 69 74 65 41 74  .double sqliteAt
38c0: 6f 46 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  oF(const char *z
38d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70  , const char **p
38e0: 7a 45 6e 64 29 7b 0a 20 20 69 6e 74 20 73 69 67  zEnd){.  int sig
38f0: 6e 20 3d 20 31 3b 0a 20 20 4c 4f 4e 47 44 4f 55  n = 1;.  LONGDOU
3900: 42 4c 45 5f 54 59 50 45 20 76 31 20 3d 20 30 2e  BLE_TYPE v1 = 0.
3910: 30 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  0;.  if( *z=='-'
3920: 20 29 7b 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d   ){.    sign = -
3930: 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65  1;.    z++;.  }e
3940: 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20  lse if( *z=='+' 
3950: 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a  ){.    z++;.  }.
3960: 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74    while( isdigit
3970: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 76 31 20 3d  (*z) ){.    v1 =
3980: 20 76 31 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 2d   v1*10.0 + (*z -
3990: 20 27 30 27 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a   '0');.    z++;.
39a0: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e    }.  if( *z=='.
39b0: 27 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55  ' ){.    LONGDOU
39c0: 42 4c 45 5f 54 59 50 45 20 64 69 76 69 73 6f 72  BLE_TYPE divisor
39d0: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b   = 1.0;.    z++;
39e0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69  .    while( isdi
39f0: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20  git(*z) ){.     
3a00: 20 76 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20   v1 = v1*10.0 + 
3a10: 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  (*z - '0');.    
3a20: 20 20 64 69 76 69 73 6f 72 20 2a 3d 20 31 30 2e    divisor *= 10.
3a30: 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  0;.      z++;.  
3a40: 20 20 7d 0a 20 20 20 20 76 31 20 2f 3d 20 64 69    }.    v1 /= di
3a50: 76 69 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  visor;.  }.  if(
3a60: 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d   *z=='e' || *z==
3a70: 27 45 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  'E' ){.    int e
3a80: 73 69 67 6e 20 3d 20 31 3b 0a 20 20 20 20 69 6e  sign = 1;.    in
3a90: 74 20 65 76 61 6c 20 3d 20 30 3b 0a 20 20 20 20  t eval = 0;.    
3aa0: 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
3ab0: 73 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20  scale = 1.0;.   
3ac0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a   z++;.    if( *z
3ad0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 65  =='-' ){.      e
3ae0: 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  sign = -1;.     
3af0: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
3b00: 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20  if( *z=='+' ){. 
3b10: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
3b20: 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67      while( isdig
3b30: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20 20  it(*z) ){.      
3b40: 65 76 61 6c 20 3d 20 65 76 61 6c 2a 31 30 20 2b  eval = eval*10 +
3b50: 20 2a 7a 20 2d 20 27 30 27 3b 0a 20 20 20 20 20   *z - '0';.     
3b60: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   z++;.    }.    
3b70: 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d 36 34 20  while( eval>=64 
3b80: 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65  ){ scale *= 1.0e
3b90: 2b 36 34 3b 20 65 76 61 6c 20 2d 3d 20 36 34 3b  +64; eval -= 64;
3ba0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76   }.    while( ev
3bb0: 61 6c 3e 3d 31 36 20 29 7b 20 73 63 61 6c 65 20  al>=16 ){ scale 
3bc0: 2a 3d 20 31 2e 30 65 2b 31 36 3b 20 65 76 61 6c  *= 1.0e+16; eval
3bd0: 20 2d 3d 20 31 36 3b 20 7d 0a 20 20 20 20 77 68   -= 16; }.    wh
3be0: 69 6c 65 28 20 65 76 61 6c 3e 3d 34 20 29 7b 20  ile( eval>=4 ){ 
3bf0: 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 34 3b  scale *= 1.0e+4;
3c00: 20 65 76 61 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20   eval -= 4; }.  
3c10: 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d 31    while( eval>=1
3c20: 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30   ){ scale *= 1.0
3c30: 65 2b 31 3b 20 65 76 61 6c 20 2d 3d 20 31 3b 20  e+1; eval -= 1; 
3c40: 7d 0a 20 20 20 20 69 66 28 20 65 73 69 67 6e 3c  }.    if( esign<
3c50: 30 20 29 7b 0a 20 20 20 20 20 20 76 31 20 2f 3d  0 ){.      v1 /=
3c60: 20 73 63 61 6c 65 3b 0a 20 20 20 20 7d 65 6c 73   scale;.    }els
3c70: 65 7b 0a 20 20 20 20 20 20 76 31 20 2a 3d 20 73  e{.      v1 *= s
3c80: 63 61 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  cale;.    }.  }.
3c90: 20 20 69 66 28 20 70 7a 45 6e 64 20 29 20 2a 70    if( pzEnd ) *p
3ca0: 7a 45 6e 64 20 3d 20 7a 3b 0a 20 20 72 65 74 75  zEnd = z;.  retu
3cb0: 72 6e 20 73 69 67 6e 3c 30 20 3f 20 2d 76 31 20  rn sign<0 ? -v1 
3cc0: 3a 20 76 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  : v1;.}../*.** T
3cd0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72  he string zNum r
3ce0: 65 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74  epresents an int
3cf0: 65 67 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67  eger.  There mig
3d00: 68 74 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72  ht be some other
3d10: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
3d20: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e  following the in
3d30: 74 65 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74  teger too, but t
3d40: 68 61 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f  hat part is igno
3d50: 72 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  red..** If the i
3d60: 6e 74 65 67 65 72 20 74 68 61 74 20 74 68 65 20  nteger that the 
3d70: 70 72 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72  prefix of zNum r
3d80: 65 70 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66  epresents will f
3d90: 69 74 20 69 6e 20 61 0a 2a 2a 20 33 32 2d 62 69  it in a.** 32-bi
3da0: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
3db0: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  , return TRUE.  
3dc0: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
3dd0: 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   FALSE..**.** Th
3de0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
3df0: 6e 73 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65  ns FALSE for the
3e00: 20 73 74 72 69 6e 67 20 2d 32 31 34 37 34 38 33   string -2147483
3e10: 36 34 38 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a  648 even that.**
3e20: 20 74 68 61 74 20 6e 75 6d 62 65 72 20 77 69 6c   that number wil
3e30: 6c 2c 20 69 6e 20 74 68 65 6f 72 79 20 66 69 74  l, in theory fit
3e40: 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
3e50: 65 67 65 72 2e 20 20 42 75 74 20 70 6f 73 69 74  eger.  But posit
3e60: 69 76 65 0a 2a 2a 20 32 31 34 37 34 38 33 36 34  ive.** 214748364
3e70: 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69  8 will not fit i
3e80: 6e 20 33 32 20 62 69 74 73 2e 20 20 53 6f 20 69  n 32 bits.  So i
3e90: 74 20 73 65 65 6d 73 20 73 61 66 65 72 20 74 6f  t seems safer to
3ea0: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
3eb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 46  ..*/.int sqliteF
3ec0: 69 74 73 49 6e 33 32 42 69 74 73 28 63 6f 6e 73  itsIn32Bits(cons
3ed0: 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a 20  t char *zNum){. 
3ee0: 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 69 66 28   int i, c;.  if(
3ef0: 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c 7c 20 2a   *zNum=='-' || *
3f00: 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a 4e 75 6d  zNum=='+' ) zNum
3f10: 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  ++;.  for(i=0; (
3f20: 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27 30 27 20  c=zNum[i])>='0' 
3f30: 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b  && c<='9'; i++){
3f40: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3c 31 30 20  }.  return i<10 
3f50: 7c 7c 20 28 69 3d 3d 31 30 20 26 26 20 6d 65 6d  || (i==10 && mem
3f60: 63 6d 70 28 7a 4e 75 6d 2c 22 32 31 34 37 34 38  cmp(zNum,"214748
3f70: 33 36 34 37 22 2c 31 30 29 3c 3d 30 29 3b 0a 7d  3647",10)<=0);.}
3f80: 0a 0a 2f 2a 20 54 68 69 73 20 63 6f 6d 70 61 72  ../* This compar
3f90: 69 73 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  ison routine is 
3fa0: 77 68 61 74 20 77 65 20 75 73 65 20 66 6f 72 20  what we use for 
3fb0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
3fc0: 74 69 6f 6e 73 0a 2a 2a 20 62 65 74 77 65 65 6e  tions.** between
3fd0: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   numeric values 
3fe0: 69 6e 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  in an SQL expres
3ff0: 73 69 6f 6e 2e 20 20 22 4e 75 6d 65 72 69 63 22  sion.  "Numeric"
4000: 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20   is a little.** 
4010: 62 69 74 20 6d 69 73 6c 65 61 64 69 6e 67 20 68  bit misleading h
4020: 65 72 65 2e 20 20 57 68 61 74 20 77 65 20 6d 65  ere.  What we me
4030: 61 6e 20 69 73 20 74 68 61 74 20 74 68 65 20 73  an is that the s
4040: 74 72 69 6e 67 73 20 68 61 76 65 20 61 0a 2a 2a  trings have a.**
4050: 20 74 79 70 65 20 6f 66 20 22 6e 75 6d 65 72 69   type of "numeri
4060: 63 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  c" from the poin
4070: 74 20 6f 66 20 76 69 65 77 20 6f 66 20 53 51 4c  t of view of SQL
4080: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 73 0a 2a  .  The strings.*
4090: 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61  * do not necessa
40a0: 72 69 6c 79 20 63 6f 6e 74 61 69 6e 20 6e 75 6d  rily contain num
40b0: 62 65 72 73 2e 20 20 54 68 65 79 20 63 6f 75 6c  bers.  They coul
40c0: 64 20 63 6f 6e 74 61 69 6e 20 74 65 78 74 2e 0a  d contain text..
40d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
40e0: 75 74 20 73 74 72 69 6e 67 73 20 62 6f 74 68 20  ut strings both 
40f0: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 63 74 75 61 6c  look like actual
4100: 20 6e 75 6d 62 65 72 73 20 74 68 65 6e 20 74 68   numbers then th
4110: 65 79 0a 2a 2a 20 63 6f 6d 70 61 72 65 20 69 6e  ey.** compare in
4120: 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64 65 72   numerical order
4130: 2e 20 20 4e 75 6d 65 72 69 63 61 6c 20 73 74 72  .  Numerical str
4140: 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
4150: 6c 65 73 73 20 0a 2a 2a 20 74 68 61 6e 20 6e 6f  less .** than no
4160: 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67  n-numeric string
4170: 73 20 73 6f 20 69 66 20 6f 6e 65 20 69 6e 70 75  s so if one inpu
4180: 74 20 73 74 72 69 6e 67 20 6c 6f 6f 6b 73 20 6c  t string looks l
4190: 69 6b 65 20 61 0a 2a 2a 20 6e 75 6d 62 65 72 20  ike a.** number 
41a0: 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 64 6f  and the other do
41b0: 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  es not, then the
41c0: 20 6f 6e 65 20 74 68 61 74 20 6c 6f 6f 6b 73 20   one that looks 
41d0: 6c 69 6b 65 0a 2a 2a 20 61 20 6e 75 6d 62 65 72  like.** a number
41e0: 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 72 2e   is the smaller.
41f0: 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74    Non-numeric st
4200: 72 69 6e 67 73 20 63 6f 6d 70 61 72 65 20 69 6e  rings compare in
4210: 20 0a 2a 2a 20 6c 65 78 69 67 72 61 70 68 69 63   .** lexigraphic
4220: 61 6c 20 6f 72 64 65 72 20 28 74 68 65 20 73 61  al order (the sa
4230: 6d 65 20 6f 72 64 65 72 20 61 73 20 73 74 72 63  me order as strc
4240: 6d 70 28 29 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mp())..*/.int sq
4250: 6c 69 74 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73  liteCompare(cons
4260: 74 20 63 68 61 72 20 2a 61 74 65 78 74 2c 20 63  t char *atext, c
4270: 6f 6e 73 74 20 63 68 61 72 20 2a 62 74 65 78 74  onst char *btext
4280: 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  ){.  int result;
4290: 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41 2c 20 69  .  int isNumA, i
42a0: 73 4e 75 6d 42 3b 0a 20 20 69 66 28 20 61 74 65  sNumB;.  if( ate
42b0: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  xt==0 ){.    ret
42c0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20  urn -1;.  }else 
42d0: 69 66 28 20 62 74 65 78 74 3d 3d 30 20 29 7b 0a  if( btext==0 ){.
42e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
42f0: 7d 0a 20 20 69 73 4e 75 6d 41 20 3d 20 73 71 6c  }.  isNumA = sql
4300: 69 74 65 49 73 4e 75 6d 62 65 72 28 61 74 65 78  iteIsNumber(atex
4310: 74 29 3b 0a 20 20 69 73 4e 75 6d 42 20 3d 20 73  t);.  isNumB = s
4320: 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 62 74  qliteIsNumber(bt
4330: 65 78 74 29 3b 0a 20 20 69 66 28 20 69 73 4e 75  ext);.  if( isNu
4340: 6d 41 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  mA ){.    if( !i
4350: 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 72  sNumB ){.      r
4360: 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20  esult = -1;.    
4370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 75  }else{.      dou
4380: 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20  ble rA, rB;.    
4390: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 41 74 6f    rA = sqliteAto
43a0: 46 28 61 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  F(atext, 0);.   
43b0: 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65 41 74     rB = sqliteAt
43c0: 6f 46 28 62 74 65 78 74 2c 20 30 29 3b 0a 20 20  oF(btext, 0);.  
43d0: 20 20 20 20 69 66 28 20 72 41 3c 72 42 20 29 7b      if( rA<rB ){
43e0: 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
43f0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
4400: 65 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a 20  e if( rA>rB ){. 
4410: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
4420: 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
4430: 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
4440: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
4450: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
4460: 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 72 65 73  sNumB ){.    res
4470: 75 6c 74 20 3d 20 2b 31 3b 0a 20 20 7d 65 6c 73  ult = +1;.  }els
4480: 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  e {.    result =
4490: 20 73 74 72 63 6d 70 28 61 74 65 78 74 2c 20 62   strcmp(atext, b
44a0: 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  text);.  }.  ret
44b0: 75 72 6e 20 72 65 73 75 6c 74 3b 20 0a 7d 0a 0a  urn result; .}..
44c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
44d0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 73  ne is used for s
44e0: 6f 72 74 69 6e 67 2e 20 20 45 61 63 68 20 6b 65  orting.  Each ke
44f0: 79 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6f  y is a list of o
4500: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75  ne or more.** nu
4510: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 65 6c  ll-terminated el
4520: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 6c 69 73  ements.  The lis
4530: 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20  t is terminated 
4540: 62 79 20 74 77 6f 20 6e 75 6c 6c 73 20 69 6e 0a  by two nulls in.
4550: 2a 2a 20 61 20 72 6f 77 2e 20 20 46 6f 72 20 65  ** a row.  For e
4560: 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  xample, the foll
4570: 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20 61 20  owing text is a 
4580: 6b 65 79 20 77 69 74 68 20 74 68 72 65 65 20 65  key with three e
4590: 6c 65 6d 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 20 20  lements.**.**   
45a0: 20 20 20 20 20 20 20 20 20 41 6f 6e 65 5c 30 30           Aone\00
45b0: 30 44 74 77 6f 5c 30 30 30 41 74 68 72 65 65 5c  0Dtwo\000Athree\
45c0: 30 30 30 5c 30 30 30 0a 2a 2a 0a 2a 2a 20 41 6c  000\000.**.** Al
45d0: 6c 20 65 6c 65 6d 65 6e 74 73 20 62 65 67 69 6e  l elements begin
45e0: 20 77 69 74 68 20 6f 6e 65 20 6f 66 20 74 68 65   with one of the
45f0: 20 63 68 61 72 61 63 74 65 72 73 20 22 2b 2d 41   characters "+-A
4600: 44 22 20 61 6e 64 20 65 6e 64 20 77 69 74 68 20  D" and end with 
4610: 22 5c 30 30 30 22 0a 2a 2a 20 77 69 74 68 20 7a  "\000".** with z
4620: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 78 74  ero or more text
4630: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 62 65 74   elements in bet
4640: 77 65 65 6e 2e 20 20 45 78 63 65 70 74 2c 20 4e  ween.  Except, N
4650: 55 4c 4c 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  ULL elements.** 
4660: 63 6f 6e 73 69 73 74 20 6f 66 20 74 68 65 20 73  consist of the s
4670: 70 65 63 69 61 6c 20 74 77 6f 2d 63 68 61 72 61  pecial two-chara
4680: 63 74 65 72 20 73 65 71 75 65 6e 63 65 20 22 4e  cter sequence "N
4690: 5c 30 30 30 22 2e 0a 2a 2a 0a 2a 2a 20 42 6f 74  \000"..**.** Bot
46a0: 68 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c  h arguments will
46b0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
46c0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
46d0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
46e0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 6e 65 67 61  .** returns nega
46f0: 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
4700: 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
4710: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
4720: 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 2c 20 65   less.** than, e
4730: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
4740: 74 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72  ter than the fir
4750: 73 74 2e 20 20 28 52 65 73 75 6c 74 20 69 73 20  st.  (Result is 
4760: 61 2d 62 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  a-b)..**.** Each
4770: 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20   element begins 
4780: 77 69 74 68 20 6f 6e 65 20 6f 66 20 74 68 65 20  with one of the 
4790: 63 68 61 72 61 63 74 65 72 73 20 22 2b 22 2c 20  characters "+", 
47a0: 22 2d 22 2c 20 22 41 22 2c 20 22 44 22 2e 0a 2a  "-", "A", "D"..*
47b0: 2a 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72  * This character
47c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
47d0: 73 6f 72 74 20 6f 72 64 65 72 20 61 6e 64 20 63  sort order and c
47e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
47f0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 20  e:.**.**     +  
4800: 20 20 20 20 53 6f 72 74 20 6e 75 6d 65 72 69 63      Sort numeric
4810: 61 6c 6c 79 20 69 6e 20 61 73 63 65 6e 64 69 6e  ally in ascendin
4820: 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 20 2d  g order.**     -
4830: 20 20 20 20 20 20 53 6f 72 74 20 6e 75 6d 65 72        Sort numer
4840: 69 63 61 6c 6c 79 20 69 6e 20 64 65 73 63 65 6e  ically in descen
4850: 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20  ding order.**   
4860: 20 20 41 20 20 20 20 20 20 53 6f 72 74 20 61 73    A      Sort as
4870: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 73 63 65   strings in asce
4880: 6e 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20  nding order.**  
4890: 20 20 20 44 20 20 20 20 20 20 53 6f 72 74 20 61     D      Sort a
48a0: 73 20 73 74 72 69 6e 67 73 20 69 6e 20 64 65 73  s strings in des
48b0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
48c0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 22 2b 22  *.** For the "+"
48d0: 20 61 6e 64 20 22 2d 22 20 73 6f 72 74 69 6e 67   and "-" sorting
48e0: 2c 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73  , pure numeric s
48f0: 74 72 69 6e 67 73 20 28 73 74 72 69 6e 67 73 20  trings (strings 
4900: 66 6f 72 20 77 68 69 63 68 20 74 68 65 0a 2a 2a  for which the.**
4910: 20 69 73 4e 75 6d 28 29 20 66 75 6e 63 74 69 6f   isNum() functio
4920: 6e 20 61 62 6f 76 65 20 72 65 74 75 72 6e 73 20  n above returns 
4930: 54 52 55 45 29 20 61 6c 77 61 79 73 20 63 6f 6d  TRUE) always com
4940: 70 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73  pare less than s
4950: 74 72 69 6e 67 73 0a 2a 2a 20 74 68 61 74 20 61  trings.** that a
4960: 72 65 20 6e 6f 74 20 70 75 72 65 20 6e 75 6d 65  re not pure nume
4970: 72 69 63 73 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72  rics.  Non-numer
4980: 69 63 20 73 74 72 69 6e 67 73 20 63 6f 6d 70 61  ic strings compa
4990: 72 65 20 69 6e 20 6d 65 6d 63 6d 70 28 29 0a 2a  re in memcmp().*
49a0: 2a 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  * order.  This i
49b0: 73 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20  s the same sort 
49c0: 6f 72 64 65 72 20 61 73 20 74 68 65 20 73 71 6c  order as the sql
49d0: 69 74 65 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  iteCompare() fun
49e0: 63 74 69 6f 6e 0a 2a 2a 20 61 62 6f 76 65 20 67  ction.** above g
49f0: 65 6e 65 72 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  enerates..**.** 
4a00: 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69  The last point i
4a10: 73 20 61 20 63 68 61 6e 67 65 20 66 72 6f 6d 20  s a change from 
4a20: 76 65 72 73 69 6f 6e 20 32 2e 36 2e 33 20 74 6f  version 2.6.3 to
4a30: 20 76 65 72 73 69 6f 6e 20 32 2e 37 2e 30 2e 20   version 2.7.0. 
4a40: 20 49 6e 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32   In.** version 2
4a50: 2e 36 2e 33 20 61 6e 64 20 65 61 72 6c 69 65 72  .6.3 and earlier
4a60: 2c 20 73 75 62 73 74 72 69 6e 67 73 20 6f 66 20  , substrings of 
4a70: 64 69 67 69 74 73 20 63 6f 6d 70 61 72 65 20 69  digits compare i
4a80: 6e 20 6e 75 6d 65 72 69 63 61 6c 20 0a 2a 2a 20  n numerical .** 
4a90: 61 6e 64 20 63 61 73 65 20 77 61 73 20 75 73 65  and case was use
4aa0: 64 20 6f 6e 6c 79 20 74 6f 20 62 72 65 61 6b 20  d only to break 
4ab0: 61 20 74 69 65 2e 0a 2a 2a 0a 2a 2a 20 45 6c 65  a tie..**.** Ele
4ac0: 6d 65 6e 74 73 20 74 68 61 74 20 62 65 67 69 6e  ments that begin
4ad0: 20 77 69 74 68 20 27 41 27 20 6f 72 20 27 44 27   with 'A' or 'D'
4ae0: 20 63 6f 6d 70 61 72 65 20 69 6e 20 6d 65 6d 63   compare in memc
4af0: 6d 70 28 29 20 6f 72 64 65 72 20 72 65 67 61 72  mp() order regar
4b00: 64 6c 65 73 73 0a 2a 2a 20 6f 66 20 77 68 65 74  dless.** of whet
4b10: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 79 20  her or not they 
4b20: 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62  look like a numb
4b30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  er..**.** Note t
4b40: 68 61 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64  hat the sort ord
4b50: 65 72 20 69 6d 70 6f 73 65 64 20 62 79 20 74 68  er imposed by th
4b60: 65 20 72 75 6c 65 73 20 61 62 6f 76 65 20 69 73  e rules above is
4b70: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 66 72 6f   the same.** fro
4b80: 6d 20 74 68 65 20 6f 72 64 65 72 69 6e 67 20 64  m the ordering d
4b90: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 22 3c  efined by the "<
4ba0: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 61 6e  ", "<=", ">", an
4bb0: 64 20 22 3e 3d 22 20 6f 70 65 72 61 74 6f 72 73  d ">=" operators
4bc0: 0a 2a 2a 20 6f 66 20 65 78 70 72 65 73 73 69 6f  .** of expressio
4bd0: 6e 73 20 61 6e 64 20 66 6f 72 20 69 6e 64 69 63  ns and for indic
4be0: 65 73 2e 20 20 54 68 69 73 20 77 61 73 20 6e 6f  es.  This was no
4bf0: 74 20 74 68 65 20 63 61 73 65 20 66 6f 72 20 76  t the case for v
4c00: 65 72 73 69 6f 6e 0a 2a 2a 20 32 2e 36 2e 33 20  ersion.** 2.6.3 
4c10: 61 6e 64 20 65 61 72 6c 69 65 72 2e 0a 2a 2f 0a  and earlier..*/.
4c20: 69 6e 74 20 73 71 6c 69 74 65 53 6f 72 74 43 6f  int sqliteSortCo
4c30: 6d 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72  mpare(const char
4c40: 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *a, const char 
4c50: 2a 62 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  *b){.  int res =
4c60: 20 30 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41   0;.  int isNumA
4c70: 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69 6e 74 20  , isNumB;.  int 
4c80: 64 69 72 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  dir = 0;..  whil
4c90: 65 28 20 72 65 73 3d 3d 30 20 26 26 20 2a 61 20  e( res==0 && *a 
4ca0: 26 26 20 2a 62 20 29 7b 0a 20 20 20 20 69 66 28  && *b ){.    if(
4cb0: 20 61 5b 30 5d 3d 3d 27 4e 27 20 7c 7c 20 62 5b   a[0]=='N' || b[
4cc0: 30 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20 20 20 20  0]=='N' ){.     
4cd0: 20 69 66 28 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20   if( a[0]==b[0] 
4ce0: 29 7b 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20  ){.        a += 
4cf0: 32 3b 0a 20 20 20 20 20 20 20 20 62 20 2b 3d 20  2;.        b += 
4d00: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
4d10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
4d20: 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d 27 4e 27     if( a[0]=='N'
4d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 72 20   ){.        dir 
4d40: 3d 20 62 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = b[0];.        
4d50: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
4d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
4d70: 69 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  ir = a[0];.     
4d80: 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20     res = +1;.   
4d90: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4db0: 72 74 28 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20 29  rt( a[0]==b[0] )
4dc0: 3b 0a 20 20 20 20 69 66 28 20 28 64 69 72 3d 61  ;.    if( (dir=a
4dd0: 5b 30 5d 29 3d 3d 27 41 27 20 7c 7c 20 61 5b 30  [0])=='A' || a[0
4de0: 5d 3d 3d 27 44 27 20 29 7b 0a 20 20 20 20 20 20  ]=='D' ){.      
4df0: 72 65 73 20 3d 20 73 74 72 63 6d 70 28 26 61 5b  res = strcmp(&a[
4e00: 31 5d 2c 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20  1],&b[1]);.     
4e10: 20 69 66 28 20 72 65 73 20 29 20 62 72 65 61 6b   if( res ) break
4e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4e30: 20 20 20 69 73 4e 75 6d 41 20 3d 20 73 71 6c 69     isNumA = sqli
4e40: 74 65 49 73 4e 75 6d 62 65 72 28 26 61 5b 31 5d  teIsNumber(&a[1]
4e50: 29 3b 0a 20 20 20 20 20 20 69 73 4e 75 6d 42 20  );.      isNumB 
4e60: 3d 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72  = sqliteIsNumber
4e70: 28 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  (&b[1]);.      i
4e80: 66 28 20 69 73 4e 75 6d 41 20 29 7b 0a 20 20 20  f( isNumA ){.   
4e90: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 41 2c 20       double rA, 
4ea0: 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rB;.        if( 
4eb0: 21 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20  !isNumB ){.     
4ec0: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
4ed0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ef0: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 41 74 6f    rA = sqliteAto
4f00: 46 28 26 61 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  F(&a[1], 0);.   
4f10: 20 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65       rB = sqlite
4f20: 41 74 6f 46 28 26 62 5b 31 5d 2c 20 30 29 3b 0a  AtoF(&b[1], 0);.
4f30: 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3c 72          if( rA<r
4f40: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  B ){.          r
4f50: 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
4f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4f80: 72 41 3e 72 42 20 29 7b 0a 20 20 20 20 20 20 20  rA>rB ){.       
4f90: 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20     res = +1;.   
4fa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
4fc0: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 42 20 29  lse if( isNumB )
4fd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
4fe0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  +1;.        brea
4ff0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
5000: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 74          res = st
5010: 72 63 6d 70 28 26 61 5b 31 5d 2c 26 62 5b 31 5d  rcmp(&a[1],&b[1]
5020: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5030: 65 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  es ) break;.    
5040: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 20    }.    }.    a 
5050: 2b 3d 20 73 74 72 6c 65 6e 28 26 61 5b 31 5d 29  += strlen(&a[1])
5060: 20 2b 20 32 3b 0a 20 20 20 20 62 20 2b 3d 20 73   + 2;.    b += s
5070: 74 72 6c 65 6e 28 26 62 5b 31 5d 29 20 2b 20 32  trlen(&b[1]) + 2
5080: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 72 3d  ;.  }.  if( dir=
5090: 3d 27 2d 27 20 7c 7c 20 64 69 72 3d 3d 27 44 27  ='-' || dir=='D'
50a0: 20 29 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20   ) res = -res;. 
50b0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
50c0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 70 6f 77 65 72  /*.** Some power
50d0: 73 20 6f 66 20 36 34 2e 20 20 54 68 65 73 65 20  s of 64.  These 
50e0: 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 6e 65  constants are ne
50f0: 65 64 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73  eded in the.** s
5100: 71 6c 69 74 65 52 65 61 6c 54 6f 53 6f 72 74 61  qliteRealToSorta
5110: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ble() routine be
5120: 6c 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  low..*/.#define 
5130: 5f 36 34 65 33 20 20 28 36 34 2e 30 20 2a 20 36  _64e3  (64.0 * 6
5140: 34 2e 30 20 2a 20 36 34 2e 30 29 0a 23 64 65 66  4.0 * 64.0).#def
5150: 69 6e 65 20 5f 36 34 65 34 20 20 28 36 34 2e 30  ine _64e4  (64.0
5160: 20 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a   * 64.0 * 64.0 *
5170: 20 36 34 2e 30 29 0a 23 64 65 66 69 6e 65 20 5f   64.0).#define _
5180: 36 34 65 31 35 20 28 5f 36 34 65 33 20 2a 20 5f  64e15 (_64e3 * _
5190: 36 34 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f  64e4 * _64e4 * _
51a0: 36 34 65 34 29 0a 23 64 65 66 69 6e 65 20 5f 36  64e4).#define _6
51b0: 34 65 31 36 20 28 5f 36 34 65 34 20 2a 20 5f 36  4e16 (_64e4 * _6
51c0: 34 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36  4e4 * _64e4 * _6
51d0: 34 65 34 29 0a 23 64 65 66 69 6e 65 20 5f 36 34  4e4).#define _64
51e0: 65 36 33 20 28 5f 36 34 65 31 35 20 2a 20 5f 36  e63 (_64e15 * _6
51f0: 34 65 31 36 20 2a 20 5f 36 34 65 31 36 20 2a 20  4e16 * _64e16 * 
5200: 5f 36 34 65 31 36 29 0a 23 64 65 66 69 6e 65 20  _64e16).#define 
5210: 5f 36 34 65 36 34 20 28 5f 36 34 65 31 36 20 2a  _64e64 (_64e16 *
5220: 20 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36   _64e16 * _64e16
5230: 20 2a 20 5f 36 34 65 31 36 29 0a 0a 2f 2a 0a 2a   * _64e16)../*.*
5240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5250: 70 72 6f 63 65 64 75 72 65 20 63 6f 6e 76 65 72  procedure conver
5260: 74 73 20 61 20 64 6f 75 62 6c 65 2d 70 72 65 63  ts a double-prec
5270: 69 73 69 6f 6e 20 66 6c 6f 61 74 69 6e 67 20 70  ision floating p
5280: 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 69  oint.** number i
5290: 6e 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 54  nto a string.  T
52a0: 68 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72  he resulting str
52b0: 69 6e 67 20 68 61 73 20 74 68 65 20 70 72 6f 70  ing has the prop
52c0: 65 72 74 79 20 74 68 61 74 0a 2a 2a 20 74 77 6f  erty that.** two
52d0: 20 73 75 63 68 20 73 74 72 69 6e 67 73 20 63 6f   such strings co
52e0: 6d 70 61 72 69 65 64 20 75 73 69 6e 67 20 73 74  mparied using st
52f0: 72 63 6d 70 28 29 20 6f 72 20 6d 65 6d 63 6d 70  rcmp() or memcmp
5300: 28 29 20 77 69 6c 6c 20 67 69 76 65 20 74 68 65  () will give the
5310: 0a 2a 2a 20 73 61 6d 65 20 72 65 73 75 6c 74 73  .** same results
5320: 20 61 73 20 61 20 6e 75 6d 65 72 69 63 20 63 6f   as a numeric co
5330: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20  mparison of the 
5340: 6f 72 69 67 69 6e 61 6c 20 66 6c 6f 61 74 69 6e  original floatin
5350: 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g point.** numbe
5360: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
5370: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
5380: 6f 20 67 65 6e 65 72 61 74 65 20 64 61 74 61 62  o generate datab
5390: 61 73 65 20 6b 65 79 73 20 66 72 6f 6d 20 66 6c  ase keys from fl
53a0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
53b0: 6e 75 6d 62 65 72 73 20 73 75 63 68 20 74 68 61  numbers such tha
53c0: 74 20 74 68 65 20 6b 65 79 73 20 73 6f 72 74 20  t the keys sort 
53d0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
53e0: 72 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  r as the origina
53f0: 6c 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  l.** floating po
5400: 69 6e 74 20 6e 75 6d 62 65 72 73 20 65 76 65 6e  int numbers even
5410: 20 74 68 6f 75 67 68 20 74 68 65 20 6b 65 79 73   though the keys
5420: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73   are compared us
5430: 69 6e 67 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 2e  ing.** memcmp().
5440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
5450: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  ng function shou
5460: 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
5470: 64 20 61 74 20 6c 65 61 73 74 20 31 34 20 63 68  d at least 14 ch
5480: 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73  aracters.** of s
5490: 70 61 63 65 20 66 6f 72 20 74 68 65 20 62 75 66  pace for the buf
54a0: 66 65 72 20 7a 5b 5d 2e 0a 2a 2f 0a 76 6f 69 64  fer z[]..*/.void
54b0: 20 73 71 6c 69 74 65 52 65 61 6c 54 6f 53 6f 72   sqliteRealToSor
54c0: 74 61 62 6c 65 28 64 6f 75 62 6c 65 20 72 2c 20  table(double r, 
54d0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
54e0: 6e 65 67 3b 0a 20 20 69 6e 74 20 65 78 70 3b 0a  neg;.  int exp;.
54f0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a    int cnt = 0;..
5500: 20 20 2f 2a 20 54 68 69 73 20 61 72 72 61 79 20    /* This array 
5510: 6d 61 70 73 20 69 6e 74 65 67 65 72 73 20 62 65  maps integers be
5520: 74 77 65 65 6e 20 30 20 61 6e 64 20 36 33 20 69  tween 0 and 63 i
5530: 6e 74 6f 20 62 61 73 65 2d 36 34 20 64 69 67 69  nto base-64 digi
5540: 74 73 2e 0a 20 20 2a 2a 20 54 68 65 20 64 69 67  ts..  ** The dig
5550: 69 74 73 20 6d 75 73 74 20 62 65 20 63 68 6f 73  its must be chos
5560: 65 6e 20 73 75 63 68 20 61 74 20 74 68 65 69 72  en such at their
5570: 20 41 53 43 49 49 20 63 6f 64 65 73 20 61 72 65   ASCII codes are
5580: 20 69 6e 63 72 65 61 73 69 6e 67 2e 0a 20 20 2a   increasing..  *
5590: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 77 65 20  * This means we 
55a0: 63 61 6e 20 6e 6f 74 20 75 73 65 20 74 68 65 20  can not use the 
55b0: 74 72 61 64 69 74 69 6f 6e 61 6c 20 62 61 73 65  traditional base
55c0: 2d 36 34 20 64 69 67 69 74 20 73 65 74 2e 20 2a  -64 digit set. *
55d0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
55e0: 20 63 68 61 72 20 7a 44 69 67 69 74 5b 5d 20 3d   char zDigit[] =
55f0: 20 0a 20 20 20 20 20 22 30 31 32 33 34 35 36 37   .     "01234567
5600: 38 39 22 0a 20 20 20 20 20 22 41 42 43 44 45 46  89".     "ABCDEF
5610: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
5620: 57 58 59 5a 22 0a 20 20 20 20 20 22 61 62 63 64  WXYZ".     "abcd
5630: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
5640: 75 76 77 78 79 7a 22 0a 20 20 20 20 20 22 7c 7e  uvwxyz".     "|~
5650: 22 3b 0a 20 20 69 66 28 20 72 3c 30 2e 30 20 29  ";.  if( r<0.0 )
5660: 7b 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20  {.    neg = 1;. 
5670: 20 20 20 72 20 3d 20 2d 72 3b 0a 20 20 20 20 2a     r = -r;.    *
5680: 7a 2b 2b 20 3d 20 27 2d 27 3b 0a 20 20 7d 20 65  z++ = '-';.  } e
5690: 6c 73 65 20 7b 0a 20 20 20 20 6e 65 67 20 3d 20  lse {.    neg = 
56a0: 30 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30  0;.    *z++ = '0
56b0: 27 3b 0a 20 20 7d 0a 20 20 65 78 70 20 3d 20 30  ';.  }.  exp = 0
56c0: 3b 0a 0a 20 20 69 66 28 20 72 3d 3d 30 2e 30 20  ;..  if( r==0.0 
56d0: 29 7b 0a 20 20 20 20 65 78 70 20 3d 20 2d 31 30  ){.    exp = -10
56e0: 32 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  24;.  }else if( 
56f0: 72 3c 28 30 2e 35 2f 36 34 2e 30 29 20 29 7b 0a  r<(0.5/64.0) ){.
5700: 20 20 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30      while( r < 0
5710: 2e 35 2f 5f 36 34 65 36 34 20 26 26 20 65 78 70  .5/_64e64 && exp
5720: 20 3e 20 2d 39 36 31 20 20 29 7b 20 72 20 2a 3d   > -961  ){ r *=
5730: 20 5f 36 34 65 36 34 3b 20 20 65 78 70 20 2d 3d   _64e64;  exp -=
5740: 20 36 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65   64; }.    while
5750: 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 31 36  ( r < 0.5/_64e16
5760: 20 26 26 20 65 78 70 20 3e 20 2d 31 30 30 39 20   && exp > -1009 
5770: 29 7b 20 72 20 2a 3d 20 5f 36 34 65 31 36 3b 20  ){ r *= _64e16; 
5780: 20 65 78 70 20 2d 3d 20 31 36 3b 20 7d 0a 20 20   exp -= 16; }.  
5790: 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e 35    while( r < 0.5
57a0: 2f 5f 36 34 65 34 20 20 26 26 20 65 78 70 20 3e  /_64e4  && exp >
57b0: 20 2d 31 30 32 31 20 29 7b 20 72 20 2a 3d 20 5f   -1021 ){ r *= _
57c0: 36 34 65 34 3b 20 20 20 65 78 70 20 2d 3d 20 34  64e4;   exp -= 4
57d0: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72  ; }.    while( r
57e0: 20 3c 20 30 2e 35 2f 36 34 2e 30 20 20 20 26 26   < 0.5/64.0   &&
57f0: 20 65 78 70 20 3e 20 2d 31 30 32 34 20 29 7b 20   exp > -1024 ){ 
5800: 72 20 2a 3d 20 36 34 2e 30 3b 20 20 20 20 65 78  r *= 64.0;    ex
5810: 70 20 2d 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73  p -= 1; }.  }els
5820: 65 20 69 66 28 20 72 3e 3d 30 2e 35 20 29 7b 0a  e if( r>=0.5 ){.
5830: 20 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d 20      while( r >= 
5840: 30 2e 35 2a 5f 36 34 65 36 33 20 26 26 20 65 78  0.5*_64e63 && ex
5850: 70 20 3c 20 39 36 30 20 20 29 7b 20 72 20 2a 3d  p < 960  ){ r *=
5860: 20 31 2e 30 2f 5f 36 34 65 36 34 3b 20 65 78 70   1.0/_64e64; exp
5870: 20 2b 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68   += 64; }.    wh
5880: 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36  ile( r >= 0.5*_6
5890: 34 65 31 35 20 26 26 20 65 78 70 20 3c 20 31 30  4e15 && exp < 10
58a0: 30 38 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f  08 ){ r *= 1.0/_
58b0: 36 34 65 31 36 3b 20 65 78 70 20 2b 3d 20 31 36  64e16; exp += 16
58c0: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72  ; }.    while( r
58d0: 20 3e 3d 20 30 2e 35 2a 5f 36 34 65 33 20 20 26   >= 0.5*_64e3  &
58e0: 26 20 65 78 70 20 3c 20 31 30 32 30 20 29 7b 20  & exp < 1020 ){ 
58f0: 72 20 2a 3d 20 31 2e 30 2f 5f 36 34 65 34 3b 20  r *= 1.0/_64e4; 
5900: 20 65 78 70 20 2b 3d 20 34 3b 20 7d 0a 20 20 20   exp += 4; }.   
5910: 20 77 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35   while( r >= 0.5
5920: 20 20 20 20 20 20 20 20 26 26 20 65 78 70 20 3c          && exp <
5930: 20 31 30 32 33 20 29 7b 20 72 20 2a 3d 20 31 2e   1023 ){ r *= 1.
5940: 30 2f 36 34 2e 30 3b 20 20 20 65 78 70 20 2b 3d  0/64.0;   exp +=
5950: 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   1; }.  }.  if( 
5960: 6e 65 67 20 29 7b 0a 20 20 20 20 65 78 70 20 3d  neg ){.    exp =
5970: 20 2d 65 78 70 3b 0a 20 20 20 20 72 20 3d 20 2d   -exp;.    r = -
5980: 72 3b 0a 20 20 7d 0a 20 20 65 78 70 20 2b 3d 20  r;.  }.  exp += 
5990: 31 30 32 34 3b 0a 20 20 72 20 2b 3d 20 30 2e 35  1024;.  r += 0.5
59a0: 3b 0a 20 20 69 66 28 20 65 78 70 3c 30 20 29 20  ;.  if( exp<0 ) 
59b0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 65 78  return;.  if( ex
59c0: 70 3e 3d 32 30 34 38 20 7c 7c 20 72 3e 3d 31 2e  p>=2048 || r>=1.
59d0: 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
59e0: 7a 2c 20 22 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e  z, "~~~~~~~~~~~~
59f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
5a00: 20 20 7d 0a 20 20 2a 7a 2b 2b 20 3d 20 7a 44 69    }.  *z++ = zDi
5a10: 67 69 74 5b 28 65 78 70 3e 3e 36 29 26 30 78 33  git[(exp>>6)&0x3
5a20: 66 5d 3b 0a 20 20 2a 7a 2b 2b 20 3d 20 7a 44 69  f];.  *z++ = zDi
5a30: 67 69 74 5b 65 78 70 20 26 20 30 78 33 66 5d 3b  git[exp & 0x3f];
5a40: 0a 20 20 77 68 69 6c 65 28 20 72 3e 30 2e 30 20  .  while( r>0.0 
5a50: 26 26 20 63 6e 74 3c 31 30 20 29 7b 0a 20 20 20  && cnt<10 ){.   
5a60: 20 69 6e 74 20 64 69 67 69 74 3b 0a 20 20 20 20   int digit;.    
5a70: 72 20 2a 3d 20 36 34 2e 30 3b 0a 20 20 20 20 64  r *= 64.0;.    d
5a80: 69 67 69 74 20 3d 20 28 69 6e 74 29 72 3b 0a 20  igit = (int)r;. 
5a90: 20 20 20 61 73 73 65 72 74 28 20 64 69 67 69 74     assert( digit
5aa0: 3e 3d 30 20 26 26 20 64 69 67 69 74 3c 36 34 20  >=0 && digit<64 
5ab0: 29 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 7a 44  );.    *z++ = zD
5ac0: 69 67 69 74 5b 64 69 67 69 74 20 26 20 30 78 33  igit[digit & 0x3
5ad0: 66 5d 3b 0a 20 20 20 20 72 20 2d 3d 20 64 69 67  f];.    r -= dig
5ae0: 69 74 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  it;.    cnt++;. 
5af0: 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a   }.  *z = 0;.}..
5b00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54  #ifdef SQLITE_UT
5b10: 46 38 0a 2f 2a 0a 2a 2a 20 58 20 69 73 20 61 20  F8./*.** X is a 
5b20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
5b30: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 55  irst byte of a U
5b40: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20  TF-8 character. 
5b50: 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 58 20   Increment.** X 
5b60: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
5b70: 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  s to the next ch
5b80: 61 72 61 63 74 65 72 2e 20 20 54 68 69 73 20 6f  aracter.  This o
5b90: 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67 68 74 0a  nly works right.
5ba0: 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74 73 20 74  ** if X points t
5bb0: 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  o a well-formed 
5bc0: 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f  UTF-8 string..*/
5bd0: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 4e  .#define sqliteN
5be0: 65 78 74 43 68 61 72 28 58 29 20 20 77 68 69 6c  extChar(X)  whil
5bf0: 65 28 20 28 30 78 63 30 26 2a 2b 2b 28 58 29 29  e( (0xc0&*++(X))
5c00: 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64 65 66 69  ==0x80 ){}.#defi
5c10: 6e 65 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c  ne sqliteCharVal
5c20: 28 58 29 20 20 20 73 71 6c 69 74 65 5f 75 74 66  (X)   sqlite_utf
5c30: 38 5f 74 6f 5f 69 6e 74 28 58 29 0a 0a 23 65 6c  8_to_int(X)..#el
5c40: 73 65 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  se /* !defined(S
5c50: 51 4c 49 54 45 5f 55 54 46 38 29 20 2a 2f 0a 2f  QLITE_UTF8) */./
5c60: 2a 0a 2a 2a 20 46 6f 72 20 69 73 6f 38 38 35 39  *.** For iso8859
5c70: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 6e   encoding, the n
5c80: 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69 73  ext character is
5c90: 20 6a 75 73 74 20 74 68 65 20 6e 65 78 74 20 62   just the next b
5ca0: 79 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  yte..*/.#define 
5cb0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58  sqliteNextChar(X
5cc0: 29 20 20 28 2b 2b 28 58 29 29 3b 0a 23 64 65 66  )  (++(X));.#def
5cd0: 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72 56 61  ine sqliteCharVa
5ce0: 6c 28 58 29 20 20 20 28 28 69 6e 74 29 2a 28 58  l(X)   ((int)*(X
5cf0: 29 29 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ))..#endif /* de
5d00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
5d10: 38 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53  8) */...#ifdef S
5d20: 51 4c 49 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a 2a  QLITE_UTF8./*.**
5d30: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 55 54 46   Convert the UTF
5d40: 2d 38 20 63 68 61 72 61 63 74 65 72 20 74 6f 20  -8 character to 
5d50: 77 68 69 63 68 20 7a 20 70 6f 69 6e 74 73 20 69  which z points i
5d60: 6e 74 6f 20 61 20 33 31 2d 62 69 74 0a 2a 2a 20  nto a 31-bit.** 
5d70: 55 43 53 20 63 68 61 72 61 63 74 65 72 2e 20 20  UCS character.  
5d80: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
5d90: 72 69 67 68 74 20 69 66 20 7a 20 70 6f 69 6e 74  right if z point
5da0: 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  s to a well-form
5db0: 65 64 0a 2a 2a 20 55 54 46 2d 38 20 73 74 72 69  ed.** UTF-8 stri
5dc0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5dd0: 74 20 73 71 6c 69 74 65 5f 75 74 66 38 5f 74 6f  t sqlite_utf8_to
5de0: 5f 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67  _int(const unsig
5df0: 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ned char *z){.  
5e00: 69 6e 74 20 63 3b 0a 20 20 73 74 61 74 69 63 20  int c;.  static 
5e10: 63 6f 6e 73 74 20 69 6e 74 20 69 6e 69 74 56 61  const int initVa
5e20: 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  l[] = {.      0,
5e30: 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20     1,   2,   3, 
5e40: 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20    4,   5,   6,  
5e50: 20 37 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31   7,   8,   9,  1
5e60: 30 2c 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33  0,  11,  12,  13
5e70: 2c 20 20 31 34 2c 0a 20 20 20 20 20 31 35 2c 20  ,  14,.     15, 
5e80: 20 31 36 2c 20 20 31 37 2c 20 20 31 38 2c 20 20   16,  17,  18,  
5e90: 31 39 2c 20 20 32 30 2c 20 20 32 31 2c 20 20 32  19,  20,  21,  2
5ea0: 32 2c 20 20 32 33 2c 20 20 32 34 2c 20 20 32 35  2,  23,  24,  25
5eb0: 2c 20 20 32 36 2c 20 20 32 37 2c 20 20 32 38 2c  ,  26,  27,  28,
5ec0: 20 20 32 39 2c 0a 20 20 20 20 20 33 30 2c 20 20    29,.     30,  
5ed0: 33 31 2c 20 20 33 32 2c 20 20 33 33 2c 20 20 33  31,  32,  33,  3
5ee0: 34 2c 20 20 33 35 2c 20 20 33 36 2c 20 20 33 37  4,  35,  36,  37
5ef0: 2c 20 20 33 38 2c 20 20 33 39 2c 20 20 34 30 2c  ,  38,  39,  40,
5f00: 20 20 34 31 2c 20 20 34 32 2c 20 20 34 33 2c 20    41,  42,  43, 
5f10: 20 34 34 2c 0a 20 20 20 20 20 34 35 2c 20 20 34   44,.     45,  4
5f20: 36 2c 20 20 34 37 2c 20 20 34 38 2c 20 20 34 39  6,  47,  48,  49
5f30: 2c 20 20 35 30 2c 20 20 35 31 2c 20 20 35 32 2c  ,  50,  51,  52,
5f40: 20 20 35 33 2c 20 20 35 34 2c 20 20 35 35 2c 20    53,  54,  55, 
5f50: 20 35 36 2c 20 20 35 37 2c 20 20 35 38 2c 20 20   56,  57,  58,  
5f60: 35 39 2c 0a 20 20 20 20 20 36 30 2c 20 20 36 31  59,.     60,  61
5f70: 2c 20 20 36 32 2c 20 20 36 33 2c 20 20 36 34 2c  ,  62,  63,  64,
5f80: 20 20 36 35 2c 20 20 36 36 2c 20 20 36 37 2c 20    65,  66,  67, 
5f90: 20 36 38 2c 20 20 36 39 2c 20 20 37 30 2c 20 20   68,  69,  70,  
5fa0: 37 31 2c 20 20 37 32 2c 20 20 37 33 2c 20 20 37  71,  72,  73,  7
5fb0: 34 2c 0a 20 20 20 20 20 37 35 2c 20 20 37 36 2c  4,.     75,  76,
5fc0: 20 20 37 37 2c 20 20 37 38 2c 20 20 37 39 2c 20    77,  78,  79, 
5fd0: 20 38 30 2c 20 20 38 31 2c 20 20 38 32 2c 20 20   80,  81,  82,  
5fe0: 38 33 2c 20 20 38 34 2c 20 20 38 35 2c 20 20 38  83,  84,  85,  8
5ff0: 36 2c 20 20 38 37 2c 20 20 38 38 2c 20 20 38 39  6,  87,  88,  89
6000: 2c 0a 20 20 20 20 20 39 30 2c 20 20 39 31 2c 20  ,.     90,  91, 
6010: 20 39 32 2c 20 20 39 33 2c 20 20 39 34 2c 20 20   92,  93,  94,  
6020: 39 35 2c 20 20 39 36 2c 20 20 39 37 2c 20 20 39  95,  96,  97,  9
6030: 38 2c 20 20 39 39 2c 20 31 30 30 2c 20 31 30 31  8,  99, 100, 101
6040: 2c 20 31 30 32 2c 20 31 30 33 2c 20 31 30 34 2c  , 102, 103, 104,
6050: 0a 20 20 20 20 31 30 35 2c 20 31 30 36 2c 20 31  .    105, 106, 1
6060: 30 37 2c 20 31 30 38 2c 20 31 30 39 2c 20 31 31  07, 108, 109, 11
6070: 30 2c 20 31 31 31 2c 20 31 31 32 2c 20 31 31 33  0, 111, 112, 113
6080: 2c 20 31 31 34 2c 20 31 31 35 2c 20 31 31 36 2c  , 114, 115, 116,
6090: 20 31 31 37 2c 20 31 31 38 2c 20 31 31 39 2c 0a   117, 118, 119,.
60a0: 20 20 20 20 31 32 30 2c 20 31 32 31 2c 20 31 32      120, 121, 12
60b0: 32 2c 20 31 32 33 2c 20 31 32 34 2c 20 31 32 35  2, 123, 124, 125
60c0: 2c 20 31 32 36 2c 20 31 32 37 2c 20 31 32 38 2c  , 126, 127, 128,
60d0: 20 31 32 39 2c 20 31 33 30 2c 20 31 33 31 2c 20   129, 130, 131, 
60e0: 31 33 32 2c 20 31 33 33 2c 20 31 33 34 2c 0a 20  132, 133, 134,. 
60f0: 20 20 20 31 33 35 2c 20 31 33 36 2c 20 31 33 37     135, 136, 137
6100: 2c 20 31 33 38 2c 20 31 33 39 2c 20 31 34 30 2c  , 138, 139, 140,
6110: 20 31 34 31 2c 20 31 34 32 2c 20 31 34 33 2c 20   141, 142, 143, 
6120: 31 34 34 2c 20 31 34 35 2c 20 31 34 36 2c 20 31  144, 145, 146, 1
6130: 34 37 2c 20 31 34 38 2c 20 31 34 39 2c 0a 20 20  47, 148, 149,.  
6140: 20 20 31 35 30 2c 20 31 35 31 2c 20 31 35 32 2c    150, 151, 152,
6150: 20 31 35 33 2c 20 31 35 34 2c 20 31 35 35 2c 20   153, 154, 155, 
6160: 31 35 36 2c 20 31 35 37 2c 20 31 35 38 2c 20 31  156, 157, 158, 1
6170: 35 39 2c 20 31 36 30 2c 20 31 36 31 2c 20 31 36  59, 160, 161, 16
6180: 32 2c 20 31 36 33 2c 20 31 36 34 2c 0a 20 20 20  2, 163, 164,.   
6190: 20 31 36 35 2c 20 31 36 36 2c 20 31 36 37 2c 20   165, 166, 167, 
61a0: 31 36 38 2c 20 31 36 39 2c 20 31 37 30 2c 20 31  168, 169, 170, 1
61b0: 37 31 2c 20 31 37 32 2c 20 31 37 33 2c 20 31 37  71, 172, 173, 17
61c0: 34 2c 20 31 37 35 2c 20 31 37 36 2c 20 31 37 37  4, 175, 176, 177
61d0: 2c 20 31 37 38 2c 20 31 37 39 2c 0a 20 20 20 20  , 178, 179,.    
61e0: 31 38 30 2c 20 31 38 31 2c 20 31 38 32 2c 20 31  180, 181, 182, 1
61f0: 38 33 2c 20 31 38 34 2c 20 31 38 35 2c 20 31 38  83, 184, 185, 18
6200: 36 2c 20 31 38 37 2c 20 31 38 38 2c 20 31 38 39  6, 187, 188, 189
6210: 2c 20 31 39 30 2c 20 31 39 31 2c 20 20 20 30 2c  , 190, 191,   0,
6220: 20 20 20 31 2c 20 20 20 32 2c 0a 20 20 20 20 20     1,   2,.     
6230: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
6240: 36 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39  6,   7,   8,   9
6250: 2c 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c  ,  10,  11,  12,
6260: 20 20 31 33 2c 20 20 31 34 2c 20 20 31 35 2c 20    13,  14,  15, 
6270: 20 31 36 2c 20 20 31 37 2c 0a 20 20 20 20 20 31   16,  17,.     1
6280: 38 2c 20 20 31 39 2c 20 20 32 30 2c 20 20 32 31  8,  19,  20,  21
6290: 2c 20 20 32 32 2c 20 20 32 33 2c 20 20 32 34 2c  ,  22,  23,  24,
62a0: 20 20 32 35 2c 20 20 32 36 2c 20 20 32 37 2c 20    25,  26,  27, 
62b0: 20 32 38 2c 20 20 32 39 2c 20 20 33 30 2c 20 20   28,  29,  30,  
62c0: 33 31 2c 20 20 20 30 2c 0a 20 20 20 20 20 20 31  31,   0,.      1
62d0: 2c 20 20 20 32 2c 20 20 20 33 2c 20 20 20 34 2c  ,   2,   3,   4,
62e0: 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20     5,   6,   7, 
62f0: 20 20 38 2c 20 20 20 39 2c 20 20 31 30 2c 20 20    8,   9,  10,  
6300: 31 31 2c 20 20 31 32 2c 20 20 31 33 2c 20 20 31  11,  12,  13,  1
6310: 34 2c 20 20 31 35 2c 0a 20 20 20 20 20 20 30 2c  4,  15,.      0,
6320: 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20     1,   2,   3, 
6330: 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20    4,   5,   6,  
6340: 20 37 2c 20 20 20 30 2c 20 20 20 31 2c 20 20 20   7,   0,   1,   
6350: 32 2c 20 20 20 33 2c 20 20 20 30 2c 20 20 20 31  2,   3,   0,   1
6360: 2c 20 32 35 34 2c 0a 20 20 20 20 32 35 35 2c 0a  , 254,.    255,.
6370: 20 20 7d 3b 0a 20 20 63 20 3d 20 69 6e 69 74 56    };.  c = initV
6380: 61 6c 5b 2a 28 7a 2b 2b 29 5d 3b 0a 20 20 77 68  al[*(z++)];.  wh
6390: 69 6c 65 28 20 28 30 78 63 30 26 2a 7a 29 3d 3d  ile( (0xc0&*z)==
63a0: 30 78 38 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  0x80 ){.    c = 
63b0: 28 63 3c 3c 36 29 20 7c 20 28 30 78 33 66 26 2a  (c<<6) | (0x3f&*
63c0: 28 7a 2b 2b 29 29 3b 0a 20 20 7d 0a 20 20 72 65  (z++));.  }.  re
63d0: 74 75 72 6e 20 63 3b 0a 7d 0a 23 65 6e 64 69 66  turn c;.}.#endif
63e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
63f0: 74 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67  two UTF-8 string
6400: 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77  s for equality w
6410: 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73  here the first s
6420: 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74  tring can.** pot
6430: 65 6e 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67  entially be a "g
6440: 6c 6f 62 22 20 65 78 70 72 65 73 73 69 6f 6e 2e  lob" expression.
6450: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 31    Return true (1
6460: 29 20 69 66 20 74 68 65 79 0a 2a 2a 20 61 72 65  ) if they.** are
6470: 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20 66 61   the same and fa
6480: 6c 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20  lse (0) if they 
6490: 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a  are different..*
64a0: 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75  *.** Globbing ru
64b0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
64c0: 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '*'       Matche
64d0: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
64e0: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  f zero or more c
64f0: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
6500: 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20        '?'       
6510: 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20  Matches exactly 
6520: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  one character..*
6530: 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20  *.**     [...]  
6540: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
6550: 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74  character from t
6560: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
6570: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
6580: 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73        characters
6590: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e  ..**.**     [^..
65a0: 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  .]     Matches o
65b0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ne character not
65c0: 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   in the enclosed
65d0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74   list..**.** Wit
65e0: 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20  h the [...] and 
65f0: 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c  [^...] matching,
6600: 20 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72   a ']' character
6610: 20 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64   can be included
6620: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20  .** in the list 
6630: 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65  by making it the
6640: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
6650: 20 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e   after '[' or '^
6660: 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f  '.  A.** range o
6670: 66 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e  f characters can
6680: 20 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73   be specified us
6690: 69 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c  ing '-'.  Exampl
66a0: 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61  e:.** "[a-z]" ma
66b0: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
66c0: 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74   lower-case lett
66d0: 65 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20  er.  To match a 
66e0: 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  '-', make.** it 
66f0: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
6700: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  er in the list..
6710: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6720: 6e 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75  ne is usually qu
6730: 69 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20  ick, but can be 
6740: 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73  N**2 in the wors
6750: 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69  t case..**.** Hi
6760: 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a  nts: to match '*
6770: 27 20 6f 72 20 27 3f 27 2c 20 70 75 74 20 74 68  ' or '?', put th
6780: 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b  em in "[]".  Lik
6790: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
67a0: 20 20 20 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20        abc[*]xyz 
67b0: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 22         Matches "
67c0: 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f  abc*xyz" only.*/
67d0: 0a 69 6e 74 20 0a 73 71 6c 69 74 65 47 6c 6f 62  .int .sqliteGlob
67e0: 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75 6e  Compare(const un
67f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61  signed char *zPa
6800: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73  ttern, const uns
6810: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72  igned char *zStr
6820: 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65 72  ing){.  register
6830: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 6e   int c;.  int in
6840: 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
6850: 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77  ;.  int c2;..  w
6860: 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a 50 61 74  hile( (c = *zPat
6870: 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  tern)!=0 ){.    
6880: 73 77 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20  switch( c ){.   
6890: 20 20 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20     case '*':.   
68a0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a       while( (c=z
68b0: 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27  Pattern[1]) == '
68c0: 2a 27 20 7c 7c 20 63 20 3d 3d 20 27 3f 27 20 29  *' || c == '?' )
68d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
68e0: 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  c=='?' ){.      
68f0: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69        if( *zStri
6900: 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ng==0 ) return 0
6910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
6920: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
6930: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
6940: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61   }.          zPa
6950: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
6960: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
6970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6980: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
6990: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
69a0: 77 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20  while( *zString 
69b0: 26 26 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d  && sqliteGlobCom
69c0: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
69d0: 5d 2c 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b  ],zString)==0 ){
69e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
69f0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
6a00: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
6a10: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  }.          retu
6a20: 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a  rn *zString!=0;.
6a30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6a40: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
6a50: 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21  (c2 = *zString)!
6a60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6a70: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
6a80: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63   && c2 != c ){ c
6a90: 32 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20  2 = *++zString; 
6aa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
6ab0: 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
6ac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6ad0: 69 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f  if( sqliteGlobCo
6ae0: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
6af0: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
6b00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6b10: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
6b20: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6b40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
6b60: 65 20 27 3f 27 3a 20 7b 0a 20 20 20 20 20 20 20  e '?': {.       
6b70: 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30   if( *zString==0
6b80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6b90: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
6ba0: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
6bb0: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
6bc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
6be0: 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20  ase '[': {.     
6bf0: 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
6c00: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   0;.        seen
6c10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
6c20: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
6c30: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72    c = sqliteChar
6c40: 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  Val(zString);.  
6c50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
6c60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6c70: 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74     c2 = *++zPatt
6c80: 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ern;.        if(
6c90: 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65   c2=='^' ){ inve
6ca0: 72 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b  rt = 1; c2 = *++
6cb0: 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20  zPattern; }.    
6cc0: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
6cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6ce0: 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
6cf0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32   1;.          c2
6d00: 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a   = *++zPattern;.
6d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6d20: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
6d30: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61  qliteCharVal(zPa
6d40: 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32  ttern))!=0 && c2
6d50: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
6d60: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
6d70: 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27  & zPattern[1]!='
6d80: 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31  ]' && zPattern[1
6d90: 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
6da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6db0: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6dc0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
6dd0: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
6de0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
6df0: 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f     if( c>=prior_
6e00: 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65  c && c<=c2 ) see
6e10: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
6e20: 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a     prior_c = 0;.
6e30: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
6e40: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
6e50: 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
6e60: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
6e70: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
6e80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6e90: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
6ea0: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
6eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
6ec0: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61  liteNextChar(zPa
6ed0: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
6ee0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
6ef0: 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
6f00: 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
6f10: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71  rn 0;.        sq
6f20: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
6f30: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  ring);.        z
6f40: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20  Pattern++;.     
6f50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6f60: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
6f70: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   {.        if( c
6f80: 20 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72   != *zString ) r
6f90: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
6fa0: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6fb0: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
6fc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6fd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6fe0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
6ff0: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
7000: 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d  Compare two UTF-
7010: 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71  8 strings for eq
7020: 75 61 6c 69 74 79 20 75 73 69 6e 67 20 74 68 65  uality using the
7030: 20 22 4c 49 4b 45 22 20 6f 70 65 72 61 74 6f 72   "LIKE" operator
7040: 20 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20 54 68 65   of.** SQL.  The
7050: 20 27 25 27 20 63 68 61 72 61 63 74 65 72 20 6d   '%' character m
7060: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
7070: 6e 63 65 20 6f 66 20 30 20 6f 72 20 6d 6f 72 65  nce of 0 or more
7080: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61  .** characters a
7090: 6e 64 20 27 5f 27 20 6d 61 74 63 68 65 73 20 61  nd '_' matches a
70a0: 6e 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63  ny single charac
70b0: 74 65 72 2e 20 20 43 61 73 65 20 69 73 0a 2a 2a  ter.  Case is.**
70c0: 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74   not significant
70d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
70e0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 6e 20  tine is just an 
70f0: 61 64 61 70 74 61 74 69 6f 6e 20 6f 66 20 74 68  adaptation of th
7100: 65 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70  e sqliteGlobComp
7110: 61 72 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  are().** routine
7120: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20 0a   above..*/.int .
7130: 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d 70 61 72  sqliteLikeCompar
7140: 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  e(const unsigned
7150: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c   char *zPattern,
7160: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7170: 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a  char *zString){.
7180: 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63    register int c
7190: 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77  ;.  int c2;..  w
71a0: 68 69 6c 65 28 20 28 63 20 3d 20 55 70 70 65 72  hile( (c = Upper
71b0: 54 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74 74 65 72  ToLower[*zPatter
71c0: 6e 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77  n])!=0 ){.    sw
71d0: 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20  itch( c ){.     
71e0: 20 63 61 73 65 20 27 25 27 3a 20 7b 0a 20 20 20   case '%': {.   
71f0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a       while( (c=z
7200: 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27  Pattern[1]) == '
7210: 25 27 20 7c 7c 20 63 20 3d 3d 20 27 5f 27 20 29  %' || c == '_' )
7220: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7230: 63 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20 20 20  c=='_' ){.      
7240: 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69        if( *zStri
7250: 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ng==0 ) return 0
7260: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
7270: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
7280: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20  ring);.         
7290: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61   }.          zPa
72a0: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
72b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
72c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
72d0: 20 20 20 20 20 20 20 20 63 20 3d 20 55 70 70 65          c = Uppe
72e0: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
72f0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 3d       while( (c2=
7300: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53  UpperToLower[*zS
7310: 74 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20  tring])!=0 ){.  
7320: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
7330: 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  2 != 0 && c2 != 
7340: 63 20 29 7b 20 63 32 20 3d 20 55 70 70 65 72 54  c ){ c2 = UpperT
7350: 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72 69 6e  oLower[*++zStrin
7360: 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  g]; }.          
7370: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
7380: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
7390: 69 66 28 20 73 71 6c 69 74 65 4c 69 6b 65 43 6f  if( sqliteLikeCo
73a0: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
73b0: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
73c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
73d0: 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72    sqliteNextChar
73e0: 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  (zString);.     
73f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
7400: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
7410: 20 20 20 20 20 63 61 73 65 20 27 5f 27 3a 20 7b       case '_': {
7420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53  .        if( *zS
7430: 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72  tring==0 ) retur
7440: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 0;.        sql
7450: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
7460: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ing);.        zP
7470: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
7480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7490: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
74a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
74b0: 21 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  != UpperToLower[
74c0: 2a 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75  *zString] ) retu
74d0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 50  rn 0;.        zP
74e0: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
74f0: 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20    zString++;.   
7500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7510: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7520: 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d  return *zString=
7530: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  =0;.}../*.** Cha
7540: 6e 67 65 20 74 68 65 20 73 71 6c 69 74 65 2e 6d  nge the sqlite.m
7550: 61 67 69 63 20 66 72 6f 6d 20 53 51 4c 49 54 45  agic from SQLITE
7560: 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 74 6f 20 53  _MAGIC_OPEN to S
7570: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
7580: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  ..** Return an e
7590: 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  rror (non-zero) 
75a0: 69 66 20 74 68 65 20 6d 61 67 69 63 20 77 61 73  if the magic was
75b0: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47 49   not SQLITE_MAGI
75c0: 43 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65 6e 20 74  C_OPEN.** when t
75d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
75e0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
75f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 61  s routine is a a
7600: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 63 74  ttempt to detect
7610: 20 69 66 20 74 77 6f 20 74 68 72 65 61 64 73 20   if two threads 
7620: 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
7630: 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 20  sqlite* pointer 
7640: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
7650: 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61  .  There is a ra
7660: 63 65 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ce .** condition
7670: 20 73 6f 20 69 74 20 69 73 20 70 6f 73 73 69 62   so it is possib
7680: 6c 65 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  le that the erro
7690: 72 20 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65  r is not detecte
76a0: 64 2e 0a 2a 2a 20 42 75 74 20 75 73 75 61 6c 6c  d..** But usuall
76b0: 79 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 69  y the problem wi
76c0: 6c 6c 20 62 65 20 73 65 65 6e 2e 20 20 54 68 65  ll be seen.  The
76d0: 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20   result will be 
76e0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 77 68 69 63  an.** error whic
76f0: 68 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  h can be used to
7700: 20 64 65 62 75 67 20 74 68 65 20 61 70 70 6c 69   debug the appli
7710: 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73 0a 2a  cation that is.*
7720: 2a 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 69  * using SQLite i
7730: 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a  ncorrectly..**.*
7740: 2a 20 54 69 63 6b 65 74 20 23 32 30 32 3a 20 20  * Ticket #202:  
7750: 49 66 20 64 62 2d 3e 6d 61 67 69 63 20 69 73 20  If db->magic is 
7760: 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f 70 65 6e  not a valid open
7770: 20 76 61 6c 75 65 2c 20 74 61 6b 65 20 63 61 72   value, take car
7780: 65 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d 6f 64 69  e not.** to modi
7790: 66 79 20 74 68 65 20 64 62 20 73 74 72 75 63 74  fy the db struct
77a0: 75 72 65 20 61 74 20 61 6c 6c 2e 20 20 49 74 20  ure at all.  It 
77b0: 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 64 62  could be that db
77c0: 20 69 73 20 61 20 73 74 61 6c 65 0a 2a 2a 20 70   is a stale.** p
77d0: 6f 69 6e 74 65 72 2e 20 20 49 6e 20 6f 74 68 65  ointer.  In othe
77e0: 72 20 77 6f 72 64 73 2c 20 69 74 20 63 6f 75 6c  r words, it coul
77f0: 64 20 62 65 20 74 68 61 74 20 74 68 65 72 65 20  d be that there 
7800: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
7810: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
7820: 74 65 5f 63 6c 6f 73 65 28 64 62 29 20 61 6e 64  te_close(db) and
7830: 20 64 62 20 68 61 73 20 62 65 65 6e 20 64 65 61   db has been dea
7840: 6c 6c 6f 63 61 74 65 64 2e 20 20 41 6e 64 20 77  llocated.  And w
7850: 65 20 64 6f 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74  e do.** not want
7860: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 64   to write into d
7870: 65 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72  eallocated memor
7880: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
7890: 53 61 66 65 74 79 4f 6e 28 73 71 6c 69 74 65 20  SafetyOn(sqlite 
78a0: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
78b0: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
78c0: 47 49 43 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GIC_OPEN ){.    
78d0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
78e0: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
78f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7900: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6d 61 67  else if( db->mag
7910: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
7920: 5f 42 55 53 59 20 7c 7c 20 64 62 2d 3e 6d 61 67  _BUSY || db->mag
7930: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
7940: 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20  _ERROR.         
7950: 20 20 20 20 7c 7c 20 64 62 2d 3e 77 61 6e 74 5f      || db->want_
7960: 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20 20 20 20  to_close ){.    
7970: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
7980: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
7990: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
79a0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70   SQLITE_Interrup
79b0: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
79c0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  1;.}../*.** Chan
79d0: 67 65 20 74 68 65 20 6d 61 67 69 63 20 66 72 6f  ge the magic fro
79e0: 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  m SQLITE_MAGIC_B
79f0: 55 53 59 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  USY to SQLITE_MA
7a00: 47 49 43 5f 4f 50 45 4e 2e 0a 2a 2a 20 52 65 74  GIC_OPEN..** Ret
7a10: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e 6f  urn an error (no
7a20: 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 6d  n-zero) if the m
7a30: 61 67 69 63 20 77 61 73 20 6e 6f 74 20 53 51 4c  agic was not SQL
7a40: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 0a 2a  ITE_MAGIC_BUSY.*
7a50: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
7a60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
7a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 61 66 65  /.int sqliteSafe
7a80: 74 79 4f 66 66 28 73 71 6c 69 74 65 20 2a 64 62  tyOff(sqlite *db
7a90: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67  ){.  if( db->mag
7aa0: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
7ab0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 64 62 2d  _BUSY ){.    db-
7ac0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7ad0: 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 20 20  MAGIC_OPEN;.    
7ae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
7af0: 65 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d  e if( db->magic=
7b00: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50  =SQLITE_MAGIC_OP
7b10: 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67 69 63 3d  EN || db->magic=
7b20: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52  =SQLITE_MAGIC_ER
7b30: 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ROR.            
7b40: 20 7c 7c 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f   || db->want_to_
7b50: 63 6c 6f 73 65 20 29 7b 0a 20 20 20 20 64 62 2d  close ){.    db-
7b60: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7b70: 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 20  MAGIC_ERROR;.   
7b80: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
7b90: 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a  LITE_Interrupt;.
7ba0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
7bc0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61  o make sure we a
7bd0: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
7be0: 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20 73 71   executing an sq
7bf0: 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2a 20  lite_exec()..** 
7c00: 49 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  If we are curren
7c10: 74 6c 79 20 69 6e 20 61 6e 20 73 71 6c 69 74 65  tly in an sqlite
7c20: 5f 65 78 65 63 28 29 2c 20 72 65 74 75 72 6e 20  _exec(), return 
7c30: 74 72 75 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  true and set.** 
7c40: 73 71 6c 69 74 65 2e 6d 61 67 69 63 20 74 6f 20  sqlite.magic to 
7c50: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
7c60: 4f 52 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  OR.  This will c
7c70: 61 75 73 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a  ause a complete.
7c80: 2a 2a 20 73 68 75 74 64 6f 77 6e 20 6f 66 20 74  ** shutdown of t
7c90: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
7ca0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7cb0: 69 73 20 75 73 65 64 20 74 6f 20 74 72 79 20 74  is used to try t
7cc0: 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 41 50  o detect when AP
7cd0: 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
7ce0: 61 6c 6c 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  alled.** at the 
7cf0: 77 72 6f 6e 67 20 74 69 6d 65 20 6f 72 20 69 6e  wrong time or in
7d00: 20 74 68 65 20 77 72 6f 6e 67 20 73 65 71 75 65   the wrong seque
7d10: 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nce..*/.int sqli
7d20: 74 65 53 61 66 65 74 79 43 68 65 63 6b 28 73 71  teSafetyCheck(sq
7d30: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
7d40: 20 64 62 2d 3e 70 56 64 62 65 21 3d 30 20 29 7b   db->pVdbe!=0 ){
7d50: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
7d60: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
7d70: 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
7d80: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
7d90: 30 3b 0a 7d 0a                                   0;.}.