/ Hex Artifact Content
Login

Artifact 122bc174f6c8c2eb6a9127d9f13c4c74f83b85e4:


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: 34 20 32 30 30 34 2f 30 32 2f 32 32 20 31 37 3a  4 2004/02/22 17:
0230: 34 39 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  49:34 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 2f 2a 0a 2a 2a 20 41 64 64  p);.}../*.** Add
26a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26b0: 65 20 74 6f 20 70 50 61 72 73 65 2d 3e 7a 45 72  e to pParse->zEr
26c0: 72 4d 73 67 20 61 6e 64 20 69 6e 63 72 65 6d 65  rMsg and increme
26d0: 6e 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2e  nt pParse->nErr.
26e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
26f0: 67 20 66 6f 72 6d 61 74 74 69 6e 67 20 63 68 61  g formatting cha
2700: 72 61 63 74 65 72 73 20 61 72 65 20 61 6c 6c 6f  racters are allo
2710: 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  wed:.**.**      
2720: 25 73 20 20 20 20 20 20 49 6e 73 65 72 74 20 61  %s      Insert a
2730: 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20   string.**      
2740: 25 7a 20 20 20 20 20 20 41 20 73 74 72 69 6e 67  %z      A string
2750: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
2760: 66 72 65 65 64 20 61 66 74 65 72 20 75 73 65 0a  freed after use.
2770: 2a 2a 20 20 20 20 20 20 25 64 20 20 20 20 20 20  **      %d      
2780: 49 6e 73 65 72 74 20 61 6e 20 69 6e 74 65 67 65  Insert an intege
2790: 72 0a 2a 2a 20 20 20 20 20 20 25 54 20 20 20 20  r.**      %T    
27a0: 20 20 49 6e 73 65 72 74 20 61 20 74 6f 6b 65 6e    Insert a token
27b0: 0a 2a 2a 20 20 20 20 20 20 25 53 20 20 20 20 20  .**      %S     
27c0: 20 49 6e 73 65 72 74 20 74 68 65 20 66 69 72 73   Insert the firs
27d0: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 20 53  t element of a S
27e0: 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
27f0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 50 61  qliteErrorMsg(Pa
2800: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
2810: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2820: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2830: 74 20 61 70 3b 0a 20 20 70 50 61 72 73 65 2d 3e  t ap;.  pParse->
2840: 6e 45 72 72 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nErr++;.  sqlite
2850: 46 72 65 65 28 70 50 61 72 73 65 2d 3e 7a 45 72  Free(pParse->zEr
2860: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
2870: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2880: 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73    pParse->zErrMs
2890: 67 20 3d 20 73 71 6c 69 74 65 56 4d 50 72 69 6e  g = sqliteVMPrin
28a0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
28b0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
28c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
28d0: 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71 75 6f  an SQL-style quo
28e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ted string into 
28f0: 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e 67 20  a normal string 
2900: 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74  by removing.** t
2910: 68 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  he quote charact
2920: 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76 65 72  ers.  The conver
2930: 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d  sion is done in-
2940: 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65 0a 2a  place.  If the.*
2950: 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e 6f 74  * input does not
2960: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 71 75   begin with a qu
2970: 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c 20 74  ote character, t
2980: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2990: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  .** is a no-op..
29a0: 2a 2a 0a 2a 2a 20 32 30 30 32 2d 46 65 62 2d 31  **.** 2002-Feb-1
29b0: 34 3a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  4: This routine 
29c0: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72  is extended to r
29d0: 65 6d 6f 76 65 20 4d 53 2d 41 63 63 65 73 73 20  emove MS-Access 
29e0: 73 74 79 6c 65 0a 2a 2a 20 62 72 61 63 6b 65 74  style.** bracket
29f0: 73 20 66 72 6f 6d 20 61 72 6f 75 6e 64 20 69 64  s from around id
2a00: 65 6e 74 69 66 65 72 73 2e 20 20 46 6f 72 20 65  entifers.  For e
2a10: 78 61 6d 70 6c 65 3a 20 20 22 5b 61 2d 62 2d 63  xample:  "[a-b-c
2a20: 5d 22 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 22 61  ]" becomes.** "a
2a30: 2d 62 2d 63 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -b-c"..*/.void s
2a40: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 63 68 61  qliteDequote(cha
2a50: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 71 75 6f  r *z){.  int quo
2a60: 74 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  te;.  int i, j;.
2a70: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
2a80: 75 72 6e 3b 0a 20 20 71 75 6f 74 65 20 3d 20 7a  urn;.  quote = z
2a90: 5b 30 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 71  [0];.  switch( q
2aa0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  uote ){.    case
2ab0: 20 27 5c 27 27 3a 20 20 62 72 65 61 6b 3b 0a 20   '\'':  break;. 
2ac0: 20 20 20 63 61 73 65 20 27 22 27 3a 20 20 20 62     case '"':   b
2ad0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27  reak;.    case '
2ae0: 5b 27 3a 20 20 20 71 75 6f 74 65 20 3d 20 27 5d  [':   quote = ']
2af0: 27 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  ';  break;.    d
2b00: 65 66 61 75 6c 74 3a 20 20 20 20 72 65 74 75 72  efault:    retur
2b10: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 31  n;.  }.  for(i=1
2b20: 2c 20 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  , j=0; z[i]; i++
2b30: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
2b40: 3d 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  =quote ){.      
2b50: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74  if( z[i+1]==quot
2b60: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  e ){.        z[j
2b70: 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  ++] = quote;.   
2b80: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
2ba0: 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [j++] = 0;.     
2bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bc0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2bd0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
2be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2bf0: 2a 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * An array to ma
2c00: 70 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65  p all upper-case
2c10: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
2c20: 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
2c30: 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61  ding.** lower-ca
2c40: 73 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a  se character. .*
2c50: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
2c60: 64 20 63 68 61 72 20 55 70 70 65 72 54 6f 4c 6f  d char UpperToLo
2c70: 77 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  wer[] = {.      
2c80: 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
2c90: 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20  4,  5,  6,  7,  
2ca0: 38 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31  8,  9, 10, 11, 1
2cb0: 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31  2, 13, 14, 15, 1
2cc0: 36 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20  6, 17,.     18, 
2cd0: 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20  19, 20, 21, 22, 
2ce0: 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20  23, 24, 25, 26, 
2cf0: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
2d00: 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20  31, 32, 33, 34, 
2d10: 33 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c  35,.     36, 37,
2d20: 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c   38, 39, 40, 41,
2d30: 20 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c   42, 43, 44, 45,
2d40: 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c   46, 47, 48, 49,
2d50: 20 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c   50, 51, 52, 53,
2d60: 0a 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36  .     54, 55, 56
2d70: 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30  , 57, 58, 59, 60
2d80: 2c 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34  , 61, 62, 63, 64
2d90: 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30  , 97, 98, 99,100
2da0: 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20  ,101,102,103,.  
2db0: 20 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30    104,105,106,10
2dc0: 37 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31  7,108,109,110,11
2dd0: 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31  1,112,113,114,11
2de0: 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31  5,116,117,118,11
2df0: 39 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31  9,120,121,.    1
2e00: 32 32 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20  22, 91, 92, 93, 
2e10: 39 34 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20  94, 95, 96, 97, 
2e20: 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31  98, 99,100,101,1
2e30: 30 32 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31  02,103,104,105,1
2e40: 30 36 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c  06,107,.    108,
2e50: 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c  109,110,111,112,
2e60: 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c  113,114,115,116,
2e70: 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c  117,118,119,120,
2e80: 31 32 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c  121,122,123,124,
2e90: 31 32 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37  125,.    126,127
2ea0: 2c 31 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31  ,128,129,130,131
2eb0: 2c 31 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35  ,132,133,134,135
2ec0: 2c 31 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39  ,136,137,138,139
2ed0: 2c 31 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33  ,140,141,142,143
2ee0: 2c 0a 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34  ,.    144,145,14
2ef0: 36 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35  6,147,148,149,15
2f00: 30 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35  0,151,152,153,15
2f10: 34 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35  4,155,156,157,15
2f20: 38 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20  8,159,160,161,. 
2f30: 20 20 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31     162,163,164,1
2f40: 36 35 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31  65,166,167,168,1
2f50: 36 39 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31  69,170,171,172,1
2f60: 37 33 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31  73,174,175,176,1
2f70: 37 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20  77,178,179,.    
2f80: 31 38 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c  180,181,182,183,
2f90: 31 38 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c  184,185,186,187,
2fa0: 31 38 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c  188,189,190,191,
2fb0: 31 39 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c  192,193,194,195,
2fc0: 31 39 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38  196,197,.    198
2fd0: 2c 31 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32  ,199,200,201,202
2fe0: 2c 32 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36  ,203,204,205,206
2ff0: 2c 32 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30  ,207,208,209,210
3000: 2c 32 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34  ,211,212,213,214
3010: 2c 32 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31  ,215,.    216,21
3020: 37 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32  7,218,219,220,22
3030: 31 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32  1,222,223,224,22
3040: 35 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32  5,226,227,228,22
3050: 39 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33  9,230,231,232,23
3060: 33 2c 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32  3,.    234,235,2
3070: 33 36 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32  36,237,238,239,2
3080: 34 30 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32  40,241,242,243,2
3090: 34 34 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32  44,245,246,247,2
30a0: 34 38 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a  48,249,250,251,.
30b0: 20 20 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c      252,253,254,
30c0: 32 35 35 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  255.};../*.** Th
30d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
30e0: 75 74 65 73 20 61 20 68 61 73 68 20 6f 6e 20 74  utes a hash on t
30f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6b 65 79  he name of a key
3100: 77 6f 72 64 2e 0a 2a 2a 20 43 61 73 65 20 69 73  word..** Case is
3110: 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74   not significant
3120: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 48  ..*/.int sqliteH
3130: 61 73 68 4e 6f 43 61 73 65 28 63 6f 6e 73 74 20  ashNoCase(const 
3140: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
3150: 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20  .  int h = 0;.  
3160: 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73  if( n<=0 ) n = s
3170: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c  trlen(z);.  whil
3180: 65 28 20 6e 20 3e 20 30 20 20 29 7b 0a 20 20 20  e( n > 0  ){.   
3190: 20 68 20 3d 20 28 68 3c 3c 33 29 20 5e 20 68 20   h = (h<<3) ^ h 
31a0: 5e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  ^ UpperToLower[(
31b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 2a 7a  unsigned char)*z
31c0: 2b 2b 5d 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  ++];.    n--;.  
31d0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 20 26 20 30  }.  return h & 0
31e0: 78 37 66 66 66 66 66 66 66 3b 0a 7d 0a 0a 2f 2a  x7fffffff;.}../*
31f0: 0a 2a 2a 20 53 6f 6d 65 20 73 79 73 74 65 6d 73  .** Some systems
3200: 20 68 61 76 65 20 73 74 72 69 63 6d 70 28 29 2e   have stricmp().
3210: 20 20 4f 74 68 65 72 73 20 68 61 76 65 20 73 74    Others have st
3220: 72 63 61 73 65 63 6d 70 28 29 2e 20 20 42 65 63  rcasecmp().  Bec
3230: 61 75 73 65 0a 2a 2a 20 74 68 65 72 65 20 69 73  ause.** there is
3240: 20 6e 6f 20 63 6f 6e 73 69 73 74 65 6e 63 79 2c   no consistency,
3250: 20 77 65 20 77 69 6c 6c 20 64 65 66 69 6e 65 20   we will define 
3260: 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74 20  our own..*/.int 
3270: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 63 6f  sqliteStrICmp(co
3280: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
3290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
32a0: 67 68 74 29 7b 0a 20 20 72 65 67 69 73 74 65 72  ght){.  register
32b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32c0: 61 2c 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e  a, *b;.  a = (un
32d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c  signed char *)zL
32e0: 65 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69  eft;.  b = (unsi
32f0: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67  gned char *)zRig
3300: 68 74 3b 0a 20 20 77 68 69 6c 65 28 20 2a 61 21  ht;.  while( *a!
3310: 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77  =0 && UpperToLow
3320: 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c  er[*a]==UpperToL
3330: 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20  ower[*b]){ a++; 
3340: 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  b++; }.  return 
3350: 2a 61 20 2d 20 2a 62 3b 0a 7d 0a 69 6e 74 20 73  *a - *b;.}.int s
3360: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 63 6f  qliteStrNICmp(co
3370: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
3390: 67 68 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  ght, int N){.  r
33a0: 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64  egister unsigned
33b0: 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20   char *a, *b;.  
33c0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
33d0: 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20  ar *)zLeft;.  b 
33e0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
33f0: 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69   *)zRight;.  whi
3400: 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a  le( N-- > 0 && *
3410: 61 21 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c  a!=0 && UpperToL
3420: 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54  ower[*a]==UpperT
3430: 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b  oLower[*b]){ a++
3440: 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  ; b++; }.  retur
3450: 6e 20 4e 3c 30 20 3f 20 30 20 3a 20 2a 61 20 2d  n N<0 ? 0 : *a -
3460: 20 2a 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   *b;.}../*.** Re
3470: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 20 69  turn TRUE if z i
3480: 73 20 61 20 70 75 72 65 20 6e 75 6d 65 72 69 63  s a pure numeric
3490: 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75 72 6e   string.  Return
34a0: 20 46 41 4c 53 45 20 69 66 20 74 68 65 0a 2a 2a   FALSE if the.**
34b0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73   string contains
34c0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 77   any character w
34d0: 68 69 63 68 20 69 73 20 6e 6f 74 20 70 61 72 74  hich is not part
34e0: 20 6f 66 20 61 20 6e 75 6d 62 65 72 2e 0a 2a 2a   of a number..**
34f0: 0a 2a 2a 20 41 6d 20 65 6d 70 74 79 20 73 74 72  .** Am empty str
3500: 69 6e 67 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ing is considere
3510: 64 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 2e 0a 2a  d non-numeric..*
3520: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 73 4e 75  /.int sqliteIsNu
3530: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
3540: 2a 7a 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27  *z){.  if( *z=='
3550: 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20  -' || *z=='+' ) 
3560: 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 69 73 64 69  z++;.  if( !isdi
3570: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72  git(*z) ){.    r
3580: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
3590: 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 64  ++;.  while( isd
35a0: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
35b0: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27   }.  if( *z=='.'
35c0: 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20   ){.    z++;.   
35d0: 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a   if( !isdigit(*z
35e0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
35f0: 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74    while( isdigit
3600: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
3610: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27   }.  if( *z=='e'
3620: 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20   || *z=='E' ){. 
3630: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20     z++;.    if( 
3640: 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='+' || *z=='
3650: 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  -' ) z++;.    if
3660: 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20 29  ( !isdigit(*z) )
3670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
3680: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a  hile( isdigit(*z
3690: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a  ) ){ z++; }.  }.
36a0: 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
36b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 72  }../*.** The str
36c0: 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20 61 73  ing z[] is an as
36d0: 63 69 69 20 72 65 70 72 65 73 65 6e 74 61 74 69  cii representati
36e0: 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e 75 6d  on of a real num
36f0: 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ber..** Convert 
3700: 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f 20 61  this string to a
3710: 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   double..**.** T
3720: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75  his routine assu
3730: 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20 72 65 61  mes that z[] rea
3740: 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20 6e  lly is a valid n
3750: 75 6d 62 65 72 2e 20 20 49 66 20 69 74 0a 2a 2a  umber.  If it.**
3760: 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65 73   is not, the res
3770: 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ult is undefined
3780: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3790: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
37a0: 74 65 61 64 20 6f 66 20 74 68 65 20 6c 69 62 72  tead of the libr
37b0: 61 72 79 20 61 74 6f 66 28 29 20 66 75 6e 63 74  ary atof() funct
37c0: 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a 2a 20 74  ion because.** t
37d0: 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f 66 28  he library atof(
37e0: 29 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f 20  ) might want to 
37f0: 75 73 65 20 22 2c 22 20 61 73 20 74 68 65 20 64  use "," as the d
3800: 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e 73  ecimal point ins
3810: 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e 22 20 64  tead.** of "." d
3820: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20  epending on how 
3830: 6c 6f 63 61 6c 65 20 69 73 20 73 65 74 2e 20 20  locale is set.  
3840: 42 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 63  But that would c
3850: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a  ause problems.**
3860: 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f 20 74 68   for SQL.  So th
3870: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
3880: 73 20 75 73 65 73 20 22 2e 22 20 72 65 67 61 72  s uses "." regar
3890: 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61 6c 65 2e  dless of locale.
38a0: 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71 6c 69 74  .*/.double sqlit
38b0: 65 41 74 6f 46 28 63 6f 6e 73 74 20 63 68 61 72  eAtoF(const char
38c0: 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *z, const char 
38d0: 2a 2a 70 7a 45 6e 64 29 7b 0a 20 20 69 6e 74 20  **pzEnd){.  int 
38e0: 73 69 67 6e 20 3d 20 31 3b 0a 20 20 4c 4f 4e 47  sign = 1;.  LONG
38f0: 44 4f 55 42 4c 45 5f 54 59 50 45 20 76 31 20 3d  DOUBLE_TYPE v1 =
3900: 20 30 2e 30 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d   0.0;.  if( *z==
3910: 27 2d 27 20 29 7b 0a 20 20 20 20 73 69 67 6e 20  '-' ){.    sign 
3920: 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  = -1;.    z++;. 
3930: 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27   }else if( *z=='
3940: 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  +' ){.    z++;. 
3950: 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 73 64 69   }.  while( isdi
3960: 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 76  git(*z) ){.    v
3970: 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28 2a  1 = v1*10.0 + (*
3980: 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7a 2b  z - '0');.    z+
3990: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d  +;.  }.  if( *z=
39a0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 4c 4f 4e 47  ='.' ){.    LONG
39b0: 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 69 76 69  DOUBLE_TYPE divi
39c0: 73 6f 72 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a  sor = 1.0;.    z
39d0: 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ++;.    while( i
39e0: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20  sdigit(*z) ){.  
39f0: 20 20 20 20 76 31 20 3d 20 76 31 2a 31 30 2e 30      v1 = v1*10.0
3a00: 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20   + (*z - '0');. 
3a10: 20 20 20 20 20 64 69 76 69 73 6f 72 20 2a 3d 20       divisor *= 
3a20: 31 30 2e 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  10.0;.      z++;
3a30: 0a 20 20 20 20 7d 0a 20 20 20 20 76 31 20 2f 3d  .    }.    v1 /=
3a40: 20 64 69 76 69 73 6f 72 3b 0a 20 20 7d 0a 20 20   divisor;.  }.  
3a50: 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a  if( *z=='e' || *
3a60: 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 69 6e  z=='E' ){.    in
3a70: 74 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20 20 20  t esign = 1;.   
3a80: 20 69 6e 74 20 65 76 61 6c 20 3d 20 30 3b 0a 20   int eval = 0;. 
3a90: 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59     LONGDOUBLE_TY
3aa0: 50 45 20 73 63 61 6c 65 20 3d 20 31 2e 30 3b 0a  PE scale = 1.0;.
3ab0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3ac0: 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20   *z=='-' ){.    
3ad0: 20 20 65 73 69 67 6e 20 3d 20 2d 31 3b 0a 20 20    esign = -1;.  
3ae0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c      z++;.    }el
3af0: 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29  se if( *z=='+' )
3b00: 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  {.      z++;.   
3b10: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73   }.    while( is
3b20: 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20  digit(*z) ){.   
3b30: 20 20 20 65 76 61 6c 20 3d 20 65 76 61 6c 2a 31     eval = eval*1
3b40: 30 20 2b 20 2a 7a 20 2d 20 27 30 27 3b 0a 20 20  0 + *z - '0';.  
3b50: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
3b60: 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d     while( eval>=
3b70: 36 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31  64 ){ scale *= 1
3b80: 2e 30 65 2b 36 34 3b 20 65 76 61 6c 20 2d 3d 20  .0e+64; eval -= 
3b90: 36 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  64; }.    while(
3ba0: 20 65 76 61 6c 3e 3d 31 36 20 29 7b 20 73 63 61   eval>=16 ){ sca
3bb0: 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 36 3b 20 65  le *= 1.0e+16; e
3bc0: 76 61 6c 20 2d 3d 20 31 36 3b 20 7d 0a 20 20 20  val -= 16; }.   
3bd0: 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d 34 20   while( eval>=4 
3be0: 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65  ){ scale *= 1.0e
3bf0: 2b 34 3b 20 65 76 61 6c 20 2d 3d 20 34 3b 20 7d  +4; eval -= 4; }
3c00: 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c  .    while( eval
3c10: 3e 3d 31 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20  >=1 ){ scale *= 
3c20: 31 2e 30 65 2b 31 3b 20 65 76 61 6c 20 2d 3d 20  1.0e+1; eval -= 
3c30: 31 3b 20 7d 0a 20 20 20 20 69 66 28 20 65 73 69  1; }.    if( esi
3c40: 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 76 31  gn<0 ){.      v1
3c50: 20 2f 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20 7d   /= scale;.    }
3c60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 31 20 2a  else{.      v1 *
3c70: 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20 7d 0a 20  = scale;.    }. 
3c80: 20 7d 0a 20 20 69 66 28 20 70 7a 45 6e 64 20 29   }.  if( pzEnd )
3c90: 20 2a 70 7a 45 6e 64 20 3d 20 7a 3b 0a 20 20 72   *pzEnd = z;.  r
3ca0: 65 74 75 72 6e 20 73 69 67 6e 3c 30 20 3f 20 2d  eturn sign<0 ? -
3cb0: 76 31 20 3a 20 76 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  v1 : v1;.}../*.*
3cc0: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a 4e 75  * The string zNu
3cd0: 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20  m represents an 
3ce0: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72 65 20  integer.  There 
3cf0: 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20 6f 74  might be some ot
3d00: 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  her.** informati
3d10: 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  on following the
3d20: 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20 62 75   integer too, bu
3d30: 74 20 74 68 61 74 20 70 61 72 74 20 69 73 20 69  t that part is i
3d40: 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20 74 68  gnored..** If th
3d50: 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 74  e integer that t
3d60: 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 4e 75  he prefix of zNu
3d70: 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77 69 6c  m represents wil
3d80: 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20 33 32  l fit in a.** 32
3d90: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
3da0: 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52 55 45  ger, return TRUE
3db0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
3dc0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a  urn FALSE..**.**
3dd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
3de0: 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f 72 20  turns FALSE for 
3df0: 74 68 65 20 73 74 72 69 6e 67 20 2d 32 31 34 37  the string -2147
3e00: 34 38 33 36 34 38 20 65 76 65 6e 20 74 68 61 74  483648 even that
3e10: 0a 2a 2a 20 74 68 61 74 20 6e 75 6d 62 65 72 20  .** that number 
3e20: 77 69 6c 6c 2c 20 69 6e 20 74 68 65 6f 72 79 20  will, in theory 
3e30: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
3e40: 69 6e 74 65 67 65 72 2e 20 20 42 75 74 20 70 6f  integer.  But po
3e50: 73 69 74 69 76 65 0a 2a 2a 20 32 31 34 37 34 38  sitive.** 214748
3e60: 33 36 34 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69  3648 will not fi
3e70: 74 20 69 6e 20 33 32 20 62 69 74 73 2e 20 20 53  t in 32 bits.  S
3e80: 6f 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72  o it seems safer
3e90: 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61   to return.** fa
3ea0: 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
3eb0: 74 65 46 69 74 73 49 6e 33 32 42 69 74 73 28 63  teFitsIn32Bits(c
3ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29  onst char *zNum)
3ed0: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  {.  int i, c;.  
3ee0: 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c  if( *zNum=='-' |
3ef0: 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a  | *zNum=='+' ) z
3f00: 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30  Num++;.  for(i=0
3f10: 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27  ; (c=zNum[i])>='
3f20: 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b  0' && c<='9'; i+
3f30: 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3c  +){}.  return i<
3f40: 31 30 20 7c 7c 20 28 69 3d 3d 31 30 20 26 26 20  10 || (i==10 && 
3f50: 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 32 31 34  memcmp(zNum,"214
3f60: 37 34 38 33 36 34 37 22 2c 31 30 29 3c 3d 30 29  7483647",10)<=0)
3f70: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 63 6f 6d  ;.}../* This com
3f80: 70 61 72 69 73 6f 6e 20 72 6f 75 74 69 6e 65 20  parison routine 
3f90: 69 73 20 77 68 61 74 20 77 65 20 75 73 65 20 66  is what we use f
3fa0: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  or comparison op
3fb0: 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 62 65 74 77  erations.** betw
3fc0: 65 65 6e 20 6e 75 6d 65 72 69 63 20 76 61 6c 75  een numeric valu
3fd0: 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 65 78 70  es in an SQL exp
3fe0: 72 65 73 73 69 6f 6e 2e 20 20 22 4e 75 6d 65 72  ression.  "Numer
3ff0: 69 63 22 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  ic" is a little.
4000: 2a 2a 20 62 69 74 20 6d 69 73 6c 65 61 64 69 6e  ** bit misleadin
4010: 67 20 68 65 72 65 2e 20 20 57 68 61 74 20 77 65  g here.  What we
4020: 20 6d 65 61 6e 20 69 73 20 74 68 61 74 20 74 68   mean is that th
4030: 65 20 73 74 72 69 6e 67 73 20 68 61 76 65 20 61  e strings have a
4040: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 22 6e 75 6d  .** type of "num
4050: 65 72 69 63 22 20 66 72 6f 6d 20 74 68 65 20 70  eric" from the p
4060: 6f 69 6e 74 20 6f 66 20 76 69 65 77 20 6f 66 20  oint of view of 
4070: 53 51 4c 2e 20 20 54 68 65 20 73 74 72 69 6e 67  SQL.  The string
4080: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65  s.** do not nece
4090: 73 73 61 72 69 6c 79 20 63 6f 6e 74 61 69 6e 20  ssarily contain 
40a0: 6e 75 6d 62 65 72 73 2e 20 20 54 68 65 79 20 63  numbers.  They c
40b0: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 65 78  ould contain tex
40c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
40d0: 69 6e 70 75 74 20 73 74 72 69 6e 67 73 20 62 6f  input strings bo
40e0: 74 68 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 63 74  th look like act
40f0: 75 61 6c 20 6e 75 6d 62 65 72 73 20 74 68 65 6e  ual numbers then
4100: 20 74 68 65 79 0a 2a 2a 20 63 6f 6d 70 61 72 65   they.** compare
4110: 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72   in numerical or
4120: 64 65 72 2e 20 20 4e 75 6d 65 72 69 63 61 6c 20  der.  Numerical 
4130: 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 77 61  strings are alwa
4140: 79 73 20 6c 65 73 73 20 0a 2a 2a 20 74 68 61 6e  ys less .** than
4150: 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72   non-numeric str
4160: 69 6e 67 73 20 73 6f 20 69 66 20 6f 6e 65 20 69  ings so if one i
4170: 6e 70 75 74 20 73 74 72 69 6e 67 20 6c 6f 6f 6b  nput string look
4180: 73 20 6c 69 6b 65 20 61 0a 2a 2a 20 6e 75 6d 62  s like a.** numb
4190: 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  er and the other
41a0: 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20   does not, then 
41b0: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 6c 6f 6f  the one that loo
41c0: 6b 73 20 6c 69 6b 65 0a 2a 2a 20 61 20 6e 75 6d  ks like.** a num
41d0: 62 65 72 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  ber is the small
41e0: 65 72 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63  er.  Non-numeric
41f0: 20 73 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 65   strings compare
4200: 20 69 6e 20 0a 2a 2a 20 6c 65 78 69 67 72 61 70   in .** lexigrap
4210: 68 69 63 61 6c 20 6f 72 64 65 72 20 28 74 68 65  hical order (the
4220: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 73   same order as s
4230: 74 72 63 6d 70 28 29 29 2e 0a 2a 2f 0a 69 6e 74  trcmp())..*/.int
4240: 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 63   sqliteCompare(c
4250: 6f 6e 73 74 20 63 68 61 72 20 2a 61 74 65 78 74  onst char *atext
4260: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 74  , const char *bt
4270: 65 78 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75  ext){.  int resu
4280: 6c 74 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41  lt;.  int isNumA
4290: 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69 66 28 20  , isNumB;.  if( 
42a0: 61 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  atext==0 ){.    
42b0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 65 6c  return -1;.  }el
42c0: 73 65 20 69 66 28 20 62 74 65 78 74 3d 3d 30 20  se if( btext==0 
42d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
42e0: 0a 20 20 7d 0a 20 20 69 73 4e 75 6d 41 20 3d 20  .  }.  isNumA = 
42f0: 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 61  sqliteIsNumber(a
4300: 74 65 78 74 29 3b 0a 20 20 69 73 4e 75 6d 42 20  text);.  isNumB 
4310: 3d 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72  = sqliteIsNumber
4320: 28 62 74 65 78 74 29 3b 0a 20 20 69 66 28 20 69  (btext);.  if( i
4330: 73 4e 75 6d 41 20 29 7b 0a 20 20 20 20 69 66 28  sNumA ){.    if(
4340: 20 21 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20   !isNumB ){.    
4350: 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20    result = -1;. 
4360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4370: 64 6f 75 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20  double rA, rB;. 
4380: 20 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65       rA = sqlite
4390: 41 74 6f 46 28 61 74 65 78 74 2c 20 30 29 3b 0a  AtoF(atext, 0);.
43a0: 20 20 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74        rB = sqlit
43b0: 65 41 74 6f 46 28 62 74 65 78 74 2c 20 30 29 3b  eAtoF(btext, 0);
43c0: 0a 20 20 20 20 20 20 69 66 28 20 72 41 3c 72 42  .      if( rA<rB
43d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75   ){.        resu
43e0: 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  lt = -1;.      }
43f0: 65 6c 73 65 20 69 66 28 20 72 41 3e 72 42 20 29  else if( rA>rB )
4400: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
4410: 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
4420: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75  se{.        resu
4430: 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  lt = 0;.      }.
4440: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
4450: 28 20 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20  ( isNumB ){.    
4460: 72 65 73 75 6c 74 20 3d 20 2b 31 3b 0a 20 20 7d  result = +1;.  }
4470: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c  else {.    resul
4480: 74 20 3d 20 73 74 72 63 6d 70 28 61 74 65 78 74  t = strcmp(atext
4490: 2c 20 62 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  , btext);.  }.  
44a0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 20 0a  return result; .
44b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
44c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
44d0: 72 20 73 6f 72 74 69 6e 67 2e 20 20 45 61 63 68  r sorting.  Each
44e0: 20 6b 65 79 20 69 73 20 61 20 6c 69 73 74 20 6f   key is a list o
44f0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f one or more.**
4500: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
4510: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65 20   elements.  The 
4520: 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74  list is terminat
4530: 65 64 20 62 79 20 74 77 6f 20 6e 75 6c 6c 73 20  ed by two nulls 
4540: 69 6e 0a 2a 2a 20 61 20 72 6f 77 2e 20 20 46 6f  in.** a row.  Fo
4550: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66  r example, the f
4560: 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73  ollowing text is
4570: 20 61 20 6b 65 79 20 77 69 74 68 20 74 68 72 65   a key with thre
4580: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 0a 2a 2a  e elements.**.**
4590: 20 20 20 20 20 20 20 20 20 20 20 20 41 6f 6e 65              Aone
45a0: 5c 30 30 30 44 74 77 6f 5c 30 30 30 41 74 68 72  \000Dtwo\000Athr
45b0: 65 65 5c 30 30 30 5c 30 30 30 0a 2a 2a 0a 2a 2a  ee\000\000.**.**
45c0: 20 41 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 62 65   All elements be
45d0: 67 69 6e 20 77 69 74 68 20 6f 6e 65 20 6f 66 20  gin with one of 
45e0: 74 68 65 20 63 68 61 72 61 63 74 65 72 73 20 22  the characters "
45f0: 2b 2d 41 44 22 20 61 6e 64 20 65 6e 64 20 77 69  +-AD" and end wi
4600: 74 68 20 22 5c 30 30 30 22 0a 2a 2a 20 77 69 74  th "\000".** wit
4610: 68 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74  h zero or more t
4620: 65 78 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  ext elements in 
4630: 62 65 74 77 65 65 6e 2e 20 20 45 78 63 65 70 74  between.  Except
4640: 2c 20 4e 55 4c 4c 20 65 6c 65 6d 65 6e 74 73 0a  , NULL elements.
4650: 2a 2a 20 63 6f 6e 73 69 73 74 20 6f 66 20 74 68  ** consist of th
4660: 65 20 73 70 65 63 69 61 6c 20 74 77 6f 2d 63 68  e special two-ch
4670: 61 72 61 63 74 65 72 20 73 65 71 75 65 6e 63 65  aracter sequence
4680: 20 22 4e 5c 30 30 30 22 2e 0a 2a 2a 0a 2a 2a 20   "N\000"..**.** 
4690: 42 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 77  Both arguments w
46a0: 69 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d  ill have the sam
46b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
46c0: 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74  ents.  This rout
46d0: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 6e  ine.** returns n
46e0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
46f0: 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
4700: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
4710: 20 69 73 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e   is less.** than
4720: 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
4730: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
4740: 66 69 72 73 74 2e 20 20 28 52 65 73 75 6c 74 20  first.  (Result 
4750: 69 73 20 61 2d 62 29 2e 0a 2a 2a 0a 2a 2a 20 45  is a-b)..**.** E
4760: 61 63 68 20 65 6c 65 6d 65 6e 74 20 62 65 67 69  ach element begi
4770: 6e 73 20 77 69 74 68 20 6f 6e 65 20 6f 66 20 74  ns with one of t
4780: 68 65 20 63 68 61 72 61 63 74 65 72 73 20 22 2b  he characters "+
4790: 22 2c 20 22 2d 22 2c 20 22 41 22 2c 20 22 44 22  ", "-", "A", "D"
47a0: 2e 0a 2a 2a 20 54 68 69 73 20 63 68 61 72 61 63  ..** This charac
47b0: 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ter determines t
47c0: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 6e  he sort order an
47d0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
47e0: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
47f0: 2b 20 20 20 20 20 20 53 6f 72 74 20 6e 75 6d 65  +      Sort nume
4800: 72 69 63 61 6c 6c 79 20 69 6e 20 61 73 63 65 6e  rically in ascen
4810: 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20  ding order.**   
4820: 20 20 2d 20 20 20 20 20 20 53 6f 72 74 20 6e 75    -      Sort nu
4830: 6d 65 72 69 63 61 6c 6c 79 20 69 6e 20 64 65 73  merically in des
4840: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a  cending order.**
4850: 20 20 20 20 20 41 20 20 20 20 20 20 53 6f 72 74       A      Sort
4860: 20 61 73 20 73 74 72 69 6e 67 73 20 69 6e 20 61   as strings in a
4870: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 0a 2a  scending order.*
4880: 2a 20 20 20 20 20 44 20 20 20 20 20 20 53 6f 72  *     D      Sor
4890: 74 20 61 73 20 73 74 72 69 6e 67 73 20 69 6e 20  t as strings in 
48a0: 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72  descending order
48b0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
48c0: 22 2b 22 20 61 6e 64 20 22 2d 22 20 73 6f 72 74  "+" and "-" sort
48d0: 69 6e 67 2c 20 70 75 72 65 20 6e 75 6d 65 72 69  ing, pure numeri
48e0: 63 20 73 74 72 69 6e 67 73 20 28 73 74 72 69 6e  c strings (strin
48f0: 67 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  gs for which the
4900: 0a 2a 2a 20 69 73 4e 75 6d 28 29 20 66 75 6e 63  .** isNum() func
4910: 74 69 6f 6e 20 61 62 6f 76 65 20 72 65 74 75 72  tion above retur
4920: 6e 73 20 54 52 55 45 29 20 61 6c 77 61 79 73 20  ns TRUE) always 
4930: 63 6f 6d 70 61 72 65 20 6c 65 73 73 20 74 68 61  compare less tha
4940: 6e 20 73 74 72 69 6e 67 73 0a 2a 2a 20 74 68 61  n strings.** tha
4950: 74 20 61 72 65 20 6e 6f 74 20 70 75 72 65 20 6e  t are not pure n
4960: 75 6d 65 72 69 63 73 2e 20 20 4e 6f 6e 2d 6e 75  umerics.  Non-nu
4970: 6d 65 72 69 63 20 73 74 72 69 6e 67 73 20 63 6f  meric strings co
4980: 6d 70 61 72 65 20 69 6e 20 6d 65 6d 63 6d 70 28  mpare in memcmp(
4990: 29 0a 2a 2a 20 6f 72 64 65 72 2e 20 20 54 68 69  ).** order.  Thi
49a0: 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 6f  s is the same so
49b0: 72 74 20 6f 72 64 65 72 20 61 73 20 74 68 65 20  rt order as the 
49c0: 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 29 20  sqliteCompare() 
49d0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 62 6f 76  function.** abov
49e0: 65 20 67 65 6e 65 72 61 74 65 73 2e 0a 2a 2a 0a  e generates..**.
49f0: 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e  ** The last poin
4a00: 74 20 69 73 20 61 20 63 68 61 6e 67 65 20 66 72  t is a change fr
4a10: 6f 6d 20 76 65 72 73 69 6f 6e 20 32 2e 36 2e 33  om version 2.6.3
4a20: 20 74 6f 20 76 65 72 73 69 6f 6e 20 32 2e 37 2e   to version 2.7.
4a30: 30 2e 20 20 49 6e 0a 2a 2a 20 76 65 72 73 69 6f  0.  In.** versio
4a40: 6e 20 32 2e 36 2e 33 20 61 6e 64 20 65 61 72 6c  n 2.6.3 and earl
4a50: 69 65 72 2c 20 73 75 62 73 74 72 69 6e 67 73 20  ier, substrings 
4a60: 6f 66 20 64 69 67 69 74 73 20 63 6f 6d 70 61 72  of digits compar
4a70: 65 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 0a  e in numerical .
4a80: 2a 2a 20 61 6e 64 20 63 61 73 65 20 77 61 73 20  ** and case was 
4a90: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 62 72 65  used only to bre
4aa0: 61 6b 20 61 20 74 69 65 2e 0a 2a 2a 0a 2a 2a 20  ak a tie..**.** 
4ab0: 45 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  Elements that be
4ac0: 67 69 6e 20 77 69 74 68 20 27 41 27 20 6f 72 20  gin with 'A' or 
4ad0: 27 44 27 20 63 6f 6d 70 61 72 65 20 69 6e 20 6d  'D' compare in m
4ae0: 65 6d 63 6d 70 28 29 20 6f 72 64 65 72 20 72 65  emcmp() order re
4af0: 67 61 72 64 6c 65 73 73 0a 2a 2a 20 6f 66 20 77  gardless.** of w
4b00: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
4b10: 65 79 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e  ey look like a n
4b20: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  umber..**.** Not
4b30: 65 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20  e that the sort 
4b40: 6f 72 64 65 72 20 69 6d 70 6f 73 65 64 20 62 79  order imposed by
4b50: 20 74 68 65 20 72 75 6c 65 73 20 61 62 6f 76 65   the rules above
4b60: 20 69 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   is the same.** 
4b70: 66 72 6f 6d 20 74 68 65 20 6f 72 64 65 72 69 6e  from the orderin
4b80: 67 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65  g defined by the
4b90: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
4ba0: 20 61 6e 64 20 22 3e 3d 22 20 6f 70 65 72 61 74   and ">=" operat
4bb0: 6f 72 73 0a 2a 2a 20 6f 66 20 65 78 70 72 65 73  ors.** of expres
4bc0: 73 69 6f 6e 73 20 61 6e 64 20 66 6f 72 20 69 6e  sions and for in
4bd0: 64 69 63 65 73 2e 20 20 54 68 69 73 20 77 61 73  dices.  This was
4be0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 20 66 6f   not the case fo
4bf0: 72 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 32 2e 36  r version.** 2.6
4c00: 2e 33 20 61 6e 64 20 65 61 72 6c 69 65 72 2e 0a  .3 and earlier..
4c10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 6f 72  */.int sqliteSor
4c20: 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 63  tCompare(const c
4c30: 68 61 72 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68  har *a, const ch
4c40: 61 72 20 2a 62 29 7b 0a 20 20 69 6e 74 20 72 65  ar *b){.  int re
4c50: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 4e  s = 0;.  int isN
4c60: 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69  umA, isNumB;.  i
4c70: 6e 74 20 64 69 72 20 3d 20 30 3b 0a 0a 20 20 77  nt dir = 0;..  w
4c80: 68 69 6c 65 28 20 72 65 73 3d 3d 30 20 26 26 20  hile( res==0 && 
4c90: 2a 61 20 26 26 20 2a 62 20 29 7b 0a 20 20 20 20  *a && *b ){.    
4ca0: 69 66 28 20 61 5b 30 5d 3d 3d 27 4e 27 20 7c 7c  if( a[0]=='N' ||
4cb0: 20 62 5b 30 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20   b[0]=='N' ){.  
4cc0: 20 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d 62 5b      if( a[0]==b[
4cd0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 20  0] ){.        a 
4ce0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 62 20  += 2;.        b 
4cf0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
4d00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
4d10: 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d        if( a[0]==
4d20: 27 4e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 64  'N' ){.        d
4d30: 69 72 20 3d 20 62 5b 30 5d 3b 0a 20 20 20 20 20  ir = b[0];.     
4d40: 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 64 69 72 20 3d 20 61 5b 30 5d 3b 0a 20 20    dir = a[0];.  
4d70: 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a        res = +1;.
4d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
4da0: 73 73 65 72 74 28 20 61 5b 30 5d 3d 3d 62 5b 30  ssert( a[0]==b[0
4db0: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 69  ] );.    if( (di
4dc0: 72 3d 61 5b 30 5d 29 3d 3d 27 41 27 20 7c 7c 20  r=a[0])=='A' || 
4dd0: 61 5b 30 5d 3d 3d 27 44 27 20 29 7b 0a 20 20 20  a[0]=='D' ){.   
4de0: 20 20 20 72 65 73 20 3d 20 73 74 72 63 6d 70 28     res = strcmp(
4df0: 26 61 5b 31 5d 2c 26 62 5b 31 5d 29 3b 0a 20 20  &a[1],&b[1]);.  
4e00: 20 20 20 20 69 66 28 20 72 65 73 20 29 20 62 72      if( res ) br
4e10: 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
4e20: 20 20 20 20 20 20 69 73 4e 75 6d 41 20 3d 20 73        isNumA = s
4e30: 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 26 61  qliteIsNumber(&a
4e40: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 73 4e 75  [1]);.      isNu
4e50: 6d 42 20 3d 20 73 71 6c 69 74 65 49 73 4e 75 6d  mB = sqliteIsNum
4e60: 62 65 72 28 26 62 5b 31 5d 29 3b 0a 20 20 20 20  ber(&b[1]);.    
4e70: 20 20 69 66 28 20 69 73 4e 75 6d 41 20 29 7b 0a    if( isNumA ){.
4e80: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
4e90: 41 2c 20 72 42 3b 0a 20 20 20 20 20 20 20 20 69  A, rB;.        i
4ea0: 66 28 20 21 69 73 4e 75 6d 42 20 29 7b 0a 20 20  f( !isNumB ){.  
4eb0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31          res = -1
4ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4ed0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4ee0: 20 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65       rA = sqlite
4ef0: 41 74 6f 46 28 26 61 5b 31 5d 2c 20 30 29 3b 0a  AtoF(&a[1], 0);.
4f00: 20 20 20 20 20 20 20 20 72 42 20 3d 20 73 71 6c          rB = sql
4f10: 69 74 65 41 74 6f 46 28 26 62 5b 31 5d 2c 20 30  iteAtoF(&b[1], 0
4f20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
4f30: 41 3c 72 42 20 29 7b 0a 20 20 20 20 20 20 20 20  A<rB ){.        
4f40: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
4f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4f70: 66 28 20 72 41 3e 72 42 20 29 7b 0a 20 20 20 20  f( rA>rB ){.    
4f80: 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a        res = +1;.
4f90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4fa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4fb0: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
4fc0: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  B ){.        res
4fd0: 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 62   = +1;.        b
4fe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
4ff0: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
5000: 20 73 74 72 63 6d 70 28 26 61 5b 31 5d 2c 26 62   strcmp(&a[1],&b
5010: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
5020: 28 20 72 65 73 20 29 20 62 72 65 61 6b 3b 0a 20  ( res ) break;. 
5030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5040: 20 61 20 2b 3d 20 73 74 72 6c 65 6e 28 26 61 5b   a += strlen(&a[
5050: 31 5d 29 20 2b 20 32 3b 0a 20 20 20 20 62 20 2b  1]) + 2;.    b +
5060: 3d 20 73 74 72 6c 65 6e 28 26 62 5b 31 5d 29 20  = strlen(&b[1]) 
5070: 2b 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  + 2;.  }.  if( d
5080: 69 72 3d 3d 27 2d 27 20 7c 7c 20 64 69 72 3d 3d  ir=='-' || dir==
5090: 27 44 27 20 29 20 72 65 73 20 3d 20 2d 72 65 73  'D' ) res = -res
50a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
50b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 70 6f  }../*.** Some po
50c0: 77 65 72 73 20 6f 66 20 36 34 2e 20 20 54 68 65  wers of 64.  The
50d0: 73 65 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  se constants are
50e0: 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 0a 2a   needed in the.*
50f0: 2a 20 73 71 6c 69 74 65 52 65 61 6c 54 6f 53 6f  * sqliteRealToSo
5100: 72 74 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  rtable() routine
5110: 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69   below..*/.#defi
5120: 6e 65 20 5f 36 34 65 33 20 20 28 36 34 2e 30 20  ne _64e3  (64.0 
5130: 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30 29 0a 23  * 64.0 * 64.0).#
5140: 64 65 66 69 6e 65 20 5f 36 34 65 34 20 20 28 36  define _64e4  (6
5150: 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20 36 34 2e  4.0 * 64.0 * 64.
5160: 30 20 2a 20 36 34 2e 30 29 0a 23 64 65 66 69 6e  0 * 64.0).#defin
5170: 65 20 5f 36 34 65 31 35 20 28 5f 36 34 65 33 20  e _64e15 (_64e3 
5180: 2a 20 5f 36 34 65 34 20 2a 20 5f 36 34 65 34 20  * _64e4 * _64e4 
5190: 2a 20 5f 36 34 65 34 29 0a 23 64 65 66 69 6e 65  * _64e4).#define
51a0: 20 5f 36 34 65 31 36 20 28 5f 36 34 65 34 20 2a   _64e16 (_64e4 *
51b0: 20 5f 36 34 65 34 20 2a 20 5f 36 34 65 34 20 2a   _64e4 * _64e4 *
51c0: 20 5f 36 34 65 34 29 0a 23 64 65 66 69 6e 65 20   _64e4).#define 
51d0: 5f 36 34 65 36 33 20 28 5f 36 34 65 31 35 20 2a  _64e63 (_64e15 *
51e0: 20 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36   _64e16 * _64e16
51f0: 20 2a 20 5f 36 34 65 31 36 29 0a 23 64 65 66 69   * _64e16).#defi
5200: 6e 65 20 5f 36 34 65 36 34 20 28 5f 36 34 65 31  ne _64e64 (_64e1
5210: 36 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f 36 34  6 * _64e16 * _64
5220: 65 31 36 20 2a 20 5f 36 34 65 31 36 29 0a 0a 2f  e16 * _64e16)../
5230: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
5240: 6e 67 20 70 72 6f 63 65 64 75 72 65 20 63 6f 6e  ng procedure con
5250: 76 65 72 74 73 20 61 20 64 6f 75 62 6c 65 2d 70  verts a double-p
5260: 72 65 63 69 73 69 6f 6e 20 66 6c 6f 61 74 69 6e  recision floatin
5270: 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g point.** numbe
5280: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 2e  r into a string.
5290: 20 20 54 68 65 20 72 65 73 75 6c 74 69 6e 67 20    The resulting 
52a0: 73 74 72 69 6e 67 20 68 61 73 20 74 68 65 20 70  string has the p
52b0: 72 6f 70 65 72 74 79 20 74 68 61 74 0a 2a 2a 20  roperty that.** 
52c0: 74 77 6f 20 73 75 63 68 20 73 74 72 69 6e 67 73  two such strings
52d0: 20 63 6f 6d 70 61 72 69 65 64 20 75 73 69 6e 67   comparied using
52e0: 20 73 74 72 63 6d 70 28 29 20 6f 72 20 6d 65 6d   strcmp() or mem
52f0: 63 6d 70 28 29 20 77 69 6c 6c 20 67 69 76 65 20  cmp() will give 
5300: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 65 73 75  the.** same resu
5310: 6c 74 73 20 61 73 20 61 20 6e 75 6d 65 72 69 63  lts as a numeric
5320: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
5330: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 6c 6f 61  he original floa
5340: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting point.** nu
5350: 6d 62 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mbers..**.** Thi
5360: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5370: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 64 61  d to generate da
5380: 74 61 62 61 73 65 20 6b 65 79 73 20 66 72 6f 6d  tabase keys from
5390: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
53a0: 2a 2a 20 6e 75 6d 62 65 72 73 20 73 75 63 68 20  ** numbers such 
53b0: 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 73 6f  that the keys so
53c0: 72 74 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  rt in the same o
53d0: 72 64 65 72 20 61 73 20 74 68 65 20 6f 72 69 67  rder as the orig
53e0: 69 6e 61 6c 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  inal.** floating
53f0: 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 73 20 65   point numbers e
5400: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6b  ven though the k
5410: 65 79 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  eys are compared
5420: 20 75 73 69 6e 67 0a 2a 2a 20 6d 65 6d 63 6d 70   using.** memcmp
5430: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ()..**.** The ca
5440: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73  lling function s
5450: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63  hould have alloc
5460: 61 74 65 64 20 61 74 20 6c 65 61 73 74 20 31 34  ated at least 14
5470: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 6f   characters.** o
5480: 66 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  f space for the 
5490: 62 75 66 66 65 72 20 7a 5b 5d 2e 0a 2a 2f 0a 76  buffer z[]..*/.v
54a0: 6f 69 64 20 73 71 6c 69 74 65 52 65 61 6c 54 6f  oid sqliteRealTo
54b0: 53 6f 72 74 61 62 6c 65 28 64 6f 75 62 6c 65 20  Sortable(double 
54c0: 72 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  r, char *z){.  i
54d0: 6e 74 20 6e 65 67 3b 0a 20 20 69 6e 74 20 65 78  nt neg;.  int ex
54e0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
54f0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 61 72 72  ;..  /* This arr
5500: 61 79 20 6d 61 70 73 20 69 6e 74 65 67 65 72 73  ay maps integers
5510: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36   between 0 and 6
5520: 33 20 69 6e 74 6f 20 62 61 73 65 2d 36 34 20 64  3 into base-64 d
5530: 69 67 69 74 73 2e 0a 20 20 2a 2a 20 54 68 65 20  igits..  ** The 
5540: 64 69 67 69 74 73 20 6d 75 73 74 20 62 65 20 63  digits must be c
5550: 68 6f 73 65 6e 20 73 75 63 68 20 61 74 20 74 68  hosen such at th
5560: 65 69 72 20 41 53 43 49 49 20 63 6f 64 65 73 20  eir ASCII codes 
5570: 61 72 65 20 69 6e 63 72 65 61 73 69 6e 67 2e 0a  are increasing..
5580: 20 20 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20    ** This means 
5590: 77 65 20 63 61 6e 20 6e 6f 74 20 75 73 65 20 74  we can not use t
55a0: 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 62  he traditional b
55b0: 61 73 65 2d 36 34 20 64 69 67 69 74 20 73 65 74  ase-64 digit set
55c0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  . */.  static co
55d0: 6e 73 74 20 63 68 61 72 20 7a 44 69 67 69 74 5b  nst char zDigit[
55e0: 5d 20 3d 20 0a 20 20 20 20 20 22 30 31 32 33 34  ] = .     "01234
55f0: 35 36 37 38 39 22 0a 20 20 20 20 20 22 41 42 43  56789".     "ABC
5600: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
5610: 54 55 56 57 58 59 5a 22 0a 20 20 20 20 20 22 61  TUVWXYZ".     "a
5620: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
5630: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 20  rstuvwxyz".     
5640: 22 7c 7e 22 3b 0a 20 20 69 66 28 20 72 3c 30 2e  "|~";.  if( r<0.
5650: 30 20 29 7b 0a 20 20 20 20 6e 65 67 20 3d 20 31  0 ){.    neg = 1
5660: 3b 0a 20 20 20 20 72 20 3d 20 2d 72 3b 0a 20 20  ;.    r = -r;.  
5670: 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27 3b 0a 20 20    *z++ = '-';.  
5680: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 65 67  } else {.    neg
5690: 20 3d 20 30 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d   = 0;.    *z++ =
56a0: 20 27 30 27 3b 0a 20 20 7d 0a 20 20 65 78 70 20   '0';.  }.  exp 
56b0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 3d 3d 30  = 0;..  if( r==0
56c0: 2e 30 20 29 7b 0a 20 20 20 20 65 78 70 20 3d 20  .0 ){.    exp = 
56d0: 2d 31 30 32 34 3b 0a 20 20 7d 65 6c 73 65 20 69  -1024;.  }else i
56e0: 66 28 20 72 3c 28 30 2e 35 2f 36 34 2e 30 29 20  f( r<(0.5/64.0) 
56f0: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20  ){.    while( r 
5700: 3c 20 30 2e 35 2f 5f 36 34 65 36 34 20 26 26 20  < 0.5/_64e64 && 
5710: 65 78 70 20 3e 20 2d 39 36 31 20 20 29 7b 20 72  exp > -961  ){ r
5720: 20 2a 3d 20 5f 36 34 65 36 34 3b 20 20 65 78 70   *= _64e64;  exp
5730: 20 2d 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68   -= 64; }.    wh
5740: 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34  ile( r < 0.5/_64
5750: 65 31 36 20 26 26 20 65 78 70 20 3e 20 2d 31 30  e16 && exp > -10
5760: 30 39 20 29 7b 20 72 20 2a 3d 20 5f 36 34 65 31  09 ){ r *= _64e1
5770: 36 3b 20 20 65 78 70 20 2d 3d 20 31 36 3b 20 7d  6;  exp -= 16; }
5780: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20 3c 20  .    while( r < 
5790: 30 2e 35 2f 5f 36 34 65 34 20 20 26 26 20 65 78  0.5/_64e4  && ex
57a0: 70 20 3e 20 2d 31 30 32 31 20 29 7b 20 72 20 2a  p > -1021 ){ r *
57b0: 3d 20 5f 36 34 65 34 3b 20 20 20 65 78 70 20 2d  = _64e4;   exp -
57c0: 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65  = 4; }.    while
57d0: 28 20 72 20 3c 20 30 2e 35 2f 36 34 2e 30 20 20  ( r < 0.5/64.0  
57e0: 20 26 26 20 65 78 70 20 3e 20 2d 31 30 32 34 20   && exp > -1024 
57f0: 29 7b 20 72 20 2a 3d 20 36 34 2e 30 3b 20 20 20  ){ r *= 64.0;   
5800: 20 65 78 70 20 2d 3d 20 31 3b 20 7d 0a 20 20 7d   exp -= 1; }.  }
5810: 65 6c 73 65 20 69 66 28 20 72 3e 3d 30 2e 35 20  else if( r>=0.5 
5820: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20  ){.    while( r 
5830: 3e 3d 20 30 2e 35 2a 5f 36 34 65 36 33 20 26 26  >= 0.5*_64e63 &&
5840: 20 65 78 70 20 3c 20 39 36 30 20 20 29 7b 20 72   exp < 960  ){ r
5850: 20 2a 3d 20 31 2e 30 2f 5f 36 34 65 36 34 3b 20   *= 1.0/_64e64; 
5860: 65 78 70 20 2b 3d 20 36 34 3b 20 7d 0a 20 20 20  exp += 64; }.   
5870: 20 77 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35   while( r >= 0.5
5880: 2a 5f 36 34 65 31 35 20 26 26 20 65 78 70 20 3c  *_64e15 && exp <
5890: 20 31 30 30 38 20 29 7b 20 72 20 2a 3d 20 31 2e   1008 ){ r *= 1.
58a0: 30 2f 5f 36 34 65 31 36 3b 20 65 78 70 20 2b 3d  0/_64e16; exp +=
58b0: 20 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65   16; }.    while
58c0: 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34 65 33  ( r >= 0.5*_64e3
58d0: 20 20 26 26 20 65 78 70 20 3c 20 31 30 32 30 20    && exp < 1020 
58e0: 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36 34 65  ){ r *= 1.0/_64e
58f0: 34 3b 20 20 65 78 70 20 2b 3d 20 34 3b 20 7d 0a  4;  exp += 4; }.
5900: 20 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d 20      while( r >= 
5910: 30 2e 35 20 20 20 20 20 20 20 20 26 26 20 65 78  0.5        && ex
5920: 70 20 3c 20 31 30 32 33 20 29 7b 20 72 20 2a 3d  p < 1023 ){ r *=
5930: 20 31 2e 30 2f 36 34 2e 30 3b 20 20 20 65 78 70   1.0/64.0;   exp
5940: 20 2b 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 69   += 1; }.  }.  i
5950: 66 28 20 6e 65 67 20 29 7b 0a 20 20 20 20 65 78  f( neg ){.    ex
5960: 70 20 3d 20 2d 65 78 70 3b 0a 20 20 20 20 72 20  p = -exp;.    r 
5970: 3d 20 2d 72 3b 0a 20 20 7d 0a 20 20 65 78 70 20  = -r;.  }.  exp 
5980: 2b 3d 20 31 30 32 34 3b 0a 20 20 72 20 2b 3d 20  += 1024;.  r += 
5990: 30 2e 35 3b 0a 20 20 69 66 28 20 65 78 70 3c 30  0.5;.  if( exp<0
59a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
59b0: 20 65 78 70 3e 3d 32 30 34 38 20 7c 7c 20 72 3e   exp>=2048 || r>
59c0: 3d 31 2e 30 20 29 7b 0a 20 20 20 20 73 74 72 63  =1.0 ){.    strc
59d0: 70 79 28 7a 2c 20 22 7e 7e 7e 7e 7e 7e 7e 7e 7e  py(z, "~~~~~~~~~
59e0: 7e 7e 7e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ~~~");.    retur
59f0: 6e 3b 0a 20 20 7d 0a 20 20 2a 7a 2b 2b 20 3d 20  n;.  }.  *z++ = 
5a00: 7a 44 69 67 69 74 5b 28 65 78 70 3e 3e 36 29 26  zDigit[(exp>>6)&
5a10: 30 78 33 66 5d 3b 0a 20 20 2a 7a 2b 2b 20 3d 20  0x3f];.  *z++ = 
5a20: 7a 44 69 67 69 74 5b 65 78 70 20 26 20 30 78 33  zDigit[exp & 0x3
5a30: 66 5d 3b 0a 20 20 77 68 69 6c 65 28 20 72 3e 30  f];.  while( r>0
5a40: 2e 30 20 26 26 20 63 6e 74 3c 31 30 20 29 7b 0a  .0 && cnt<10 ){.
5a50: 20 20 20 20 69 6e 74 20 64 69 67 69 74 3b 0a 20      int digit;. 
5a60: 20 20 20 72 20 2a 3d 20 36 34 2e 30 3b 0a 20 20     r *= 64.0;.  
5a70: 20 20 64 69 67 69 74 20 3d 20 28 69 6e 74 29 72    digit = (int)r
5a80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 69  ;.    assert( di
5a90: 67 69 74 3e 3d 30 20 26 26 20 64 69 67 69 74 3c  git>=0 && digit<
5aa0: 36 34 20 29 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d  64 );.    *z++ =
5ab0: 20 7a 44 69 67 69 74 5b 64 69 67 69 74 20 26 20   zDigit[digit & 
5ac0: 30 78 33 66 5d 3b 0a 20 20 20 20 72 20 2d 3d 20  0x3f];.    r -= 
5ad0: 64 69 67 69 74 3b 0a 20 20 20 20 63 6e 74 2b 2b  digit;.    cnt++
5ae0: 3b 0a 20 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a  ;.  }.  *z = 0;.
5af0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5b00: 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20 58 20 69 73  _UTF8./*.** X is
5b10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5b20: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
5b30: 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  a UTF-8 characte
5b40: 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a  r.  Increment.**
5b50: 20 58 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f   X so that it po
5b60: 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74  ints to the next
5b70: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69   character.  Thi
5b80: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67  s only works rig
5b90: 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f 69 6e 74  ht.** if X point
5ba0: 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  s to a well-form
5bb0: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
5bc0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69  .*/.#define sqli
5bd0: 74 65 4e 65 78 74 43 68 61 72 28 58 29 20 20 77  teNextChar(X)  w
5be0: 68 69 6c 65 28 20 28 30 78 63 30 26 2a 2b 2b 28  hile( (0xc0&*++(
5bf0: 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d 0a 23 64  X))==0x80 ){}.#d
5c00: 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61 72  efine sqliteChar
5c10: 56 61 6c 28 58 29 20 20 20 73 71 6c 69 74 65 5f  Val(X)   sqlite_
5c20: 75 74 66 38 5f 74 6f 5f 69 6e 74 28 58 29 0a 0a  utf8_to_int(X)..
5c30: 23 65 6c 73 65 20 2f 2a 20 21 64 65 66 69 6e 65  #else /* !define
5c40: 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 20 2a  d(SQLITE_UTF8) *
5c50: 2f 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 69 73 6f 38  /./*.** For iso8
5c60: 38 35 39 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  859 encoding, th
5c70: 65 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72  e next character
5c80: 20 69 73 20 6a 75 73 74 20 74 68 65 20 6e 65 78   is just the nex
5c90: 74 20 62 79 74 65 2e 0a 2a 2f 0a 23 64 65 66 69  t byte..*/.#defi
5ca0: 6e 65 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61  ne sqliteNextCha
5cb0: 72 28 58 29 20 20 28 2b 2b 28 58 29 29 3b 0a 23  r(X)  (++(X));.#
5cc0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 43 68 61  define sqliteCha
5cd0: 72 56 61 6c 28 58 29 20 20 20 28 28 69 6e 74 29  rVal(X)   ((int)
5ce0: 2a 28 58 29 29 0a 0a 23 65 6e 64 69 66 20 2f 2a  *(X))..#endif /*
5cf0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5d00: 55 54 46 38 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  UTF8) */...#ifde
5d10: 66 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 2f 2a  f SQLITE_UTF8./*
5d20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
5d30: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20  UTF-8 character 
5d40: 74 6f 20 77 68 69 63 68 20 7a 20 70 6f 69 6e 74  to which z point
5d50: 73 20 69 6e 74 6f 20 61 20 33 31 2d 62 69 74 0a  s into a 31-bit.
5d60: 2a 2a 20 55 43 53 20 63 68 61 72 61 63 74 65 72  ** UCS character
5d70: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
5d80: 6b 73 20 72 69 67 68 74 20 69 66 20 7a 20 70 6f  ks right if z po
5d90: 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66  ints to a well-f
5da0: 6f 72 6d 65 64 0a 2a 2a 20 55 54 46 2d 38 20 73  ormed.** UTF-8 s
5db0: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
5dc0: 20 69 6e 74 20 73 71 6c 69 74 65 5f 75 74 66 38   int sqlite_utf8
5dd0: 5f 74 6f 5f 69 6e 74 28 63 6f 6e 73 74 20 75 6e  _to_int(const un
5de0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b  signed char *z){
5df0: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 73 74 61 74  .  int c;.  stat
5e00: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 6e 69  ic const int ini
5e10: 74 56 61 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  tVal[] = {.     
5e20: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
5e30: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
5e40: 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c  ,   7,   8,   9,
5e50: 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20    10,  11,  12, 
5e60: 20 31 33 2c 20 20 31 34 2c 0a 20 20 20 20 20 31   13,  14,.     1
5e70: 35 2c 20 20 31 36 2c 20 20 31 37 2c 20 20 31 38  5,  16,  17,  18
5e80: 2c 20 20 31 39 2c 20 20 32 30 2c 20 20 32 31 2c  ,  19,  20,  21,
5e90: 20 20 32 32 2c 20 20 32 33 2c 20 20 32 34 2c 20    22,  23,  24, 
5ea0: 20 32 35 2c 20 20 32 36 2c 20 20 32 37 2c 20 20   25,  26,  27,  
5eb0: 32 38 2c 20 20 32 39 2c 0a 20 20 20 20 20 33 30  28,  29,.     30
5ec0: 2c 20 20 33 31 2c 20 20 33 32 2c 20 20 33 33 2c  ,  31,  32,  33,
5ed0: 20 20 33 34 2c 20 20 33 35 2c 20 20 33 36 2c 20    34,  35,  36, 
5ee0: 20 33 37 2c 20 20 33 38 2c 20 20 33 39 2c 20 20   37,  38,  39,  
5ef0: 34 30 2c 20 20 34 31 2c 20 20 34 32 2c 20 20 34  40,  41,  42,  4
5f00: 33 2c 20 20 34 34 2c 0a 20 20 20 20 20 34 35 2c  3,  44,.     45,
5f10: 20 20 34 36 2c 20 20 34 37 2c 20 20 34 38 2c 20    46,  47,  48, 
5f20: 20 34 39 2c 20 20 35 30 2c 20 20 35 31 2c 20 20   49,  50,  51,  
5f30: 35 32 2c 20 20 35 33 2c 20 20 35 34 2c 20 20 35  52,  53,  54,  5
5f40: 35 2c 20 20 35 36 2c 20 20 35 37 2c 20 20 35 38  5,  56,  57,  58
5f50: 2c 20 20 35 39 2c 0a 20 20 20 20 20 36 30 2c 20  ,  59,.     60, 
5f60: 20 36 31 2c 20 20 36 32 2c 20 20 36 33 2c 20 20   61,  62,  63,  
5f70: 36 34 2c 20 20 36 35 2c 20 20 36 36 2c 20 20 36  64,  65,  66,  6
5f80: 37 2c 20 20 36 38 2c 20 20 36 39 2c 20 20 37 30  7,  68,  69,  70
5f90: 2c 20 20 37 31 2c 20 20 37 32 2c 20 20 37 33 2c  ,  71,  72,  73,
5fa0: 20 20 37 34 2c 0a 20 20 20 20 20 37 35 2c 20 20    74,.     75,  
5fb0: 37 36 2c 20 20 37 37 2c 20 20 37 38 2c 20 20 37  76,  77,  78,  7
5fc0: 39 2c 20 20 38 30 2c 20 20 38 31 2c 20 20 38 32  9,  80,  81,  82
5fd0: 2c 20 20 38 33 2c 20 20 38 34 2c 20 20 38 35 2c  ,  83,  84,  85,
5fe0: 20 20 38 36 2c 20 20 38 37 2c 20 20 38 38 2c 20    86,  87,  88, 
5ff0: 20 38 39 2c 0a 20 20 20 20 20 39 30 2c 20 20 39   89,.     90,  9
6000: 31 2c 20 20 39 32 2c 20 20 39 33 2c 20 20 39 34  1,  92,  93,  94
6010: 2c 20 20 39 35 2c 20 20 39 36 2c 20 20 39 37 2c  ,  95,  96,  97,
6020: 20 20 39 38 2c 20 20 39 39 2c 20 31 30 30 2c 20    98,  99, 100, 
6030: 31 30 31 2c 20 31 30 32 2c 20 31 30 33 2c 20 31  101, 102, 103, 1
6040: 30 34 2c 0a 20 20 20 20 31 30 35 2c 20 31 30 36  04,.    105, 106
6050: 2c 20 31 30 37 2c 20 31 30 38 2c 20 31 30 39 2c  , 107, 108, 109,
6060: 20 31 31 30 2c 20 31 31 31 2c 20 31 31 32 2c 20   110, 111, 112, 
6070: 31 31 33 2c 20 31 31 34 2c 20 31 31 35 2c 20 31  113, 114, 115, 1
6080: 31 36 2c 20 31 31 37 2c 20 31 31 38 2c 20 31 31  16, 117, 118, 11
6090: 39 2c 0a 20 20 20 20 31 32 30 2c 20 31 32 31 2c  9,.    120, 121,
60a0: 20 31 32 32 2c 20 31 32 33 2c 20 31 32 34 2c 20   122, 123, 124, 
60b0: 31 32 35 2c 20 31 32 36 2c 20 31 32 37 2c 20 31  125, 126, 127, 1
60c0: 32 38 2c 20 31 32 39 2c 20 31 33 30 2c 20 31 33  28, 129, 130, 13
60d0: 31 2c 20 31 33 32 2c 20 31 33 33 2c 20 31 33 34  1, 132, 133, 134
60e0: 2c 0a 20 20 20 20 31 33 35 2c 20 31 33 36 2c 20  ,.    135, 136, 
60f0: 31 33 37 2c 20 31 33 38 2c 20 31 33 39 2c 20 31  137, 138, 139, 1
6100: 34 30 2c 20 31 34 31 2c 20 31 34 32 2c 20 31 34  40, 141, 142, 14
6110: 33 2c 20 31 34 34 2c 20 31 34 35 2c 20 31 34 36  3, 144, 145, 146
6120: 2c 20 31 34 37 2c 20 31 34 38 2c 20 31 34 39 2c  , 147, 148, 149,
6130: 0a 20 20 20 20 31 35 30 2c 20 31 35 31 2c 20 31  .    150, 151, 1
6140: 35 32 2c 20 31 35 33 2c 20 31 35 34 2c 20 31 35  52, 153, 154, 15
6150: 35 2c 20 31 35 36 2c 20 31 35 37 2c 20 31 35 38  5, 156, 157, 158
6160: 2c 20 31 35 39 2c 20 31 36 30 2c 20 31 36 31 2c  , 159, 160, 161,
6170: 20 31 36 32 2c 20 31 36 33 2c 20 31 36 34 2c 0a   162, 163, 164,.
6180: 20 20 20 20 31 36 35 2c 20 31 36 36 2c 20 31 36      165, 166, 16
6190: 37 2c 20 31 36 38 2c 20 31 36 39 2c 20 31 37 30  7, 168, 169, 170
61a0: 2c 20 31 37 31 2c 20 31 37 32 2c 20 31 37 33 2c  , 171, 172, 173,
61b0: 20 31 37 34 2c 20 31 37 35 2c 20 31 37 36 2c 20   174, 175, 176, 
61c0: 31 37 37 2c 20 31 37 38 2c 20 31 37 39 2c 0a 20  177, 178, 179,. 
61d0: 20 20 20 31 38 30 2c 20 31 38 31 2c 20 31 38 32     180, 181, 182
61e0: 2c 20 31 38 33 2c 20 31 38 34 2c 20 31 38 35 2c  , 183, 184, 185,
61f0: 20 31 38 36 2c 20 31 38 37 2c 20 31 38 38 2c 20   186, 187, 188, 
6200: 31 38 39 2c 20 31 39 30 2c 20 31 39 31 2c 20 20  189, 190, 191,  
6210: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 0a 20 20   0,   1,   2,.  
6220: 20 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c      3,   4,   5,
6230: 20 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20     6,   7,   8, 
6240: 20 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20    9,  10,  11,  
6250: 31 32 2c 20 20 31 33 2c 20 20 31 34 2c 20 20 31  12,  13,  14,  1
6260: 35 2c 20 20 31 36 2c 20 20 31 37 2c 0a 20 20 20  5,  16,  17,.   
6270: 20 20 31 38 2c 20 20 31 39 2c 20 20 32 30 2c 20    18,  19,  20, 
6280: 20 32 31 2c 20 20 32 32 2c 20 20 32 33 2c 20 20   21,  22,  23,  
6290: 32 34 2c 20 20 32 35 2c 20 20 32 36 2c 20 20 32  24,  25,  26,  2
62a0: 37 2c 20 20 32 38 2c 20 20 32 39 2c 20 20 33 30  7,  28,  29,  30
62b0: 2c 20 20 33 31 2c 20 20 20 30 2c 0a 20 20 20 20  ,  31,   0,.    
62c0: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20    1,   2,   3,  
62d0: 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20   4,   5,   6,   
62e0: 37 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30  7,   8,   9,  10
62f0: 2c 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c  ,  11,  12,  13,
6300: 20 20 31 34 2c 20 20 31 35 2c 0a 20 20 20 20 20    14,  15,.     
6310: 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20   0,   1,   2,   
6320: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
6330: 2c 20 20 20 37 2c 20 20 20 30 2c 20 20 20 31 2c  ,   7,   0,   1,
6340: 20 20 20 32 2c 20 20 20 33 2c 20 20 20 30 2c 20     2,   3,   0, 
6350: 20 20 31 2c 20 32 35 34 2c 0a 20 20 20 20 32 35    1, 254,.    25
6360: 35 2c 0a 20 20 7d 3b 0a 20 20 63 20 3d 20 69 6e  5,.  };.  c = in
6370: 69 74 56 61 6c 5b 2a 28 7a 2b 2b 29 5d 3b 0a 20  itVal[*(z++)];. 
6380: 20 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a 7a   while( (0xc0&*z
6390: 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 63  )==0x80 ){.    c
63a0: 20 3d 20 28 63 3c 3c 36 29 20 7c 20 28 30 78 33   = (c<<6) | (0x3
63b0: 66 26 2a 28 7a 2b 2b 29 29 3b 0a 20 20 7d 0a 20  f&*(z++));.  }. 
63c0: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 23 65 6e   return c;.}.#en
63d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  dif../*.** Compa
63e0: 72 65 20 74 77 6f 20 55 54 46 2d 38 20 73 74 72  re two UTF-8 str
63f0: 69 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74  ings for equalit
6400: 79 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  y where the firs
6410: 74 20 73 74 72 69 6e 67 20 63 61 6e 0a 2a 2a 20  t string can.** 
6420: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 61  potentially be a
6430: 20 22 67 6c 6f 62 22 20 65 78 70 72 65 73 73 69   "glob" expressi
6440: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  on.  Return true
6450: 20 28 31 29 20 69 66 20 74 68 65 79 0a 2a 2a 20   (1) if they.** 
6460: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64  are the same and
6470: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 74 68   false (0) if th
6480: 65 79 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ey are different
6490: 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
64a0: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
64b0: 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
64c0: 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
64d0: 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
64e0: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
64f0: 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
6500: 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
6510: 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
6520: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
6530: 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
6540: 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
6550: 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
6560: 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
6570: 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
6580: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
6590: 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
65a0: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
65b0: 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
65c0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
65d0: 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e 5d 20 61  With the [...] a
65e0: 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69  nd [^...] matchi
65f0: 6e 67 2c 20 61 20 27 5d 27 20 63 68 61 72 61 63  ng, a ']' charac
6600: 74 65 72 20 63 61 6e 20 62 65 20 69 6e 63 6c 75  ter can be inclu
6610: 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ded.** in the li
6620: 73 74 20 62 79 20 6d 61 6b 69 6e 67 20 69 74 20  st by making it 
6630: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
6640: 74 65 72 20 61 66 74 65 72 20 27 5b 27 20 6f 72  ter after '[' or
6650: 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72 61 6e 67   '^'.  A.** rang
6660: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
6670: 63 61 6e 20 62 65 20 73 70 65 63 69 66 69 65 64  can be specified
6680: 20 75 73 69 6e 67 20 27 2d 27 2e 20 20 45 78 61   using '-'.  Exa
6690: 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22  mple:.** "[a-z]"
66a0: 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e   matches any sin
66b0: 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c  gle lower-case l
66c0: 65 74 74 65 72 2e 20 20 54 6f 20 6d 61 74 63 68  etter.  To match
66d0: 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20   a '-', make.** 
66e0: 69 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  it the last char
66f0: 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c 69 73  acter in the lis
6700: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
6710: 75 74 69 6e 65 20 69 73 20 75 73 75 61 6c 6c 79  utine is usually
6720: 20 71 75 69 63 6b 2c 20 62 75 74 20 63 61 6e 20   quick, but can 
6730: 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68 65 20 77  be N**2 in the w
6740: 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  orst case..**.**
6750: 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61 74 63 68   Hints: to match
6760: 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20 70 75 74   '*' or '?', put
6770: 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22 2e 20 20   them in "[]".  
6780: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
6790: 20 20 20 20 20 20 20 20 20 61 62 63 5b 2a 5d 78           abc[*]x
67a0: 79 7a 20 20 20 20 20 20 20 20 4d 61 74 63 68 65  yz        Matche
67b0: 73 20 22 61 62 63 2a 78 79 7a 22 20 6f 6e 6c 79  s "abc*xyz" only
67c0: 0a 2a 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 47  .*/.int .sqliteG
67d0: 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
67e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
67f0: 7a 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20  zPattern, const 
6800: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6810: 53 74 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73  String){.  regis
6820: 74 65 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  ter int c;.  int
6830: 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
6840: 65 65 6e 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a  een;.  int c2;..
6850: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 7a    while( (c = *z
6860: 50 61 74 74 65 72 6e 29 21 3d 30 20 29 7b 0a 20  Pattern)!=0 ){. 
6870: 20 20 20 73 77 69 74 63 68 28 20 63 20 29 7b 0a     switch( c ){.
6880: 20 20 20 20 20 20 63 61 73 65 20 27 2a 27 3a 0a        case '*':.
6890: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
68a0: 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d  c=zPattern[1]) =
68b0: 3d 20 27 2a 27 20 7c 7c 20 63 20 3d 3d 20 27 3f  = '*' || c == '?
68c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
68d0: 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
68e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53           if( *zS
68f0: 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72  tring==0 ) retur
6900: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n 0;.           
6910: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
6920: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
6930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6940: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
6950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6960: 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
6970: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  1;.        if( c
6980: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
6990: 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 74 72 69     while( *zStri
69a0: 6e 67 20 26 26 20 73 71 6c 69 74 65 47 6c 6f 62  ng && sqliteGlob
69b0: 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72  Compare(&zPatter
69c0: 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29 3d 3d 30  n[1],zString)==0
69d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
69e0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
69f0: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
6a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
6a10: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d  eturn *zString!=
6a20: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
6a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
6a40: 65 28 20 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e  e( (c2 = *zStrin
6a50: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)!=0 ){.       
6a60: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 21       while( c2 !
6a70: 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63 20 29  = 0 && c2 != c )
6a80: 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e  { c2 = *++zStrin
6a90: 67 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  g; }.           
6aa0: 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
6ab0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
6ac0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 47 6c 6f     if( sqliteGlo
6ad0: 62 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65  bCompare(&zPatte
6ae0: 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29  rn[1],zString) )
6af0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78         sqliteNex
6b10: 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a  tChar(zString);.
6b20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6b30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6b40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b50: 63 61 73 65 20 27 3f 27 3a 20 7b 0a 20 20 20 20  case '?': {.    
6b60: 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67      if( *zString
6b70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
6b90: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
6ba0: 0a 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72  .        zPatter
6bb0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n++;.        bre
6bc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6bd0: 20 20 63 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20    case '[': {.  
6be0: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f        int prior_
6bf0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  c = 0;.        s
6c00: 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  een = 0;.       
6c10: 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
6c20: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 43       c = sqliteC
6c30: 68 61 72 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b  harVal(zString);
6c40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
6c50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6c60: 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50        c2 = *++zP
6c70: 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20  attern;.        
6c80: 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69  if( c2=='^' ){ i
6c90: 6e 76 65 72 74 20 3d 20 31 3b 20 63 32 20 3d 20  nvert = 1; c2 = 
6ca0: 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20  *++zPattern; }. 
6cb0: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
6cc0: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]' ){.          
6cd0: 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
6ce0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
6cf0: 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72   c2 = *++zPatter
6d00: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
6d10: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
6d20: 3d 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28  = sqliteCharVal(
6d30: 7a 50 61 74 74 65 72 6e 29 29 21 3d 30 20 26 26  zPattern))!=0 &&
6d40: 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2!=']' ){.    
6d50: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d        if( c2=='-
6d60: 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d  ' && zPattern[1]
6d70: 21 3d 27 5d 27 20 26 26 20 7a 50 61 74 74 65 72  !=']' && zPatter
6d80: 6e 5b 31 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  n[1]!=0 && prior
6d90: 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
6da0: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 63 32 20 3d              c2 =
6dc0: 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a   sqliteCharVal(z
6dd0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
6de0: 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
6df0: 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
6e00: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
6e10: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
6e20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6e30: 73 65 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a  se if( c==c2 ){.
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
6e50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6e60: 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a    prior_c = c2;.
6e70: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
6e90: 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
6ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6eb0: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
6ec0: 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
6ed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6ee0: 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20   c2==0 || (seen 
6ef0: 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72  ^ invert)==0 ) r
6f00: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
6f10: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
6f20: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
6f30: 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20    zPattern++;.  
6f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f50: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
6f60: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  lt: {.        if
6f70: 28 20 63 20 21 3d 20 2a 7a 53 74 72 69 6e 67 20  ( c != *zString 
6f80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6f90: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
6fa0: 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b          zString+
6fb0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
6fc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
6fe0: 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  tring==0;.}../*.
6ff0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55  ** Compare two U
7000: 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72  TF-8 strings for
7010: 20 65 71 75 61 6c 69 74 79 20 75 73 69 6e 67 20   equality using 
7020: 74 68 65 20 22 4c 49 4b 45 22 20 6f 70 65 72 61  the "LIKE" opera
7030: 74 6f 72 20 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20  tor of.** SQL.  
7040: 54 68 65 20 27 25 27 20 63 68 61 72 61 63 74 65  The '%' characte
7050: 72 20 6d 61 74 63 68 65 73 20 61 6e 79 20 73 65  r matches any se
7060: 71 75 65 6e 63 65 20 6f 66 20 30 20 6f 72 20 6d  quence of 0 or m
7070: 6f 72 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ore.** character
7080: 73 20 61 6e 64 20 27 5f 27 20 6d 61 74 63 68 65  s and '_' matche
7090: 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 63 68 61  s any single cha
70a0: 72 61 63 74 65 72 2e 20 20 43 61 73 65 20 69 73  racter.  Case is
70b0: 0a 2a 2a 20 6e 6f 74 20 73 69 67 6e 69 66 69 63  .** not signific
70c0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ant..**.** This 
70d0: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
70e0: 61 6e 20 61 64 61 70 74 61 74 69 6f 6e 20 6f 66  an adaptation of
70f0: 20 74 68 65 20 73 71 6c 69 74 65 47 6c 6f 62 43   the sqliteGlobC
7100: 6f 6d 70 61 72 65 28 29 0a 2a 2a 20 72 6f 75 74  ompare().** rout
7110: 69 6e 65 20 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e  ine above..*/.in
7120: 74 20 0a 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d  t .sqliteLikeCom
7130: 70 61 72 65 28 63 6f 6e 73 74 20 75 6e 73 69 67  pare(const unsig
7140: 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65  ned char *zPatte
7150: 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  rn, const unsign
7160: 65 64 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67  ed char *zString
7170: 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e  ){.  register in
7180: 74 20 63 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a  t c;.  int c2;..
7190: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 55 70    while( (c = Up
71a0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74  perToLower[*zPat
71b0: 74 65 72 6e 5d 29 21 3d 30 20 29 7b 0a 20 20 20  tern])!=0 ){.   
71c0: 20 73 77 69 74 63 68 28 20 63 20 29 7b 0a 20 20   switch( c ){.  
71d0: 20 20 20 20 63 61 73 65 20 27 25 27 3a 20 7b 0a      case '%': {.
71e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
71f0: 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d  c=zPattern[1]) =
7200: 3d 20 27 25 27 20 7c 7c 20 63 20 3d 3d 20 27 5f  = '%' || c == '_
7210: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
7220: 66 28 20 63 3d 3d 27 5f 27 20 29 7b 0a 20 20 20  f( c=='_' ){.   
7230: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53           if( *zS
7240: 74 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72  tring==0 ) retur
7250: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n 0;.           
7260: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
7270: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
7280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7290: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
72a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
72b0: 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
72c0: 31 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 55  1;.        c = U
72d0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
72e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
72f0: 63 32 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  c2=UpperToLower[
7300: 2a 7a 53 74 72 69 6e 67 5d 29 21 3d 30 20 29 7b  *zString])!=0 ){
7310: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
7320: 28 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20  ( c2 != 0 && c2 
7330: 21 3d 20 63 20 29 7b 20 63 32 20 3d 20 55 70 70  != c ){ c2 = Upp
7340: 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74  erToLower[*++zSt
7350: 72 69 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20  ring]; }.       
7360: 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
7370: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
7380: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4c 69 6b     if( sqliteLik
7390: 65 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65  eCompare(&zPatte
73a0: 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29  rn[1],zString) )
73b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
73c0: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
73d0: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
73e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
73f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
7400: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 5f 27  }.      case '_'
7410: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
7420: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
7430: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
7440: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
7450: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
7460: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
7470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7480: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
7490: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
74a0: 20 63 20 21 3d 20 55 70 70 65 72 54 6f 4c 6f 77   c != UpperToLow
74b0: 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20 29 20 72  er[*zString] ) r
74c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
74d0: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
74e0: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
74f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7510: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
7520: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
7530: 43 68 61 6e 67 65 20 74 68 65 20 73 71 6c 69 74  Change the sqlit
7540: 65 2e 6d 61 67 69 63 20 66 72 6f 6d 20 53 51 4c  e.magic from SQL
7550: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 74  ITE_MAGIC_OPEN t
7560: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  o SQLITE_MAGIC_B
7570: 55 53 59 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  USY..** Return a
7580: 6e 20 65 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72  n error (non-zer
7590: 6f 29 20 69 66 20 74 68 65 20 6d 61 67 69 63 20  o) if the magic 
75a0: 77 61 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d  was not SQLITE_M
75b0: 41 47 49 43 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65  AGIC_OPEN.** whe
75c0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
75d0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
75e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
75f0: 61 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  a attempt to det
7600: 65 63 74 20 69 66 20 74 77 6f 20 74 68 72 65 61  ect if two threa
7610: 64 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  ds use the.** sa
7620: 6d 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  me sqlite* point
7630: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
7640: 69 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ime.  There is a
7650: 20 72 61 63 65 20 0a 2a 2a 20 63 6f 6e 64 69 74   race .** condit
7660: 69 6f 6e 20 73 6f 20 69 74 20 69 73 20 70 6f 73  ion so it is pos
7670: 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 65  sible that the e
7680: 72 72 6f 72 20 69 73 20 6e 6f 74 20 64 65 74 65  rror is not dete
7690: 63 74 65 64 2e 0a 2a 2a 20 42 75 74 20 75 73 75  cted..** But usu
76a0: 61 6c 6c 79 20 74 68 65 20 70 72 6f 62 6c 65 6d  ally the problem
76b0: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 2e 20 20   will be seen.  
76c0: 54 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20  The result will 
76d0: 62 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 77  be an.** error w
76e0: 68 69 63 68 20 63 61 6e 20 62 65 20 75 73 65 64  hich can be used
76f0: 20 74 6f 20 64 65 62 75 67 20 74 68 65 20 61 70   to debug the ap
7700: 70 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 69  plication that i
7710: 73 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 69 74  s.** using SQLit
7720: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  e incorrectly..*
7730: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 30 32  *.** Ticket #202
7740: 3a 20 20 49 66 20 64 62 2d 3e 6d 61 67 69 63 20  :  If db->magic 
7750: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f  is not a valid o
7760: 70 65 6e 20 76 61 6c 75 65 2c 20 74 61 6b 65 20  pen value, take 
7770: 63 61 72 65 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d  care not.** to m
7780: 6f 64 69 66 79 20 74 68 65 20 64 62 20 73 74 72  odify the db str
7790: 75 63 74 75 72 65 20 61 74 20 61 6c 6c 2e 20 20  ucture at all.  
77a0: 49 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  It could be that
77b0: 20 64 62 20 69 73 20 61 20 73 74 61 6c 65 0a 2a   db is a stale.*
77c0: 2a 20 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 6f  * pointer.  In o
77d0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 63  ther words, it c
77e0: 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
77f0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  re has been a pr
7800: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
7810: 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64 62 29 20  qlite_close(db) 
7820: 61 6e 64 20 64 62 20 68 61 73 20 62 65 65 6e 20  and db has been 
7830: 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 41 6e  deallocated.  An
7840: 64 20 77 65 20 64 6f 0a 2a 2a 20 6e 6f 74 20 77  d we do.** not w
7850: 61 6e 74 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ant to write int
7860: 6f 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 6d 65  o deallocated me
7870: 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mory..*/.int sql
7880: 69 74 65 53 61 66 65 74 79 4f 6e 28 73 71 6c 69  iteSafetyOn(sqli
7890: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
78a0: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
78b0: 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b 0a 20  _MAGIC_OPEN ){. 
78c0: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
78d0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
78e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
78f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
7900: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7910: 47 49 43 5f 42 55 53 59 20 7c 7c 20 64 62 2d 3e  GIC_BUSY || db->
7920: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7930: 47 49 43 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  GIC_ERROR.      
7940: 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 77 61         || db->wa
7950: 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20  nt_to_close ){. 
7960: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
7970: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
7980: 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  R;.    db->flags
7990: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
79a0: 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rupt;.  }.  retu
79b0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
79c0: 68 61 6e 67 65 20 74 68 65 20 6d 61 67 69 63 20  hange the magic 
79d0: 66 72 6f 6d 20 53 51 4c 49 54 45 5f 4d 41 47 49  from SQLITE_MAGI
79e0: 43 5f 42 55 53 59 20 74 6f 20 53 51 4c 49 54 45  C_BUSY to SQLITE
79f0: 5f 4d 41 47 49 43 5f 4f 50 45 4e 2e 0a 2a 2a 20  _MAGIC_OPEN..** 
7a00: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
7a10: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
7a20: 65 20 6d 61 67 69 63 20 77 61 73 20 6e 6f 74 20  e magic was not 
7a30: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
7a40: 59 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  Y.** when this r
7a50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7a60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53  ..*/.int sqliteS
7a70: 61 66 65 74 79 4f 66 66 28 73 71 6c 69 74 65 20  afetyOff(sqlite 
7a80: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
7a90: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7aa0: 47 49 43 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  GIC_BUSY ){.    
7ab0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
7ac0: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
7ad0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7ae0: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6d 61 67  else if( db->mag
7af0: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
7b00: 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67  _OPEN || db->mag
7b10: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
7b20: 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20  _ERROR.         
7b30: 20 20 20 20 7c 7c 20 64 62 2d 3e 77 61 6e 74 5f      || db->want_
7b40: 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20 20 20 20  to_close ){.    
7b50: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
7b60: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
7b70: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
7b80: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70   SQLITE_Interrup
7b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
7ba0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  1;.}../*.** Chec
7bb0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77  k to make sure w
7bc0: 65 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  e are not curren
7bd0: 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20 61 6e  tly executing an
7be0: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a   sqlite_exec()..
7bf0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
7c00: 72 65 6e 74 6c 79 20 69 6e 20 61 6e 20 73 71 6c  rently in an sql
7c10: 69 74 65 5f 65 78 65 63 28 29 2c 20 72 65 74 75  ite_exec(), retu
7c20: 72 6e 20 74 72 75 65 20 61 6e 64 20 73 65 74 0a  rn true and set.
7c30: 2a 2a 20 73 71 6c 69 74 65 2e 6d 61 67 69 63 20  ** sqlite.magic 
7c40: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
7c50: 45 52 52 4f 52 2e 20 20 54 68 69 73 20 77 69 6c  ERROR.  This wil
7c60: 6c 20 63 61 75 73 65 20 61 20 63 6f 6d 70 6c 65  l cause a comple
7c70: 74 65 0a 2a 2a 20 73 68 75 74 64 6f 77 6e 20 6f  te.** shutdown o
7c80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
7c90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7ca0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
7cb0: 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e  y to detect when
7cc0: 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
7cd0: 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 74 20 74  e called.** at t
7ce0: 68 65 20 77 72 6f 6e 67 20 74 69 6d 65 20 6f 72  he wrong time or
7cf0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 73 65   in the wrong se
7d00: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  quence..*/.int s
7d10: 71 6c 69 74 65 53 61 66 65 74 79 43 68 65 63 6b  qliteSafetyCheck
7d20: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
7d30: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 21 3d 30  if( db->pVdbe!=0
7d40: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
7d50: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
7d60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
7d70: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
7d80: 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.