/ Hex Artifact Content
Login

Artifact 0e3bf40dafe75805495454ff5283b552f14b5d4d:


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: 30 20 32 30 30 34 2f 30 31 2f 30 36 20 30 31 3a  0 2004/01/06 01:
0230: 31 33 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a  13:47 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 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63     sqlite_malloc
19b0: 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 65 6c  _failed++;.  }el
19c0: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  se{.    memset(p
19d0: 2c 20 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  , 0, n);.  }.  r
19e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
19f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  * Allocate new m
1a00: 65 6d 6f 72 79 20 62 75 74 20 64 6f 20 6e 6f 74  emory but do not
1a10: 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2e   set it to zero.
1a20: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1a30: 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69 73  .** no memory is
1a40: 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 65 65   available.  See
1a50: 20 61 6c 73 6f 20 73 71 6c 69 74 65 4d 61 6c 6c   also sqliteMall
1a60: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  oc()..*/.void *s
1a70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 69  qliteMallocRaw(i
1a80: 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70  nt n){.  void *p
1a90: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 6d 61 6c  ;.  if( (p = mal
1aa0: 6c 6f 63 28 6e 29 29 3d 3d 30 20 29 7b 0a 20 20  loc(n))==0 ){.  
1ab0: 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f    sqlite_malloc_
1ac0: 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 0a 20 20  failed++;.  }.  
1ad0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1ae0: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70  ** Free memory p
1af0: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
1b00: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
1b10: 6c 6c 6f 63 28 29 0a 2a 2f 0a 76 6f 69 64 20 73  lloc().*/.void s
1b20: 71 6c 69 74 65 46 72 65 65 28 76 6f 69 64 20 2a  qliteFree(void *
1b30: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
1b40: 20 20 20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a     free(p);.  }.
1b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
1b60: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
1b70: 6f 6e 2e 20 20 49 66 20 70 3d 3d 30 2c 20 74 68  on.  If p==0, th
1b80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1b90: 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  ** works just li
1ba0: 6b 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ke sqliteMalloc(
1bb0: 29 2e 20 20 49 66 20 6e 3d 3d 30 2c 20 74 68 65  ).  If n==0, the
1bc0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1bd0: 2a 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  * works just lik
1be0: 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a  e sqliteFree()..
1bf0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 52  */.void *sqliteR
1c00: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 2c 20  ealloc(void *p, 
1c10: 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a  int n){.  void *
1c20: 70 32 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p2;.  if( p==0 )
1c30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
1c40: 69 74 65 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20  iteMalloc(n);.  
1c50: 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  }.  if( n==0 ){.
1c60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1c70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1c80: 0a 20 20 7d 0a 20 20 70 32 20 3d 20 72 65 61 6c  .  }.  p2 = real
1c90: 6c 6f 63 28 70 2c 20 6e 29 3b 0a 20 20 69 66 28  loc(p, n);.  if(
1ca0: 20 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   p2==0 ){.    sq
1cb0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
1cc0: 65 64 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ed++;.  }.  retu
1cd0: 72 6e 20 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn p2;.}../*.** 
1ce0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61  Make a copy of a
1cf0: 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72   string in memor
1d00: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1d10: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a  sqliteMalloc().*
1d20: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 53 74  /.char *sqliteSt
1d30: 72 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  rDup(const char 
1d40: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  *z){.  char *zNe
1d50: 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  w;.  if( z==0 ) 
1d60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65 77  return 0;.  zNew
1d70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1d80: 61 77 28 73 74 72 6c 65 6e 28 7a 29 2b 31 29 3b  aw(strlen(z)+1);
1d90: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74  .  if( zNew ) st
1da0: 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b 0a 20  rcpy(zNew, z);. 
1db0: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
1dc0: 63 68 61 72 20 2a 73 71 6c 69 74 65 53 74 72 4e  char *sqliteStrN
1dd0: 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Dup(const char *
1de0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68 61  z, int n){.  cha
1df0: 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a  r *zNew;.  if( z
1e00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e10: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    zNew = sqliteM
1e20: 61 6c 6c 6f 63 52 61 77 28 6e 2b 31 29 3b 0a 20  allocRaw(n+1);. 
1e30: 20 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20   if( zNew ){.   
1e40: 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c   memcpy(zNew, z,
1e50: 20 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d   n);.    zNew[n]
1e60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1e70: 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69  rn zNew;.}.#endi
1e80: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4d 45  f /* !defined(ME
1e90: 4d 4f 52 59 5f 44 45 42 55 47 29 20 2a 2f 0a 0a  MORY_DEBUG) */..
1ea0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 73  /*.** Create a s
1eb0: 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 32  tring from the 2
1ec0: 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1ed0: 74 20 61 72 67 75 6d 65 6e 74 73 20 28 75 70 20  t arguments (up 
1ee0: 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  to the.** first 
1ef0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29 2c 20  NULL argument), 
1f00: 73 74 6f 72 65 20 74 68 65 20 73 74 72 69 6e 67  store the string
1f10: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
1f20: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1f30: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
1f40: 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ake the pointer 
1f50: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1f60: 20 31 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   1st argument.**
1f70: 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
1f80: 74 72 69 6e 67 2e 20 20 54 68 65 20 31 73 74 20  tring.  The 1st 
1f90: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 65 69  argument must ei
1fa0: 74 68 65 72 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ther be NULL or 
1fb0: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d  .** point to mem
1fc0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1fd0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
1fe0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ff0: 53 65 74 53 74 72 69 6e 67 28 63 68 61 72 20 2a  SetString(char *
2000: 2a 70 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *pz, const char 
2010: 2a 7a 46 69 72 73 74 2c 20 2e 2e 2e 29 7b 0a 20  *zFirst, ...){. 
2020: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2030: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73  nt nByte;.  cons
2040: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61  t char *z;.  cha
2050: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 0a 20 20 69  r *zResult;..  i
2060: 66 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72  f( pz==0 ) retur
2070: 6e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72  n;.  nByte = str
2080: 6c 65 6e 28 7a 46 69 72 73 74 29 20 2b 20 31 3b  len(zFirst) + 1;
2090: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
20a0: 7a 46 69 72 73 74 29 3b 0a 20 20 77 68 69 6c 65  zFirst);.  while
20b0: 28 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (z = va_arg(ap
20c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21  , const char*))!
20d0: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
20e0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  += strlen(z);.  
20f0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
2100: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
2110: 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75  );.  *pz = zResu
2120: 6c 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  lt = sqliteMallo
2130: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
2140: 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20   if( zResult==0 
2150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
2160: 20 7d 0a 20 20 73 74 72 63 70 79 28 7a 52 65 73   }.  strcpy(zRes
2170: 75 6c 74 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20  ult, zFirst);.  
2180: 7a 52 65 73 75 6c 74 20 2b 3d 20 73 74 72 6c 65  zResult += strle
2190: 6e 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 76 61  n(zResult);.  va
21a0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 69 72 73  _start(ap, zFirs
21b0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  t);.  while( (z 
21c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
21d0: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
21e0: 0a 20 20 20 20 73 74 72 63 70 79 28 7a 52 65 73  .    strcpy(zRes
21f0: 75 6c 74 2c 20 7a 29 3b 0a 20 20 20 20 7a 52 65  ult, z);.    zRe
2200: 73 75 6c 74 20 2b 3d 20 73 74 72 6c 65 6e 28 7a  sult += strlen(z
2210: 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 76  Result);.  }.  v
2220: 61 5f 65 6e 64 28 61 70 29 3b 0a 23 69 66 64 65  a_end(ap);.#ifde
2230: 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a 23  f MEMORY_DEBUG.#
2240: 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e  if MEMORY_DEBUG>
2250: 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  1.  fprintf(stde
2260: 72 72 2c 22 73 74 72 69 6e 67 20 61 74 20 30 78  rr,"string at 0x
2270: 25 78 20 69 73 20 25 73 5c 6e 22 2c 20 28 69 6e  %x is %s\n", (in
2280: 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a 23 65 6e  t)*pz, *pz);.#en
2290: 64 69 66 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  dif.#endif.}../*
22a0: 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  .** Works like s
22b0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 2c 20  qliteSetString, 
22c0: 62 75 74 20 65 61 63 68 20 73 74 72 69 6e 67 20  but each string 
22d0: 69 73 20 6e 6f 77 20 66 6f 6c 6c 6f 77 65 64 20  is now followed 
22e0: 62 79 0a 2a 2a 20 61 20 6c 65 6e 67 74 68 20 69  by.** a length i
22f0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 73 70 65  nteger which spe
2300: 63 69 66 69 65 73 20 68 6f 77 20 6d 75 63 68 20  cifies how much 
2310: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 73 74  of the source st
2320: 72 69 6e 67 20 0a 2a 2a 20 74 6f 20 63 6f 70 79  ring .** to copy
2330: 20 28 69 6e 20 62 79 74 65 73 29 2e 20 20 2d 31   (in bytes).  -1
2340: 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65 20 77   means use the w
2350: 68 6f 6c 65 20 73 74 72 69 6e 67 2e 20 20 54 68  hole string.  Th
2360: 65 20 31 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  e 1st .** argume
2370: 6e 74 20 6d 75 73 74 20 65 69 74 68 65 72 20 62  nt must either b
2380: 65 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20  e NULL or point 
2390: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
23a0: 65 64 20 66 72 6f 6d 20 0a 2a 2a 20 73 71 6c 69  ed from .** sqli
23b0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76  teMalloc()..*/.v
23c0: 6f 69 64 20 73 71 6c 69 74 65 53 65 74 4e 53 74  oid sqliteSetNSt
23d0: 72 69 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20  ring(char **pz, 
23e0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
23f0: 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ap;.  int nByte;
2400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2410: 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  ;.  char *zResul
2420: 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  t;.  int n;..  i
2430: 66 28 20 70 7a 3d 3d 30 20 29 20 72 65 74 75 72  f( pz==0 ) retur
2440: 6e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  n;.  nByte = 0;.
2450: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
2460: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  z);.  while( (z 
2470: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
2480: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
2490: 0a 20 20 20 20 6e 20 3d 20 76 61 5f 61 72 67 28  .    n = va_arg(
24a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 69 66  ap, int);.    if
24b0: 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n<=0 ) n = str
24c0: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 6e 42 79 74  len(z);.    nByt
24d0: 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20 76 61  e += n;.  }.  va
24e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69  _end(ap);.  sqli
24f0: 74 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a  teFree(*pz);.  *
2500: 70 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73  pz = zResult = s
2510: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2520: 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a 20 20 69  nByte + 1 );.  i
2530: 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( zResult==0 ) 
2540: 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61  return;.  va_sta
2550: 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68  rt(ap, pz);.  wh
2560: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
2570: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
2580: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ))!=0 ){.    n =
2590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
25a0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
25b0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
25c0: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 73      strncpy(zRes
25d0: 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ult, z, n);.    
25e0: 7a 52 65 73 75 6c 74 20 2b 3d 20 6e 3b 0a 20 20  zResult += n;.  
25f0: 7d 0a 20 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  }.  *zResult = 0
2600: 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f  ;.#ifdef MEMORY_
2610: 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f 52 59  DEBUG.#if MEMORY
2620: 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69 6e  _DEBUG>1.  fprin
2630: 74 66 28 73 74 64 65 72 72 2c 22 73 74 72 69 6e  tf(stderr,"strin
2640: 67 20 61 74 20 30 78 25 78 20 69 73 20 25 73 5c  g at 0x%x is %s\
2650: 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20 2a 70  n", (int)*pz, *p
2660: 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  z);.#endif.#endi
2670: 66 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  f.  va_end(ap);.
2680: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
2690: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
26a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
26b0: 20 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 70   and increment p
26c0: 50 61 72 73 65 2d 3e 6e 45 72 72 2e 0a 2a 2a 20  Parse->nErr..** 
26d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  The following fo
26e0: 72 6d 61 74 74 69 6e 67 20 63 68 61 72 61 63 74  rmatting charact
26f0: 65 72 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 3a  ers are allowed:
2700: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 73 20 20  .**.**      %s  
2710: 20 20 20 20 49 6e 73 65 72 74 20 61 20 73 74 72      Insert a str
2720: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 25 7a 20 20  ing.**      %z  
2730: 20 20 20 20 41 20 73 74 72 69 6e 67 20 74 68 61      A string tha
2740: 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  t should be free
2750: 64 20 61 66 74 65 72 20 75 73 65 0a 2a 2a 20 20  d after use.**  
2760: 20 20 20 20 25 64 20 20 20 20 20 20 49 6e 73 65      %d      Inse
2770: 72 74 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a  rt an integer.**
2780: 20 20 20 20 20 20 25 54 20 20 20 20 20 20 49 6e        %T      In
2790: 73 65 72 74 20 61 20 74 6f 6b 65 6e 0a 2a 2a 20  sert a token.** 
27a0: 20 20 20 20 20 25 53 20 20 20 20 20 20 49 6e 73       %S      Ins
27b0: 65 72 74 20 74 68 65 20 66 69 72 73 74 20 65 6c  ert the first el
27c0: 65 6d 65 6e 74 20 6f 66 20 61 20 53 72 63 4c 69  ement of a SrcLi
27d0: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
27e0: 65 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20  eErrorMsg(Parse 
27f0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
2800: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2810: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2820: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
2830: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
2840: 72 20 2a 7a 3b 0a 20 20 73 74 61 74 69 63 20 63  r *z;.  static c
2850: 68 61 72 20 7a 4e 75 6c 6c 5b 5d 20 3d 20 22 4e  har zNull[] = "N
2860: 55 4c 4c 22 3b 0a 0a 20 20 70 50 61 72 73 65 2d  ULL";..  pParse-
2870: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 6e 42 79 74 65  >nErr++;.  nByte
2880: 20 3d 20 31 20 2b 20 73 74 72 6c 65 6e 28 7a 46   = 1 + strlen(zF
2890: 6f 72 6d 61 74 29 3b 0a 20 20 76 61 5f 73 74 61  ormat);.  va_sta
28a0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
28b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 46 6f 72  .  for(i=0; zFor
28c0: 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  mat[i]; i++){.  
28d0: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d    if( zFormat[i]
28e0: 21 3d 27 25 27 20 7c 7c 20 7a 46 6f 72 6d 61 74  !='%' || zFormat
28f0: 5b 69 2b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  [i+1]==0 ) conti
2900: 6e 75 65 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  nue;.    i++;.  
2910: 20 20 73 77 69 74 63 68 28 20 7a 46 6f 72 6d 61    switch( zForma
2920: 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  t[i] ){.      ca
2930: 73 65 20 27 64 27 3a 20 7b 0a 20 20 20 20 20 20  se 'd': {.      
2940: 20 20 28 76 6f 69 64 29 76 61 5f 61 72 67 28 61    (void)va_arg(a
2950: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
2960: 20 6e 42 79 74 65 20 2b 3d 20 32 30 3b 0a 20 20   nByte += 20;.  
2970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2980: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2990: 27 7a 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'z':.      case 
29a0: 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 63  's': {.        c
29b0: 68 61 72 20 2a 7a 32 20 3d 20 76 61 5f 61 72 67  har *z2 = va_arg
29c0: 28 61 70 2c 20 63 68 61 72 2a 29 3b 0a 20 20 20  (ap, char*);.   
29d0: 20 20 20 20 20 69 66 28 20 7a 32 3d 3d 30 20 29       if( z2==0 )
29e0: 20 7a 32 20 3d 20 7a 4e 75 6c 6c 3b 0a 20 20 20   z2 = zNull;.   
29f0: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74       nByte += st
2a00: 72 6c 65 6e 28 7a 32 29 3b 0a 20 20 20 20 20 20  rlen(z2);.      
2a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a20: 0a 20 20 20 20 20 20 63 61 73 65 20 27 54 27 3a  .      case 'T':
2a30: 20 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e   {.        Token
2a40: 20 2a 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   *p = va_arg(ap,
2a50: 20 54 6f 6b 65 6e 2a 29 3b 0a 20 20 20 20 20 20   Token*);.      
2a60: 20 20 6e 42 79 74 65 20 2b 3d 20 70 2d 3e 6e 3b    nByte += p->n;
2a70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2a90: 73 65 20 27 53 27 3a 20 7b 0a 20 20 20 20 20 20  se 'S': {.      
2aa0: 20 20 53 72 63 4c 69 73 74 20 2a 70 20 3d 20 76    SrcList *p = v
2ab0: 61 5f 61 72 67 28 61 70 2c 20 53 72 63 4c 69 73  a_arg(ap, SrcLis
2ac0: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t*);.        int
2ad0: 20 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20   k = va_arg(ap, 
2ae0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  int);.        as
2af0: 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 6b 20  sert( p->nSrc>k 
2b00: 26 26 20 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && k>=0 );.     
2b10: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
2b20: 65 6e 28 70 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  en(p->a[k].zName
2b30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2b40: 2d 3e 61 5b 6b 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[k].zDatabase
2b50: 20 26 26 20 70 2d 3e 61 5b 6b 5d 2e 7a 44 61 74   && p->a[k].zDat
2b60: 61 62 61 73 65 5b 30 5d 20 29 7b 0a 20 20 20 20  abase[0] ){.    
2b70: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
2b80: 74 72 6c 65 6e 28 70 2d 3e 61 5b 6b 5d 2e 7a 44  trlen(p->a[k].zD
2b90: 61 74 61 62 61 73 65 29 2b 31 3b 0a 20 20 20 20  atabase)+1;.    
2ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
2bb0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2bc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
2bd0: 20 20 20 20 20 20 6e 42 79 74 65 2b 2b 3b 0a 20        nByte++;. 
2be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2bf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c00: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2c10: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
2c20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
2c30: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
2c40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
2c50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  rse->zErrMsg);. 
2c60: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2c70: 20 3d 20 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74   = z;.  va_start
2c80: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
2c90: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 6f 72   for(i=j=0; zFor
2ca0: 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  mat[i]; i++){.  
2cb0: 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d    if( zFormat[i]
2cc0: 21 3d 27 25 27 20 7c 7c 20 7a 46 6f 72 6d 61 74  !='%' || zFormat
2cd0: 5b 69 2b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  [i+1]==0 ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 6a  nue;.    if( i>j
2cf0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2d00: 28 7a 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  (z, &zFormat[j],
2d10: 20 69 2d 6a 29 3b 0a 20 20 20 20 20 20 7a 20 2b   i-j);.      z +
2d20: 3d 20 69 2d 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  = i-j;.    }.   
2d30: 20 6a 20 3d 20 69 2b 32 3b 0a 20 20 20 20 69 2b   j = i+2;.    i+
2d40: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a  +;.    switch( z
2d50: 46 6f 72 6d 61 74 5b 69 5d 20 29 7b 0a 20 20 20  Format[i] ){.   
2d60: 20 20 20 63 61 73 65 20 27 64 27 3a 20 7b 0a 20     case 'd': {. 
2d70: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76         int x = v
2d80: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
2d90: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
2da0: 7a 2c 20 22 25 64 22 2c 20 78 29 3b 0a 20 20 20  z, "%d", x);.   
2db0: 20 20 20 20 20 7a 20 2b 3d 20 73 74 72 6c 65 6e       z += strlen
2dc0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
2dd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2de0: 20 20 63 61 73 65 20 27 7a 27 3a 0a 20 20 20 20    case 'z':.    
2df0: 20 20 63 61 73 65 20 27 73 27 3a 20 7b 0a 20 20    case 's': {.  
2e00: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
2e10: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 32 20         char *z2 
2e20: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 68 61  = va_arg(ap, cha
2e30: 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r*);.        if(
2e40: 20 7a 32 3d 3d 30 20 29 20 7a 32 20 3d 20 7a 4e   z2==0 ) z2 = zN
2e50: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ull;.        len
2e60: 20 3d 20 73 74 72 6c 65 6e 28 7a 32 29 3b 0a 20   = strlen(z2);. 
2e70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c         memcpy(z,
2e80: 20 7a 32 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20   z2, len);.     
2e90: 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     z += len;.   
2ea0: 20 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74       if( zFormat
2eb0: 5b 69 5d 3d 3d 27 7a 27 20 26 26 20 7a 32 21 3d  [i]=='z' && z2!=
2ec0: 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zNull ){.       
2ed0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 32     sqliteFree(z2
2ee0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f00: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
2f10: 54 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 6f  T': {.        To
2f20: 6b 65 6e 20 2a 70 20 3d 20 76 61 5f 61 72 67 28  ken *p = va_arg(
2f30: 61 70 2c 20 54 6f 6b 65 6e 2a 29 3b 0a 20 20 20  ap, Token*);.   
2f40: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
2f50: 2d 3e 7a 2c 20 70 2d 3e 6e 29 3b 0a 20 20 20 20  ->z, p->n);.    
2f60: 20 20 20 20 7a 20 2b 3d 20 70 2d 3e 6e 3b 0a 20      z += p->n;. 
2f70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2f90: 20 27 53 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'S': {.        
2fa0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20  int len;.       
2fb0: 20 53 72 63 4c 69 73 74 20 2a 70 20 3d 20 76 61   SrcList *p = va
2fc0: 5f 61 72 67 28 61 70 2c 20 53 72 63 4c 69 73 74  _arg(ap, SrcList
2fd0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
2fe0: 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
2ff0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nt);.        ass
3000: 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 6b 20 26  ert( p->nSrc>k &
3010: 26 20 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  & k>=0 );.      
3020: 20 20 69 66 28 20 70 2d 3e 61 5b 6b 5d 2e 7a 44    if( p->a[k].zD
3030: 61 74 61 62 61 73 65 20 26 26 20 70 2d 3e 61 5b  atabase && p->a[
3040: 6b 5d 2e 7a 44 61 74 61 62 61 73 65 5b 30 5d 20  k].zDatabase[0] 
3050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  ){.          len
3060: 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 61 5b 6b   = strlen(p->a[k
3070: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
3080: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
3090: 2c 20 70 2d 3e 61 5b 6b 5d 2e 7a 44 61 74 61 62  , p->a[k].zDatab
30a0: 61 73 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ase, len);.     
30b0: 20 20 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20       z += len;. 
30c0: 20 20 20 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20           *(z++) 
30d0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '.';.        }
30e0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  .        len = s
30f0: 74 72 6c 65 6e 28 70 2d 3e 61 5b 6b 5d 2e 7a 4e  trlen(p->a[k].zN
3100: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ame);.        me
3110: 6d 63 70 79 28 7a 2c 20 70 2d 3e 61 5b 6b 5d 2e  mcpy(z, p->a[k].
3120: 7a 4e 61 6d 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zName, len);.   
3130: 20 20 20 20 20 7a 20 2b 3d 20 6c 65 6e 3b 0a 20       z += len;. 
3140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3150: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
3160: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 2a  ult: {.        *
3170: 28 7a 2b 2b 29 20 3d 20 7a 46 6f 72 6d 61 74 5b  (z++) = zFormat[
3180: 69 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  i];.        brea
3190: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
31a0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
31b0: 29 3b 0a 20 20 69 66 28 20 69 3e 6a 20 29 7b 0a  );.  if( i>j ){.
31c0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 26 7a      memcpy(z, &z
31d0: 46 6f 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a 29 3b  Format[j], i-j);
31e0: 0a 20 20 20 20 7a 20 2b 3d 20 69 2d 6a 3b 0a 20  .    z += i-j;. 
31f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 7a 20   }.  assert( (z 
3200: 2d 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  - pParse->zErrMs
3210: 67 29 20 3c 20 6e 42 79 74 65 20 29 3b 0a 20 20  g) < nByte );.  
3220: 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *z = 0;.}../*.**
3230: 20 43 6f 6e 76 65 72 74 20 61 6e 20 53 51 4c 2d   Convert an SQL-
3240: 73 74 79 6c 65 20 71 75 6f 74 65 64 20 73 74 72  style quoted str
3250: 69 6e 67 20 69 6e 74 6f 20 61 20 6e 6f 72 6d 61  ing into a norma
3260: 6c 20 73 74 72 69 6e 67 20 62 79 20 72 65 6d 6f  l string by remo
3270: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 71 75 6f 74  ving.** the quot
3280: 65 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  e characters.  T
3290: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  he conversion is
32a0: 20 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65 2e 20   done in-place. 
32b0: 20 49 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74   If the.** input
32c0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
32d0: 77 69 74 68 20 61 20 71 75 6f 74 65 20 63 68 61  with a quote cha
32e0: 72 61 63 74 65 72 2c 20 74 68 65 6e 20 74 68 69  racter, then thi
32f0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
3300: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 32  a no-op..**.** 2
3310: 30 30 32 2d 46 65 62 2d 31 34 3a 20 54 68 69 73  002-Feb-14: This
3320: 20 72 6f 75 74 69 6e 65 20 69 73 20 65 78 74 65   routine is exte
3330: 6e 64 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 4d  nded to remove M
3340: 53 2d 41 63 63 65 73 73 20 73 74 79 6c 65 0a 2a  S-Access style.*
3350: 2a 20 62 72 61 63 6b 65 74 73 20 66 72 6f 6d 20  * brackets from 
3360: 61 72 6f 75 6e 64 20 69 64 65 6e 74 69 66 65 72  around identifer
3370: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3380: 20 20 22 5b 61 2d 62 2d 63 5d 22 20 62 65 63 6f    "[a-b-c]" beco
3390: 6d 65 73 0a 2a 2a 20 22 61 2d 62 2d 63 22 2e 0a  mes.** "a-b-c"..
33a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65  */.void sqliteDe
33b0: 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b 0a  quote(char *z){.
33c0: 20 20 69 6e 74 20 71 75 6f 74 65 3b 0a 20 20 69    int quote;.  i
33d0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 7a  nt i, j;.  if( z
33e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
33f0: 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20  quote = z[0];.  
3400: 73 77 69 74 63 68 28 20 71 75 6f 74 65 20 29 7b  switch( quote ){
3410: 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a 20  .    case '\'': 
3420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3430: 20 27 22 27 3a 20 20 20 62 72 65 61 6b 3b 0a 20   '"':   break;. 
3440: 20 20 20 63 61 73 65 20 27 5b 27 3a 20 20 20 71     case '[':   q
3450: 75 6f 74 65 20 3d 20 27 5d 27 3b 20 20 62 72 65  uote = ']';  bre
3460: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
3470: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3480: 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20    for(i=1, j=0; 
3490: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
34a0: 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65 20  if( z[i]==quote 
34b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
34c0: 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  +1]==quote ){.  
34d0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 71        z[j++] = q
34e0: 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69 2b  uote;.        i+
34f0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
3500: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
3510: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
3520: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b  else{.      z[j+
3540: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 7d  +] = z[i];.    }
3550: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 61 72  .  }.}../* An ar
3560: 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20 75  ray to map all u
3570: 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61 63  pper-case charac
3580: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72 20  ters into their 
3590: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
35a0: 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61 72   lower-case char
35b0: 61 63 74 65 72 2e 20 0a 2a 2f 0a 73 74 61 74 69  acter. .*/.stati
35c0: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
35d0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 5d 20 3d  UpperToLower[] =
35e0: 20 7b 0a 20 20 20 20 20 20 30 2c 20 20 31 2c 20   {.      0,  1, 
35f0: 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20   2,  3,  4,  5, 
3600: 20 36 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c 20   6,  7,  8,  9, 
3610: 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c 20  10, 11, 12, 13, 
3620: 31 34 2c 20 31 35 2c 20 31 36 2c 20 31 37 2c 0a  14, 15, 16, 17,.
3630: 20 20 20 20 20 31 38 2c 20 31 39 2c 20 32 30 2c       18, 19, 20,
3640: 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c   21, 22, 23, 24,
3650: 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c   25, 26, 27, 28,
3660: 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32 2c   29, 30, 31, 32,
3670: 20 33 33 2c 20 33 34 2c 20 33 35 2c 0a 20 20 20   33, 34, 35,.   
3680: 20 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 33 39    36, 37, 38, 39
3690: 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34 33  , 40, 41, 42, 43
36a0: 2c 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37  , 44, 45, 46, 47
36b0: 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31  , 48, 49, 50, 51
36c0: 2c 20 35 32 2c 20 35 33 2c 0a 20 20 20 20 20 35  , 52, 53,.     5
36d0: 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35  4, 55, 56, 57, 5
36e0: 38 2c 20 35 39 2c 20 36 30 2c 20 36 31 2c 20 36  8, 59, 60, 61, 6
36f0: 32 2c 20 36 33 2c 20 36 34 2c 20 39 37 2c 20 39  2, 63, 64, 97, 9
3700: 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30  8, 99,100,101,10
3710: 32 2c 31 30 33 2c 0a 20 20 20 20 31 30 34 2c 31  2,103,.    104,1
3720: 30 35 2c 31 30 36 2c 31 30 37 2c 31 30 38 2c 31  05,106,107,108,1
3730: 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31  09,110,111,112,1
3740: 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31  13,114,115,116,1
3750: 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31  17,118,119,120,1
3760: 32 31 2c 0a 20 20 20 20 31 32 32 2c 20 39 31 2c  21,.    122, 91,
3770: 20 39 32 2c 20 39 33 2c 20 39 34 2c 20 39 35 2c   92, 93, 94, 95,
3780: 20 39 36 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c   96, 97, 98, 99,
3790: 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c  100,101,102,103,
37a0: 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c  104,105,106,107,
37b0: 0a 20 20 20 20 31 30 38 2c 31 30 39 2c 31 31 30  .    108,109,110
37c0: 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31 34  ,111,112,113,114
37d0: 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31 38  ,115,116,117,118
37e0: 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 31 32 32  ,119,120,121,122
37f0: 2c 31 32 33 2c 31 32 34 2c 31 32 35 2c 0a 20 20  ,123,124,125,.  
3800: 20 20 31 32 36 2c 31 32 37 2c 31 32 38 2c 31 32    126,127,128,12
3810: 39 2c 31 33 30 2c 31 33 31 2c 31 33 32 2c 31 33  9,130,131,132,13
3820: 33 2c 31 33 34 2c 31 33 35 2c 31 33 36 2c 31 33  3,134,135,136,13
3830: 37 2c 31 33 38 2c 31 33 39 2c 31 34 30 2c 31 34  7,138,139,140,14
3840: 31 2c 31 34 32 2c 31 34 33 2c 0a 20 20 20 20 31  1,142,143,.    1
3850: 34 34 2c 31 34 35 2c 31 34 36 2c 31 34 37 2c 31  44,145,146,147,1
3860: 34 38 2c 31 34 39 2c 31 35 30 2c 31 35 31 2c 31  48,149,150,151,1
3870: 35 32 2c 31 35 33 2c 31 35 34 2c 31 35 35 2c 31  52,153,154,155,1
3880: 35 36 2c 31 35 37 2c 31 35 38 2c 31 35 39 2c 31  56,157,158,159,1
3890: 36 30 2c 31 36 31 2c 0a 20 20 20 20 31 36 32 2c  60,161,.    162,
38a0: 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 36 36 2c  163,164,165,166,
38b0: 31 36 37 2c 31 36 38 2c 31 36 39 2c 31 37 30 2c  167,168,169,170,
38c0: 31 37 31 2c 31 37 32 2c 31 37 33 2c 31 37 34 2c  171,172,173,174,
38d0: 31 37 35 2c 31 37 36 2c 31 37 37 2c 31 37 38 2c  175,176,177,178,
38e0: 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 31 38 31  179,.    180,181
38f0: 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38 35  ,182,183,184,185
3900: 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38 39  ,186,187,188,189
3910: 2c 31 39 30 2c 31 39 31 2c 31 39 32 2c 31 39 33  ,190,191,192,193
3920: 2c 31 39 34 2c 31 39 35 2c 31 39 36 2c 31 39 37  ,194,195,196,197
3930: 2c 0a 20 20 20 20 31 39 38 2c 31 39 39 2c 32 30  ,.    198,199,20
3940: 30 2c 32 30 31 2c 32 30 32 2c 32 30 33 2c 32 30  0,201,202,203,20
3950: 34 2c 32 30 35 2c 32 30 36 2c 32 30 37 2c 32 30  4,205,206,207,20
3960: 38 2c 32 30 39 2c 32 31 30 2c 32 31 31 2c 32 31  8,209,210,211,21
3970: 32 2c 32 31 33 2c 32 31 34 2c 32 31 35 2c 0a 20  2,213,214,215,. 
3980: 20 20 20 32 31 36 2c 32 31 37 2c 32 31 38 2c 32     216,217,218,2
3990: 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 32 2c 32  19,220,221,222,2
39a0: 32 33 2c 32 32 34 2c 32 32 35 2c 32 32 36 2c 32  23,224,225,226,2
39b0: 32 37 2c 32 32 38 2c 32 32 39 2c 32 33 30 2c 32  27,228,229,230,2
39c0: 33 31 2c 32 33 32 2c 32 33 33 2c 0a 20 20 20 20  31,232,233,.    
39d0: 32 33 34 2c 32 33 35 2c 32 33 36 2c 32 33 37 2c  234,235,236,237,
39e0: 32 33 38 2c 32 33 39 2c 32 34 30 2c 32 34 31 2c  238,239,240,241,
39f0: 32 34 32 2c 32 34 33 2c 32 34 34 2c 32 34 35 2c  242,243,244,245,
3a00: 32 34 36 2c 32 34 37 2c 32 34 38 2c 32 34 39 2c  246,247,248,249,
3a10: 32 35 30 2c 32 35 31 2c 0a 20 20 20 20 32 35 32  250,251,.    252
3a20: 2c 32 35 33 2c 32 35 34 2c 32 35 35 0a 7d 3b 0a  ,253,254,255.};.
3a30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3a40: 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73 20 61 20  tion computes a 
3a50: 68 61 73 68 20 6f 6e 20 74 68 65 20 6e 61 6d 65  hash on the name
3a60: 20 6f 66 20 61 20 6b 65 79 77 6f 72 64 2e 0a 2a   of a keyword..*
3a70: 2a 20 43 61 73 65 20 69 73 20 6e 6f 74 20 73 69  * Case is not si
3a80: 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2f 0a 69 6e  gnificant..*/.in
3a90: 74 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61  t sqliteHashNoCa
3aa0: 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  se(const char *z
3ab0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
3ac0: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3c 3d  h = 0;.  if( n<=
3ad0: 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  0 ) n = strlen(z
3ae0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 20 3e 20  );.  while( n > 
3af0: 30 20 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0  ){.    h = (h
3b00: 3c 3c 33 29 20 5e 20 68 20 5e 20 55 70 70 65 72  <<3) ^ h ^ Upper
3b10: 54 6f 4c 6f 77 65 72 5b 28 75 6e 73 69 67 6e 65  ToLower[(unsigne
3b20: 64 20 63 68 61 72 29 2a 7a 2b 2b 5d 3b 0a 20 20  d char)*z++];.  
3b30: 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74    n--;.  }.  ret
3b40: 75 72 6e 20 68 20 26 20 30 78 37 66 66 66 66 66  urn h & 0x7fffff
3b50: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ff;.}../*.** Som
3b60: 65 20 73 79 73 74 65 6d 73 20 68 61 76 65 20 73  e systems have s
3b70: 74 72 69 63 6d 70 28 29 2e 20 20 4f 74 68 65 72  tricmp().  Other
3b80: 73 20 68 61 76 65 20 73 74 72 63 61 73 65 63 6d  s have strcasecm
3b90: 70 28 29 2e 20 20 42 65 63 61 75 73 65 0a 2a 2a  p().  Because.**
3ba0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
3bb0: 73 69 73 74 65 6e 63 79 2c 20 77 65 20 77 69 6c  sistency, we wil
3bc0: 6c 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e  l define our own
3bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53  ..*/.int sqliteS
3be0: 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61  trICmp(const cha
3bf0: 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20  r *zLeft, const 
3c00: 63 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20  char *zRight){. 
3c10: 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e   register unsign
3c20: 65 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a  ed char *a, *b;.
3c30: 20 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20    a = (unsigned 
3c40: 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20  char *)zLeft;.  
3c50: 62 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  b = (unsigned ch
3c60: 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77  ar *)zRight;.  w
3c70: 68 69 6c 65 28 20 2a 61 21 3d 30 20 26 26 20 55  hile( *a!=0 && U
3c80: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d  pperToLower[*a]=
3c90: 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62  =UpperToLower[*b
3ca0: 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a  ]){ a++; b++; }.
3cb0: 20 20 72 65 74 75 72 6e 20 2a 61 20 2d 20 2a 62    return *a - *b
3cc0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 53 74  ;.}.int sqliteSt
3cd0: 72 4e 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61  rNICmp(const cha
3ce0: 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20  r *zLeft, const 
3cf0: 63 68 61 72 20 2a 7a 52 69 67 68 74 2c 20 69 6e  char *zRight, in
3d00: 74 20 4e 29 7b 0a 20 20 72 65 67 69 73 74 65 72  t N){.  register
3d10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3d20: 61 2c 20 2a 62 3b 0a 20 20 61 20 3d 20 28 75 6e  a, *b;.  a = (un
3d30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 4c  signed char *)zL
3d40: 65 66 74 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69  eft;.  b = (unsi
3d50: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 52 69 67  gned char *)zRig
3d60: 68 74 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ht;.  while( N--
3d70: 20 3e 20 30 20 26 26 20 2a 61 21 3d 30 20 26 26   > 0 && *a!=0 &&
3d80: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61   UpperToLower[*a
3d90: 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  ]==UpperToLower[
3da0: 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20  *b]){ a++; b++; 
3db0: 7d 0a 20 20 72 65 74 75 72 6e 20 4e 3c 30 20 3f  }.  return N<0 ?
3dc0: 20 30 20 3a 20 2a 61 20 2d 20 2a 62 3b 0a 7d 0a   0 : *a - *b;.}.
3dd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
3de0: 55 45 20 69 66 20 7a 20 69 73 20 61 20 70 75 72  UE if z is a pur
3df0: 65 20 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67  e numeric string
3e00: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
3e10: 69 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  if the.** string
3e20: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68   contains any ch
3e30: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 69 73  aracter which is
3e40: 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6e   not part of a n
3e50: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6d 20  umber..**.** Am 
3e60: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
3e70: 63 6f 6e 73 69 64 65 72 65 64 20 6e 6f 6e 2d 6e  considered non-n
3e80: 75 6d 65 72 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73  umeric..*/.int s
3e90: 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 63 6f  qliteIsNumber(co
3ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
3eb0: 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a  if( *z=='-' || *
3ec0: 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20  z=='+' ) z++;.  
3ed0: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29  if( !isdigit(*z)
3ee0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3ef0: 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 77  ;.  }.  z++;.  w
3f00: 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a  hile( isdigit(*z
3f10: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66  ) ){ z++; }.  if
3f20: 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  ( *z=='.' ){.   
3f30: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69   z++;.    if( !i
3f40: 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sdigit(*z) ) ret
3f50: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3f60: 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  ( isdigit(*z) ){
3f70: 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   z++; }.  }.  if
3f80: 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d  ( *z=='e' || *z=
3f90: 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  ='E' ){.    z++;
3fa0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27  .    if( *z=='+'
3fb0: 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b   || *z=='-' ) z+
3fc0: 2b 3b 0a 20 20 20 20 69 66 28 20 21 69 73 64 69  +;.    if( !isdi
3fd0: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
3fe0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
3ff0: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sdigit(*z) ){ z+
4000: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
4010: 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n *z==0;.}../*.*
4020: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a 5b 5d  * The string z[]
4030: 20 69 73 20 61 6e 20 61 73 63 69 69 20 72 65 70   is an ascii rep
4040: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
4050: 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e 0a 2a 2a   real number..**
4060: 20 43 6f 6e 76 65 72 74 20 74 68 69 73 20 73 74   Convert this st
4070: 72 69 6e 67 20 74 6f 20 61 20 64 6f 75 62 6c 65  ring to a double
4080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4090: 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61  tine assumes tha
40a0: 74 20 7a 5b 5d 20 72 65 61 6c 6c 79 20 69 73 20  t z[] really is 
40b0: 61 20 76 61 6c 69 64 20 6e 75 6d 62 65 72 2e 20  a valid number. 
40c0: 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74   If it.** is not
40d0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
40e0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
40f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4100: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
4110: 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f   the library ato
4120: 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 63  f() function bec
4130: 61 75 73 65 0a 2a 2a 20 74 68 65 20 6c 69 62 72  ause.** the libr
4140: 61 72 79 20 61 74 6f 66 28 29 20 6d 69 67 68 74  ary atof() might
4150: 20 77 61 6e 74 20 74 6f 20 75 73 65 20 22 2c 22   want to use ","
4160: 20 61 73 20 74 68 65 20 64 65 63 69 6d 61 6c 20   as the decimal 
4170: 70 6f 69 6e 74 20 69 6e 73 74 65 61 64 0a 2a 2a  point instead.**
4180: 20 6f 66 20 22 2e 22 20 64 65 70 65 6e 64 69 6e   of "." dependin
4190: 67 20 6f 6e 20 68 6f 77 20 6c 6f 63 61 6c 65 20  g on how locale 
41a0: 69 73 20 73 65 74 2e 20 20 42 75 74 20 74 68 61  is set.  But tha
41b0: 74 20 77 6f 75 6c 64 20 63 61 75 73 65 20 70 72  t would cause pr
41c0: 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f 72 20 53 51  oblems.** for SQ
41d0: 4c 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  L.  So this rout
41e0: 69 6e 65 20 61 6c 77 61 79 73 20 75 73 65 73 20  ine always uses 
41f0: 22 2e 22 20 72 65 67 61 72 64 6c 65 73 73 20 6f  "." regardless o
4200: 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f 0a 64 6f 75  f locale..*/.dou
4210: 62 6c 65 20 73 71 6c 69 74 65 41 74 6f 46 28 63  ble sqliteAtoF(c
4220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
4230: 20 69 6e 74 20 73 69 67 6e 20 3d 20 31 3b 0a 20   int sign = 1;. 
4240: 20 64 6f 75 62 6c 65 20 76 31 20 3d 20 30 2e 30   double v1 = 0.0
4250: 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20  ;.  if( *z=='-' 
4260: 29 7b 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d 31  ){.    sign = -1
4270: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c  ;.    z++;.  }el
4280: 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29  se if( *z=='+' )
4290: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  {.    z++;.  }. 
42a0: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
42b0: 2a 7a 29 20 29 7b 0a 20 20 20 20 76 31 20 3d 20  *z) ){.    v1 = 
42c0: 76 31 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20  v1*10.0 + (*z - 
42d0: 27 30 27 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  '0');.    z++;. 
42e0: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27   }.  if( *z=='.'
42f0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 64   ){.    double d
4300: 69 76 69 73 6f 72 20 3d 20 31 2e 30 3b 0a 20 20  ivisor = 1.0;.  
4310: 20 20 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65    z++;.    while
4320: 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  ( isdigit(*z) ){
4330: 0a 20 20 20 20 20 20 76 31 20 3d 20 76 31 2a 31  .      v1 = v1*1
4340: 30 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29  0.0 + (*z - '0')
4350: 3b 0a 20 20 20 20 20 20 64 69 76 69 73 6f 72 20  ;.      divisor 
4360: 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 7a  *= 10.0;.      z
4370: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 31  ++;.    }.    v1
4380: 20 2f 3d 20 64 69 76 69 73 6f 72 3b 0a 20 20 7d   /= divisor;.  }
4390: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c  .  if( *z=='e' |
43a0: 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20  | *z=='E' ){.   
43b0: 20 69 6e 74 20 65 73 69 67 6e 20 3d 20 31 3b 0a   int esign = 1;.
43c0: 20 20 20 20 69 6e 74 20 65 76 61 6c 20 3d 20 30      int eval = 0
43d0: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 63 61  ;.    double sca
43e0: 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 7a 2b  le = 1.0;.    z+
43f0: 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  +;.    if( *z=='
4400: 2d 27 20 29 7b 0a 20 20 20 20 20 20 65 73 69 67  -' ){.      esig
4410: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7a 2b  n = -1;.      z+
4420: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
4430: 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20   *z=='+' ){.    
4440: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
4450: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
4460: 2a 7a 29 20 29 7b 0a 20 20 20 20 20 20 65 76 61  *z) ){.      eva
4470: 6c 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20 2a 7a  l = eval*10 + *z
4480: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b   - '0';.      z+
4490: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  +;.    }.    whi
44a0: 6c 65 28 20 65 76 61 6c 3e 3d 36 34 20 29 7b 20  le( eval>=64 ){ 
44b0: 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 36 34  scale *= 1.0e+64
44c0: 3b 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20 7d 0a  ; eval -= 64; }.
44d0: 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e      while( eval>
44e0: 3d 31 36 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20  =16 ){ scale *= 
44f0: 31 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20 2d 3d  1.0e+16; eval -=
4500: 20 31 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65   16; }.    while
4510: 28 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73 63 61  ( eval>=4 ){ sca
4520: 6c 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20 65 76  le *= 1.0e+4; ev
4530: 61 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77  al -= 4; }.    w
4540: 68 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20 29 7b  hile( eval>=1 ){
4550: 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31   scale *= 1.0e+1
4560: 3b 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d 0a 20  ; eval -= 1; }. 
4570: 20 20 20 69 66 28 20 65 73 69 67 6e 3c 30 20 29     if( esign<0 )
4580: 7b 0a 20 20 20 20 20 20 76 31 20 2f 3d 20 73 63  {.      v1 /= sc
4590: 61 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ale;.    }else{.
45a0: 20 20 20 20 20 20 76 31 20 2a 3d 20 73 63 61 6c        v1 *= scal
45b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
45c0: 65 74 75 72 6e 20 73 69 67 6e 3c 30 20 3f 20 2d  eturn sign<0 ? -
45d0: 76 31 20 3a 20 76 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  v1 : v1;.}../*.*
45e0: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a 4e 75  * The string zNu
45f0: 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20  m represents an 
4600: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72 65 20  integer.  There 
4610: 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20 6f 74  might be some ot
4620: 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  her.** informati
4630: 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  on following the
4640: 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20 62 75   integer too, bu
4650: 74 20 74 68 61 74 20 70 61 72 74 20 69 73 20 69  t that part is i
4660: 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20 74 68  gnored..** If th
4670: 65 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 74  e integer that t
4680: 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 4e 75  he prefix of zNu
4690: 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77 69 6c  m represents wil
46a0: 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20 33 32  l fit in a.** 32
46b0: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
46c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52 55 45  ger, return TRUE
46d0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  .  Otherwise ret
46e0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a  urn FALSE..**.**
46f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
4700: 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f 72 20  turns FALSE for 
4710: 74 68 65 20 73 74 72 69 6e 67 20 2d 32 31 34 37  the string -2147
4720: 34 38 33 36 34 38 20 65 76 65 6e 20 74 68 61 74  483648 even that
4730: 0a 2a 2a 20 74 68 61 74 20 6e 75 6d 62 65 72 20  .** that number 
4740: 77 69 6c 6c 2c 20 69 6e 20 74 68 65 6f 72 79 20  will, in theory 
4750: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
4760: 69 6e 74 65 67 65 72 2e 20 20 42 75 74 20 70 6f  integer.  But po
4770: 73 69 74 69 76 65 0a 2a 2a 20 32 31 34 37 34 38  sitive.** 214748
4780: 33 36 34 38 20 77 69 6c 6c 20 6e 6f 74 20 66 69  3648 will not fi
4790: 74 20 69 6e 20 33 32 20 62 69 74 73 2e 20 20 53  t in 32 bits.  S
47a0: 6f 20 69 74 20 73 65 65 6d 73 20 73 61 66 65 72  o it seems safer
47b0: 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61   to return.** fa
47c0: 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lse..*/.int sqli
47d0: 74 65 46 69 74 73 49 6e 33 32 42 69 74 73 28 63  teFitsIn32Bits(c
47e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75 6d 29  onst char *zNum)
47f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  {.  int i, c;.  
4800: 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c  if( *zNum=='-' |
4810: 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a  | *zNum=='+' ) z
4820: 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30  Num++;.  for(i=0
4830: 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27  ; (c=zNum[i])>='
4840: 30 27 20 26 26 20 63 3c 3d 27 39 27 3b 20 69 2b  0' && c<='9'; i+
4850: 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3c  +){}.  return i<
4860: 31 30 20 7c 7c 20 28 69 3d 3d 31 30 20 26 26 20  10 || (i==10 && 
4870: 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22 32 31 34  memcmp(zNum,"214
4880: 37 34 38 33 36 34 37 22 2c 31 30 29 3c 3d 30 29  7483647",10)<=0)
4890: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 63 6f 6d  ;.}../* This com
48a0: 70 61 72 69 73 6f 6e 20 72 6f 75 74 69 6e 65 20  parison routine 
48b0: 69 73 20 77 68 61 74 20 77 65 20 75 73 65 20 66  is what we use f
48c0: 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  or comparison op
48d0: 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 62 65 74 77  erations.** betw
48e0: 65 65 6e 20 6e 75 6d 65 72 69 63 20 76 61 6c 75  een numeric valu
48f0: 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 65 78 70  es in an SQL exp
4900: 72 65 73 73 69 6f 6e 2e 20 20 22 4e 75 6d 65 72  ression.  "Numer
4910: 69 63 22 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  ic" is a little.
4920: 2a 2a 20 62 69 74 20 6d 69 73 6c 65 61 64 69 6e  ** bit misleadin
4930: 67 20 68 65 72 65 2e 20 20 57 68 61 74 20 77 65  g here.  What we
4940: 20 6d 65 61 6e 20 69 73 20 74 68 61 74 20 74 68   mean is that th
4950: 65 20 73 74 72 69 6e 67 73 20 68 61 76 65 20 61  e strings have a
4960: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 22 6e 75 6d  .** type of "num
4970: 65 72 69 63 22 20 66 72 6f 6d 20 74 68 65 20 70  eric" from the p
4980: 6f 69 6e 74 20 6f 66 20 76 69 65 77 20 6f 66 20  oint of view of 
4990: 53 51 4c 2e 20 20 54 68 65 20 73 74 72 69 6e 67  SQL.  The string
49a0: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65  s.** do not nece
49b0: 73 73 61 72 69 6c 79 20 63 6f 6e 74 61 69 6e 20  ssarily contain 
49c0: 6e 75 6d 62 65 72 73 2e 20 20 54 68 65 79 20 63  numbers.  They c
49d0: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 65 78  ould contain tex
49e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
49f0: 69 6e 70 75 74 20 73 74 72 69 6e 67 73 20 62 6f  input strings bo
4a00: 74 68 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 63 74  th look like act
4a10: 75 61 6c 20 6e 75 6d 62 65 72 73 20 74 68 65 6e  ual numbers then
4a20: 20 74 68 65 79 0a 2a 2a 20 63 6f 6d 70 61 72 65   they.** compare
4a30: 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 6f 72   in numerical or
4a40: 64 65 72 2e 20 20 4e 75 6d 65 72 69 63 61 6c 20  der.  Numerical 
4a50: 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 77 61  strings are alwa
4a60: 79 73 20 6c 65 73 73 20 0a 2a 2a 20 74 68 61 6e  ys less .** than
4a70: 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72   non-numeric str
4a80: 69 6e 67 73 20 73 6f 20 69 66 20 6f 6e 65 20 69  ings so if one i
4a90: 6e 70 75 74 20 73 74 72 69 6e 67 20 6c 6f 6f 6b  nput string look
4aa0: 73 20 6c 69 6b 65 20 61 0a 2a 2a 20 6e 75 6d 62  s like a.** numb
4ab0: 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  er and the other
4ac0: 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20   does not, then 
4ad0: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 6c 6f 6f  the one that loo
4ae0: 6b 73 20 6c 69 6b 65 0a 2a 2a 20 61 20 6e 75 6d  ks like.** a num
4af0: 62 65 72 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  ber is the small
4b00: 65 72 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63  er.  Non-numeric
4b10: 20 73 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 65   strings compare
4b20: 20 69 6e 20 0a 2a 2a 20 6c 65 78 69 67 72 61 70   in .** lexigrap
4b30: 68 69 63 61 6c 20 6f 72 64 65 72 20 28 74 68 65  hical order (the
4b40: 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 73   same order as s
4b50: 74 72 63 6d 70 28 29 29 2e 0a 2a 2f 0a 69 6e 74  trcmp())..*/.int
4b60: 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 63   sqliteCompare(c
4b70: 6f 6e 73 74 20 63 68 61 72 20 2a 61 74 65 78 74  onst char *atext
4b80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 74  , const char *bt
4b90: 65 78 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75  ext){.  int resu
4ba0: 6c 74 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41  lt;.  int isNumA
4bb0: 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69 66 28 20  , isNumB;.  if( 
4bc0: 61 74 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  atext==0 ){.    
4bd0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 65 6c  return -1;.  }el
4be0: 73 65 20 69 66 28 20 62 74 65 78 74 3d 3d 30 20  se if( btext==0 
4bf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
4c00: 0a 20 20 7d 0a 20 20 69 73 4e 75 6d 41 20 3d 20  .  }.  isNumA = 
4c10: 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 61  sqliteIsNumber(a
4c20: 74 65 78 74 29 3b 0a 20 20 69 73 4e 75 6d 42 20  text);.  isNumB 
4c30: 3d 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72  = sqliteIsNumber
4c40: 28 62 74 65 78 74 29 3b 0a 20 20 69 66 28 20 69  (btext);.  if( i
4c50: 73 4e 75 6d 41 20 29 7b 0a 20 20 20 20 69 66 28  sNumA ){.    if(
4c60: 20 21 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20   !isNumB ){.    
4c70: 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20    result = -1;. 
4c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c90: 64 6f 75 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20  double rA, rB;. 
4ca0: 20 20 20 20 20 72 41 20 3d 20 73 71 6c 69 74 65       rA = sqlite
4cb0: 41 74 6f 46 28 61 74 65 78 74 29 3b 0a 20 20 20  AtoF(atext);.   
4cc0: 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65 41 74     rB = sqliteAt
4cd0: 6f 46 28 62 74 65 78 74 29 3b 0a 20 20 20 20 20  oF(btext);.     
4ce0: 20 69 66 28 20 72 41 3c 72 42 20 29 7b 0a 20 20   if( rA<rB ){.  
4cf0: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d        result = -
4d00: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4d10: 66 28 20 72 41 3e 72 42 20 29 7b 0a 20 20 20 20  f( rA>rB ){.    
4d20: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2b 31 3b      result = +1;
4d30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4d40: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
4d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4d60: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
4d70: 6d 42 20 29 7b 0a 20 20 20 20 72 65 73 75 6c 74  mB ){.    result
4d80: 20 3d 20 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 7b   = +1;.  }else {
4d90: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 73 74  .    result = st
4da0: 72 63 6d 70 28 61 74 65 78 74 2c 20 62 74 65 78  rcmp(atext, btex
4db0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4dc0: 20 72 65 73 75 6c 74 3b 20 0a 7d 0a 0a 2f 2a 0a   result; .}../*.
4dd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4de0: 69 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  is used for sort
4df0: 69 6e 67 2e 20 20 45 61 63 68 20 6b 65 79 20 69  ing.  Each key i
4e00: 73 20 61 20 6c 69 73 74 20 6f 66 20 6f 6e 65 20  s a list of one 
4e10: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c 6c 2d  or more.** null-
4e20: 74 65 72 6d 69 6e 61 74 65 64 20 65 6c 65 6d 65  terminated eleme
4e30: 6e 74 73 2e 20 20 54 68 65 20 6c 69 73 74 20 69  nts.  The list i
4e40: 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20  s terminated by 
4e50: 74 77 6f 20 6e 75 6c 6c 73 20 69 6e 0a 2a 2a 20  two nulls in.** 
4e60: 61 20 72 6f 77 2e 20 20 46 6f 72 20 65 78 61 6d  a row.  For exam
4e70: 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ple, the followi
4e80: 6e 67 20 74 65 78 74 20 69 73 20 61 20 6b 65 79  ng text is a key
4e90: 20 77 69 74 68 20 74 68 72 65 65 20 65 6c 65 6d   with three elem
4ea0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ents.**.**      
4eb0: 20 20 20 20 20 20 41 6f 6e 65 5c 30 30 30 44 74        Aone\000Dt
4ec0: 77 6f 5c 30 30 30 41 74 68 72 65 65 5c 30 30 30  wo\000Athree\000
4ed0: 5c 30 30 30 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  \000.**.** All e
4ee0: 6c 65 6d 65 6e 74 73 20 62 65 67 69 6e 20 77 69  lements begin wi
4ef0: 74 68 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 68  th one of the ch
4f00: 61 72 61 63 74 65 72 73 20 22 2b 2d 41 44 22 20  aracters "+-AD" 
4f10: 61 6e 64 20 65 6e 64 20 77 69 74 68 20 22 5c 30  and end with "\0
4f20: 30 30 22 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  00".** with zero
4f30: 20 6f 72 20 6d 6f 72 65 20 74 65 78 74 20 65 6c   or more text el
4f40: 65 6d 65 6e 74 73 20 69 6e 20 62 65 74 77 65 65  ements in betwee
4f50: 6e 2e 20 20 45 78 63 65 70 74 2c 20 4e 55 4c 4c  n.  Except, NULL
4f60: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 63 6f 6e   elements.** con
4f70: 73 69 73 74 20 6f 66 20 74 68 65 20 73 70 65 63  sist of the spec
4f80: 69 61 6c 20 74 77 6f 2d 63 68 61 72 61 63 74 65  ial two-characte
4f90: 72 20 73 65 71 75 65 6e 63 65 20 22 4e 5c 30 30  r sequence "N\00
4fa0: 30 22 2e 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 61  0"..**.** Both a
4fb0: 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 68 61  rguments will ha
4fc0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
4fd0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 2e 20  er of elements. 
4fe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
4ff0: 20 72 65 74 75 72 6e 73 20 6e 65 67 61 74 69 76   returns negativ
5000: 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
5010: 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
5020: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6c 65  t argument is le
5030: 73 73 0a 2a 2a 20 74 68 61 6e 2c 20 65 71 75 61  ss.** than, equa
5040: 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
5050: 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 2e   than the first.
5060: 20 20 28 52 65 73 75 6c 74 20 69 73 20 61 2d 62    (Result is a-b
5070: 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 65 6c  )..**.** Each el
5080: 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74  ement begins wit
5090: 68 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 68 61  h one of the cha
50a0: 72 61 63 74 65 72 73 20 22 2b 22 2c 20 22 2d 22  racters "+", "-"
50b0: 2c 20 22 41 22 2c 20 22 44 22 2e 0a 2a 2a 20 54  , "A", "D"..** T
50c0: 68 69 73 20 63 68 61 72 61 63 74 65 72 20 64 65  his character de
50d0: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 73 6f 72  termines the sor
50e0: 74 20 6f 72 64 65 72 20 61 6e 64 20 63 6f 6c 6c  t order and coll
50f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 0a  ating sequence:.
5100: 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 20 20 20 20  **.**     +     
5110: 20 53 6f 72 74 20 6e 75 6d 65 72 69 63 61 6c 6c   Sort numericall
5120: 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
5130: 72 64 65 72 0a 2a 2a 20 20 20 20 20 2d 20 20 20  rder.**     -   
5140: 20 20 20 53 6f 72 74 20 6e 75 6d 65 72 69 63 61     Sort numerica
5150: 6c 6c 79 20 69 6e 20 64 65 73 63 65 6e 64 69 6e  lly in descendin
5160: 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 20 41  g order.**     A
5170: 20 20 20 20 20 20 53 6f 72 74 20 61 73 20 73 74        Sort as st
5180: 72 69 6e 67 73 20 69 6e 20 61 73 63 65 6e 64 69  rings in ascendi
5190: 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 20  ng order.**     
51a0: 44 20 20 20 20 20 20 53 6f 72 74 20 61 73 20 73  D      Sort as s
51b0: 74 72 69 6e 67 73 20 69 6e 20 64 65 73 63 65 6e  trings in descen
51c0: 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  ding order..**.*
51d0: 2a 20 46 6f 72 20 74 68 65 20 22 2b 22 20 61 6e  * For the "+" an
51e0: 64 20 22 2d 22 20 73 6f 72 74 69 6e 67 2c 20 70  d "-" sorting, p
51f0: 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74 72 69  ure numeric stri
5200: 6e 67 73 20 28 73 74 72 69 6e 67 73 20 66 6f 72  ngs (strings for
5210: 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 69 73   which the.** is
5220: 4e 75 6d 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  Num() function a
5230: 62 6f 76 65 20 72 65 74 75 72 6e 73 20 54 52 55  bove returns TRU
5240: 45 29 20 61 6c 77 61 79 73 20 63 6f 6d 70 61 72  E) always compar
5250: 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69  e less than stri
5260: 6e 67 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ngs.** that are 
5270: 6e 6f 74 20 70 75 72 65 20 6e 75 6d 65 72 69 63  not pure numeric
5280: 73 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63 20  s.  Non-numeric 
5290: 73 74 72 69 6e 67 73 20 63 6f 6d 70 61 72 65 20  strings compare 
52a0: 69 6e 20 6d 65 6d 63 6d 70 28 29 0a 2a 2a 20 6f  in memcmp().** o
52b0: 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 20 74  rder.  This is t
52c0: 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
52d0: 65 72 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  er as the sqlite
52e0: 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
52f0: 6f 6e 0a 2a 2a 20 61 62 6f 76 65 20 67 65 6e 65  on.** above gene
5300: 72 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rates..**.** The
5310: 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73 20 61   last point is a
5320: 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 76 65 72   change from ver
5330: 73 69 6f 6e 20 32 2e 36 2e 33 20 74 6f 20 76 65  sion 2.6.3 to ve
5340: 72 73 69 6f 6e 20 32 2e 37 2e 30 2e 20 20 49 6e  rsion 2.7.0.  In
5350: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32 2e 36 2e  .** version 2.6.
5360: 33 20 61 6e 64 20 65 61 72 6c 69 65 72 2c 20 73  3 and earlier, s
5370: 75 62 73 74 72 69 6e 67 73 20 6f 66 20 64 69 67  ubstrings of dig
5380: 69 74 73 20 63 6f 6d 70 61 72 65 20 69 6e 20 6e  its compare in n
5390: 75 6d 65 72 69 63 61 6c 20 0a 2a 2a 20 61 6e 64  umerical .** and
53a0: 20 63 61 73 65 20 77 61 73 20 75 73 65 64 20 6f   case was used o
53b0: 6e 6c 79 20 74 6f 20 62 72 65 61 6b 20 61 20 74  nly to break a t
53c0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 45 6c 65 6d 65 6e  ie..**.** Elemen
53d0: 74 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ts that begin wi
53e0: 74 68 20 27 41 27 20 6f 72 20 27 44 27 20 63 6f  th 'A' or 'D' co
53f0: 6d 70 61 72 65 20 69 6e 20 6d 65 6d 63 6d 70 28  mpare in memcmp(
5400: 29 20 6f 72 64 65 72 20 72 65 67 61 72 64 6c 65  ) order regardle
5410: 73 73 0a 2a 2a 20 6f 66 20 77 68 65 74 68 65 72  ss.** of whether
5420: 20 6f 72 20 6e 6f 74 20 74 68 65 79 20 6c 6f 6f   or not they loo
5430: 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2e  k like a number.
5440: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
5450: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
5460: 69 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 72  imposed by the r
5470: 75 6c 65 73 20 61 62 6f 76 65 20 69 73 20 74 68  ules above is th
5480: 65 20 73 61 6d 65 0a 2a 2a 20 66 72 6f 6d 20 74  e same.** from t
5490: 68 65 20 6f 72 64 65 72 69 6e 67 20 64 65 66 69  he ordering defi
54a0: 6e 65 64 20 62 79 20 74 68 65 20 22 3c 22 2c 20  ned by the "<", 
54b0: 22 3c 3d 22 2c 20 22 3e 22 2c 20 61 6e 64 20 22  "<=", ">", and "
54c0: 3e 3d 22 20 6f 70 65 72 61 74 6f 72 73 0a 2a 2a  >=" operators.**
54d0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
54e0: 61 6e 64 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  and for indices.
54f0: 20 20 54 68 69 73 20 77 61 73 20 6e 6f 74 20 74    This was not t
5500: 68 65 20 63 61 73 65 20 66 6f 72 20 76 65 72 73  he case for vers
5510: 69 6f 6e 0a 2a 2a 20 32 2e 36 2e 33 20 61 6e 64  ion.** 2.6.3 and
5520: 20 65 61 72 6c 69 65 72 2e 0a 2a 2f 0a 69 6e 74   earlier..*/.int
5530: 20 73 71 6c 69 74 65 53 6f 72 74 43 6f 6d 70 61   sqliteSortCompa
5540: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  re(const char *a
5550: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 29  , const char *b)
5560: 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
5570: 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41 2c 20 69  .  int isNumA, i
5580: 73 4e 75 6d 42 3b 0a 20 20 69 6e 74 20 64 69 72  sNumB;.  int dir
5590: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
55a0: 72 65 73 3d 3d 30 20 26 26 20 2a 61 20 26 26 20  res==0 && *a && 
55b0: 2a 62 20 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  *b ){.    if( a[
55c0: 30 5d 3d 3d 27 4e 27 20 7c 7c 20 62 5b 30 5d 3d  0]=='N' || b[0]=
55d0: 3d 27 4e 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='N' ){.      if
55e0: 28 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20 29 7b 0a  ( a[0]==b[0] ){.
55f0: 20 20 20 20 20 20 20 20 61 20 2b 3d 20 32 3b 0a          a += 2;.
5600: 20 20 20 20 20 20 20 20 62 20 2b 3d 20 32 3b 0a          b += 2;.
5610: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5620: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5630: 69 66 28 20 61 5b 30 5d 3d 3d 27 4e 27 20 29 7b  if( a[0]=='N' ){
5640: 0a 20 20 20 20 20 20 20 20 64 69 72 20 3d 20 62  .        dir = b
5650: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 72 65 73  [0];.        res
5660: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
5670: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 69 72 20  se{.        dir 
5680: 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  = a[0];.        
5690: 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20  res = +1;.      
56a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
56b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
56c0: 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20 29 3b 0a 20   a[0]==b[0] );. 
56d0: 20 20 20 69 66 28 20 28 64 69 72 3d 61 5b 30 5d     if( (dir=a[0]
56e0: 29 3d 3d 27 41 27 20 7c 7c 20 61 5b 30 5d 3d 3d  )=='A' || a[0]==
56f0: 27 44 27 20 29 7b 0a 20 20 20 20 20 20 72 65 73  'D' ){.      res
5700: 20 3d 20 73 74 72 63 6d 70 28 26 61 5b 31 5d 2c   = strcmp(&a[1],
5710: 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  &b[1]);.      if
5720: 28 20 72 65 73 20 29 20 62 72 65 61 6b 3b 0a 20  ( res ) break;. 
5730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5740: 69 73 4e 75 6d 41 20 3d 20 73 71 6c 69 74 65 49  isNumA = sqliteI
5750: 73 4e 75 6d 62 65 72 28 26 61 5b 31 5d 29 3b 0a  sNumber(&a[1]);.
5760: 20 20 20 20 20 20 69 73 4e 75 6d 42 20 3d 20 73        isNumB = s
5770: 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 26 62  qliteIsNumber(&b
5780: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
5790: 69 73 4e 75 6d 41 20 29 7b 0a 20 20 20 20 20 20  isNumA ){.      
57a0: 20 20 64 6f 75 62 6c 65 20 72 41 2c 20 72 42 3b    double rA, rB;
57b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
57c0: 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 20 20  NumB ){.        
57d0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
57e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
57f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
5800: 41 20 3d 20 73 71 6c 69 74 65 41 74 6f 46 28 26  A = sqliteAtoF(&
5810: 61 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  a[1]);.        r
5820: 42 20 3d 20 73 71 6c 69 74 65 41 74 6f 46 28 26  B = sqliteAtoF(&
5830: 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  b[1]);.        i
5840: 66 28 20 72 41 3c 72 42 20 29 7b 0a 20 20 20 20  f( rA<rB ){.    
5850: 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a        res = -1;.
5860: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5880: 20 20 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a     if( rA>rB ){.
5890: 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
58a0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
58b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
58c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
58d0: 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 20  sNumB ){.       
58e0: 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20   res = +1;.     
58f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
5910: 65 73 20 3d 20 73 74 72 63 6d 70 28 26 61 5b 31  es = strcmp(&a[1
5920: 5d 2c 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20  ],&b[1]);.      
5930: 20 20 69 66 28 20 72 65 73 20 29 20 62 72 65 61    if( res ) brea
5940: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5950: 0a 20 20 20 20 61 20 2b 3d 20 73 74 72 6c 65 6e  .    a += strlen
5960: 28 26 61 5b 31 5d 29 20 2b 20 32 3b 0a 20 20 20  (&a[1]) + 2;.   
5970: 20 62 20 2b 3d 20 73 74 72 6c 65 6e 28 26 62 5b   b += strlen(&b[
5980: 31 5d 29 20 2b 20 32 3b 0a 20 20 7d 0a 20 20 69  1]) + 2;.  }.  i
5990: 66 28 20 64 69 72 3d 3d 27 2d 27 20 7c 7c 20 64  f( dir=='-' || d
59a0: 69 72 3d 3d 27 44 27 20 29 20 72 65 73 20 3d 20  ir=='D' ) res = 
59b0: 2d 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72  -res;.  return r
59c0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  es;.}../*.** Som
59d0: 65 20 70 6f 77 65 72 73 20 6f 66 20 36 34 2e 20  e powers of 64. 
59e0: 20 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73   These constants
59f0: 20 61 72 65 20 6e 65 65 64 65 64 20 69 6e 20 74   are needed in t
5a00: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 52 65 61 6c  he.** sqliteReal
5a10: 54 6f 53 6f 72 74 61 62 6c 65 28 29 20 72 6f 75  ToSortable() rou
5a20: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 23  tine below..*/.#
5a30: 64 65 66 69 6e 65 20 5f 36 34 65 33 20 20 28 36  define _64e3  (6
5a40: 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20 36 34 2e  4.0 * 64.0 * 64.
5a50: 30 29 0a 23 64 65 66 69 6e 65 20 5f 36 34 65 34  0).#define _64e4
5a60: 20 20 28 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a    (64.0 * 64.0 *
5a70: 20 36 34 2e 30 20 2a 20 36 34 2e 30 29 0a 23 64   64.0 * 64.0).#d
5a80: 65 66 69 6e 65 20 5f 36 34 65 31 35 20 28 5f 36  efine _64e15 (_6
5a90: 34 65 33 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36  4e3 * _64e4 * _6
5aa0: 34 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64 65  4e4 * _64e4).#de
5ab0: 66 69 6e 65 20 5f 36 34 65 31 36 20 28 5f 36 34  fine _64e16 (_64
5ac0: 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36 34  e4 * _64e4 * _64
5ad0: 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64 65 66  e4 * _64e4).#def
5ae0: 69 6e 65 20 5f 36 34 65 36 33 20 28 5f 36 34 65  ine _64e63 (_64e
5af0: 31 35 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f 36  15 * _64e16 * _6
5b00: 34 65 31 36 20 2a 20 5f 36 34 65 31 36 29 0a 23  4e16 * _64e16).#
5b10: 64 65 66 69 6e 65 20 5f 36 34 65 36 34 20 28 5f  define _64e64 (_
5b20: 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 20 2a  64e16 * _64e16 *
5b30: 20 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36   _64e16 * _64e16
5b40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  )../*.** The fol
5b50: 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
5b60: 20 63 6f 6e 76 65 72 74 73 20 61 20 64 6f 75 62   converts a doub
5b70: 6c 65 2d 70 72 65 63 69 73 69 6f 6e 20 66 6c 6f  le-precision flo
5b80: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e  ating point.** n
5b90: 75 6d 62 65 72 20 69 6e 74 6f 20 61 20 73 74 72  umber into a str
5ba0: 69 6e 67 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ing.  The result
5bb0: 69 6e 67 20 73 74 72 69 6e 67 20 68 61 73 20 74  ing string has t
5bc0: 68 65 20 70 72 6f 70 65 72 74 79 20 74 68 61 74  he property that
5bd0: 0a 2a 2a 20 74 77 6f 20 73 75 63 68 20 73 74 72  .** two such str
5be0: 69 6e 67 73 20 63 6f 6d 70 61 72 69 65 64 20 75  ings comparied u
5bf0: 73 69 6e 67 20 73 74 72 63 6d 70 28 29 20 6f 72  sing strcmp() or
5c00: 20 6d 65 6d 63 6d 70 28 29 20 77 69 6c 6c 20 67   memcmp() will g
5c10: 69 76 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  ive the.** same 
5c20: 72 65 73 75 6c 74 73 20 61 73 20 61 20 6e 75 6d  results as a num
5c30: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
5c40: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
5c50: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
5c60: 2a 20 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a 2a 2a  * numbers..**.**
5c70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5c80: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
5c90: 65 20 64 61 74 61 62 61 73 65 20 6b 65 79 73 20  e database keys 
5ca0: 66 72 6f 6d 20 66 6c 6f 61 74 69 6e 67 20 70 6f  from floating po
5cb0: 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 73  int.** numbers s
5cc0: 75 63 68 20 74 68 61 74 20 74 68 65 20 6b 65 79  uch that the key
5cd0: 73 20 73 6f 72 74 20 69 6e 20 74 68 65 20 73 61  s sort in the sa
5ce0: 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20  me order as the 
5cf0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 66 6c 6f 61  original.** floa
5d00: 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
5d10: 72 73 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  rs even though t
5d20: 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6d 70  he keys are comp
5d30: 61 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 6d 65  ared using.** me
5d40: 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  mcmp()..**.** Th
5d50: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
5d60: 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  on should have a
5d70: 6c 6c 6f 63 61 74 65 64 20 61 74 20 6c 65 61 73  llocated at leas
5d80: 74 20 31 34 20 63 68 61 72 61 63 74 65 72 73 0a  t 14 characters.
5d90: 2a 2a 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  ** of space for 
5da0: 74 68 65 20 62 75 66 66 65 72 20 7a 5b 5d 2e 0a  the buffer z[]..
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65  */.void sqliteRe
5dc0: 61 6c 54 6f 53 6f 72 74 61 62 6c 65 28 64 6f 75  alToSortable(dou
5dd0: 62 6c 65 20 72 2c 20 63 68 61 72 20 2a 7a 29 7b  ble r, char *z){
5de0: 0a 20 20 69 6e 74 20 6e 65 67 3b 0a 20 20 69 6e  .  int neg;.  in
5df0: 74 20 65 78 70 3b 0a 20 20 69 6e 74 20 63 6e 74  t exp;.  int cnt
5e00: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
5e10: 20 61 72 72 61 79 20 6d 61 70 73 20 69 6e 74 65   array maps inte
5e20: 67 65 72 73 20 62 65 74 77 65 65 6e 20 30 20 61  gers between 0 a
5e30: 6e 64 20 36 33 20 69 6e 74 6f 20 62 61 73 65 2d  nd 63 into base-
5e40: 36 34 20 64 69 67 69 74 73 2e 0a 20 20 2a 2a 20  64 digits..  ** 
5e50: 54 68 65 20 64 69 67 69 74 73 20 6d 75 73 74 20  The digits must 
5e60: 62 65 20 63 68 6f 73 65 6e 20 73 75 63 68 20 61  be chosen such a
5e70: 74 20 74 68 65 69 72 20 41 53 43 49 49 20 63 6f  t their ASCII co
5e80: 64 65 73 20 61 72 65 20 69 6e 63 72 65 61 73 69  des are increasi
5e90: 6e 67 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6d 65  ng..  ** This me
5ea0: 61 6e 73 20 77 65 20 63 61 6e 20 6e 6f 74 20 75  ans we can not u
5eb0: 73 65 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  se the tradition
5ec0: 61 6c 20 62 61 73 65 2d 36 34 20 64 69 67 69 74  al base-64 digit
5ed0: 20 73 65 74 2e 20 2a 2f 0a 20 20 73 74 61 74 69   set. */.  stati
5ee0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69  c const char zDi
5ef0: 67 69 74 5b 5d 20 3d 20 0a 20 20 20 20 20 22 30  git[] = .     "0
5f00: 31 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20  123456789".     
5f10: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
5f20: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
5f30: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
5f40: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
5f50: 20 20 20 20 22 7c 7e 22 3b 0a 20 20 69 66 28 20      "|~";.  if( 
5f60: 72 3c 30 2e 30 20 29 7b 0a 20 20 20 20 6e 65 67  r<0.0 ){.    neg
5f70: 20 3d 20 31 3b 0a 20 20 20 20 72 20 3d 20 2d 72   = 1;.    r = -r
5f80: 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27  ;.    *z++ = '-'
5f90: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
5fa0: 20 6e 65 67 20 3d 20 30 3b 0a 20 20 20 20 2a 7a   neg = 0;.    *z
5fb0: 2b 2b 20 3d 20 27 30 27 3b 0a 20 20 7d 0a 20 20  ++ = '0';.  }.  
5fc0: 65 78 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  exp = 0;..  if( 
5fd0: 72 3d 3d 30 2e 30 20 29 7b 0a 20 20 20 20 65 78  r==0.0 ){.    ex
5fe0: 70 20 3d 20 2d 31 30 32 34 3b 0a 20 20 7d 65 6c  p = -1024;.  }el
5ff0: 73 65 20 69 66 28 20 72 3c 28 30 2e 35 2f 36 34  se if( r<(0.5/64
6000: 2e 30 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  .0) ){.    while
6010: 28 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 36 34  ( r < 0.5/_64e64
6020: 20 26 26 20 65 78 70 20 3e 20 2d 39 36 31 20 20   && exp > -961  
6030: 29 7b 20 72 20 2a 3d 20 5f 36 34 65 36 34 3b 20  ){ r *= _64e64; 
6040: 20 65 78 70 20 2d 3d 20 36 34 3b 20 7d 0a 20 20   exp -= 64; }.  
6050: 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e 35    while( r < 0.5
6060: 2f 5f 36 34 65 31 36 20 26 26 20 65 78 70 20 3e  /_64e16 && exp >
6070: 20 2d 31 30 30 39 20 29 7b 20 72 20 2a 3d 20 5f   -1009 ){ r *= _
6080: 36 34 65 31 36 3b 20 20 65 78 70 20 2d 3d 20 31  64e16;  exp -= 1
6090: 36 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20  6; }.    while( 
60a0: 72 20 3c 20 30 2e 35 2f 5f 36 34 65 34 20 20 26  r < 0.5/_64e4  &
60b0: 26 20 65 78 70 20 3e 20 2d 31 30 32 31 20 29 7b  & exp > -1021 ){
60c0: 20 72 20 2a 3d 20 5f 36 34 65 34 3b 20 20 20 65   r *= _64e4;   e
60d0: 78 70 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77  xp -= 4; }.    w
60e0: 68 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f 36 34  hile( r < 0.5/64
60f0: 2e 30 20 20 20 26 26 20 65 78 70 20 3e 20 2d 31  .0   && exp > -1
6100: 30 32 34 20 29 7b 20 72 20 2a 3d 20 36 34 2e 30  024 ){ r *= 64.0
6110: 3b 20 20 20 20 65 78 70 20 2d 3d 20 31 3b 20 7d  ;    exp -= 1; }
6120: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 3e 3d  .  }else if( r>=
6130: 30 2e 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  0.5 ){.    while
6140: 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34 65 36  ( r >= 0.5*_64e6
6150: 33 20 26 26 20 65 78 70 20 3c 20 39 36 30 20 20  3 && exp < 960  
6160: 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36 34 65  ){ r *= 1.0/_64e
6170: 36 34 3b 20 65 78 70 20 2b 3d 20 36 34 3b 20 7d  64; exp += 64; }
6180: 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d  .    while( r >=
6190: 20 30 2e 35 2a 5f 36 34 65 31 35 20 26 26 20 65   0.5*_64e15 && e
61a0: 78 70 20 3c 20 31 30 30 38 20 29 7b 20 72 20 2a  xp < 1008 ){ r *
61b0: 3d 20 31 2e 30 2f 5f 36 34 65 31 36 3b 20 65 78  = 1.0/_64e16; ex
61c0: 70 20 2b 3d 20 31 36 3b 20 7d 0a 20 20 20 20 77  p += 16; }.    w
61d0: 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f  hile( r >= 0.5*_
61e0: 36 34 65 33 20 20 26 26 20 65 78 70 20 3c 20 31  64e3  && exp < 1
61f0: 30 32 30 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f  020 ){ r *= 1.0/
6200: 5f 36 34 65 34 3b 20 20 65 78 70 20 2b 3d 20 34  _64e4;  exp += 4
6210: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72  ; }.    while( r
6220: 20 3e 3d 20 30 2e 35 20 20 20 20 20 20 20 20 26   >= 0.5        &
6230: 26 20 65 78 70 20 3c 20 31 30 32 33 20 29 7b 20  & exp < 1023 ){ 
6240: 72 20 2a 3d 20 31 2e 30 2f 36 34 2e 30 3b 20 20  r *= 1.0/64.0;  
6250: 20 65 78 70 20 2b 3d 20 31 3b 20 7d 0a 20 20 7d   exp += 1; }.  }
6260: 0a 20 20 69 66 28 20 6e 65 67 20 29 7b 0a 20 20  .  if( neg ){.  
6270: 20 20 65 78 70 20 3d 20 2d 65 78 70 3b 0a 20 20    exp = -exp;.  
6280: 20 20 72 20 3d 20 2d 72 3b 0a 20 20 7d 0a 20 20    r = -r;.  }.  
6290: 65 78 70 20 2b 3d 20 31 30 32 34 3b 0a 20 20 72  exp += 1024;.  r
62a0: 20 2b 3d 20 30 2e 35 3b 0a 20 20 69 66 28 20 65   += 0.5;.  if( e
62b0: 78 70 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  xp<0 ) return;. 
62c0: 20 69 66 28 20 65 78 70 3e 3d 32 30 34 38 20 7c   if( exp>=2048 |
62d0: 7c 20 72 3e 3d 31 2e 30 20 29 7b 0a 20 20 20 20  | r>=1.0 ){.    
62e0: 73 74 72 63 70 79 28 7a 2c 20 22 7e 7e 7e 7e 7e  strcpy(z, "~~~~~
62f0: 7e 7e 7e 7e 7e 7e 7e 22 29 3b 0a 20 20 20 20 72  ~~~~~~~");.    r
6300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a 7a 2b  eturn;.  }.  *z+
6310: 2b 20 3d 20 7a 44 69 67 69 74 5b 28 65 78 70 3e  + = zDigit[(exp>
6320: 3e 36 29 26 30 78 33 66 5d 3b 0a 20 20 2a 7a 2b  >6)&0x3f];.  *z+
6330: 2b 20 3d 20 7a 44 69 67 69 74 5b 65 78 70 20 26  + = zDigit[exp &
6340: 20 30 78 33 66 5d 3b 0a 20 20 77 68 69 6c 65 28   0x3f];.  while(
6350: 20 72 3e 30 2e 30 20 26 26 20 63 6e 74 3c 31 30   r>0.0 && cnt<10
6360: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 67 69   ){.    int digi
6370: 74 3b 0a 20 20 20 20 72 20 2a 3d 20 36 34 2e 30  t;.    r *= 64.0
6380: 3b 0a 20 20 20 20 64 69 67 69 74 20 3d 20 28 69  ;.    digit = (i
6390: 6e 74 29 72 3b 0a 20 20 20 20 61 73 73 65 72 74  nt)r;.    assert
63a0: 28 20 64 69 67 69 74 3e 3d 30 20 26 26 20 64 69  ( digit>=0 && di
63b0: 67 69 74 3c 36 34 20 29 3b 0a 20 20 20 20 2a 7a  git<64 );.    *z
63c0: 2b 2b 20 3d 20 7a 44 69 67 69 74 5b 64 69 67 69  ++ = zDigit[digi
63d0: 74 20 26 20 30 78 33 66 5d 3b 0a 20 20 20 20 72  t & 0x3f];.    r
63e0: 20 2d 3d 20 64 69 67 69 74 3b 0a 20 20 20 20 63   -= digit;.    c
63f0: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 7a 20 3d  nt++;.  }.  *z =
6400: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
6410: 4c 49 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20  LITE_UTF8./*.** 
6420: 58 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  X is a pointer t
6430: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6440: 20 6f 66 20 61 20 55 54 46 2d 38 20 63 68 61 72   of a UTF-8 char
6450: 61 63 74 65 72 2e 20 20 49 6e 63 72 65 6d 65 6e  acter.  Incremen
6460: 74 0a 2a 2a 20 58 20 73 6f 20 74 68 61 74 20 69  t.** X so that i
6470: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
6480: 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 2e 20  next character. 
6490: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
64a0: 20 72 69 67 68 74 0a 2a 2a 20 69 66 20 58 20 70   right.** if X p
64b0: 6f 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d  oints to a well-
64c0: 66 6f 72 6d 65 64 20 55 54 46 2d 38 20 73 74 72  formed UTF-8 str
64d0: 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ing..*/.#define 
64e0: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58  sqliteNextChar(X
64f0: 29 20 20 77 68 69 6c 65 28 20 28 30 78 63 30 26  )  while( (0xc0&
6500: 2a 2b 2b 28 58 29 29 3d 3d 30 78 38 30 20 29 7b  *++(X))==0x80 ){
6510: 7d 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  }.#define sqlite
6520: 43 68 61 72 56 61 6c 28 58 29 20 20 20 73 71 6c  CharVal(X)   sql
6530: 69 74 65 5f 75 74 66 38 5f 74 6f 5f 69 6e 74 28  ite_utf8_to_int(
6540: 58 29 0a 0a 23 65 6c 73 65 20 2f 2a 20 21 64 65  X)..#else /* !de
6550: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46  fined(SQLITE_UTF
6560: 38 29 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  8) */./*.** For 
6570: 69 73 6f 38 38 35 39 20 65 6e 63 6f 64 69 6e 67  iso8859 encoding
6580: 2c 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61  , the next chara
6590: 63 74 65 72 20 69 73 20 6a 75 73 74 20 74 68 65  cter is just the
65a0: 20 6e 65 78 74 20 62 79 74 65 2e 0a 2a 2f 0a 23   next byte..*/.#
65b0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 4e 65 78  define sqliteNex
65c0: 74 43 68 61 72 28 58 29 20 20 28 2b 2b 28 58 29  tChar(X)  (++(X)
65d0: 29 3b 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  );.#define sqlit
65e0: 65 43 68 61 72 56 61 6c 28 58 29 20 20 20 28 28  eCharVal(X)   ((
65f0: 69 6e 74 29 2a 28 58 29 29 0a 0a 23 65 6e 64 69  int)*(X))..#endi
6600: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
6610: 49 54 45 5f 55 54 46 38 29 20 2a 2f 0a 0a 0a 23  ITE_UTF8) */...#
6620: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54 46  ifdef SQLITE_UTF
6630: 38 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  8./*.** Convert 
6640: 74 68 65 20 55 54 46 2d 38 20 63 68 61 72 61 63  the UTF-8 charac
6650: 74 65 72 20 74 6f 20 77 68 69 63 68 20 7a 20 70  ter to which z p
6660: 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 33 31 2d  oints into a 31-
6670: 62 69 74 0a 2a 2a 20 55 43 53 20 63 68 61 72 61  bit.** UCS chara
6680: 63 74 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79  cter.  This only
6690: 20 77 6f 72 6b 73 20 72 69 67 68 74 20 69 66 20   works right if 
66a0: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 65  z points to a we
66b0: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55 54 46  ll-formed.** UTF
66c0: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  -8 string..*/.st
66d0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
66e0: 75 74 66 38 5f 74 6f 5f 69 6e 74 28 63 6f 6e 73  utf8_to_int(cons
66f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
6700: 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *z){.  int c;.  
6710: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
6720: 20 69 6e 69 74 56 61 6c 5b 5d 20 3d 20 7b 0a 20   initVal[] = {. 
6730: 20 20 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32       0,   1,   2
6740: 2c 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c  ,   3,   4,   5,
6750: 20 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20     6,   7,   8, 
6760: 20 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20    9,  10,  11,  
6770: 31 32 2c 20 20 31 33 2c 20 20 31 34 2c 0a 20 20  12,  13,  14,.  
6780: 20 20 20 31 35 2c 20 20 31 36 2c 20 20 31 37 2c     15,  16,  17,
6790: 20 20 31 38 2c 20 20 31 39 2c 20 20 32 30 2c 20    18,  19,  20, 
67a0: 20 32 31 2c 20 20 32 32 2c 20 20 32 33 2c 20 20   21,  22,  23,  
67b0: 32 34 2c 20 20 32 35 2c 20 20 32 36 2c 20 20 32  24,  25,  26,  2
67c0: 37 2c 20 20 32 38 2c 20 20 32 39 2c 0a 20 20 20  7,  28,  29,.   
67d0: 20 20 33 30 2c 20 20 33 31 2c 20 20 33 32 2c 20    30,  31,  32, 
67e0: 20 33 33 2c 20 20 33 34 2c 20 20 33 35 2c 20 20   33,  34,  35,  
67f0: 33 36 2c 20 20 33 37 2c 20 20 33 38 2c 20 20 33  36,  37,  38,  3
6800: 39 2c 20 20 34 30 2c 20 20 34 31 2c 20 20 34 32  9,  40,  41,  42
6810: 2c 20 20 34 33 2c 20 20 34 34 2c 0a 20 20 20 20  ,  43,  44,.    
6820: 20 34 35 2c 20 20 34 36 2c 20 20 34 37 2c 20 20   45,  46,  47,  
6830: 34 38 2c 20 20 34 39 2c 20 20 35 30 2c 20 20 35  48,  49,  50,  5
6840: 31 2c 20 20 35 32 2c 20 20 35 33 2c 20 20 35 34  1,  52,  53,  54
6850: 2c 20 20 35 35 2c 20 20 35 36 2c 20 20 35 37 2c  ,  55,  56,  57,
6860: 20 20 35 38 2c 20 20 35 39 2c 0a 20 20 20 20 20    58,  59,.     
6870: 36 30 2c 20 20 36 31 2c 20 20 36 32 2c 20 20 36  60,  61,  62,  6
6880: 33 2c 20 20 36 34 2c 20 20 36 35 2c 20 20 36 36  3,  64,  65,  66
6890: 2c 20 20 36 37 2c 20 20 36 38 2c 20 20 36 39 2c  ,  67,  68,  69,
68a0: 20 20 37 30 2c 20 20 37 31 2c 20 20 37 32 2c 20    70,  71,  72, 
68b0: 20 37 33 2c 20 20 37 34 2c 0a 20 20 20 20 20 37   73,  74,.     7
68c0: 35 2c 20 20 37 36 2c 20 20 37 37 2c 20 20 37 38  5,  76,  77,  78
68d0: 2c 20 20 37 39 2c 20 20 38 30 2c 20 20 38 31 2c  ,  79,  80,  81,
68e0: 20 20 38 32 2c 20 20 38 33 2c 20 20 38 34 2c 20    82,  83,  84, 
68f0: 20 38 35 2c 20 20 38 36 2c 20 20 38 37 2c 20 20   85,  86,  87,  
6900: 38 38 2c 20 20 38 39 2c 0a 20 20 20 20 20 39 30  88,  89,.     90
6910: 2c 20 20 39 31 2c 20 20 39 32 2c 20 20 39 33 2c  ,  91,  92,  93,
6920: 20 20 39 34 2c 20 20 39 35 2c 20 20 39 36 2c 20    94,  95,  96, 
6930: 20 39 37 2c 20 20 39 38 2c 20 20 39 39 2c 20 31   97,  98,  99, 1
6940: 30 30 2c 20 31 30 31 2c 20 31 30 32 2c 20 31 30  00, 101, 102, 10
6950: 33 2c 20 31 30 34 2c 0a 20 20 20 20 31 30 35 2c  3, 104,.    105,
6960: 20 31 30 36 2c 20 31 30 37 2c 20 31 30 38 2c 20   106, 107, 108, 
6970: 31 30 39 2c 20 31 31 30 2c 20 31 31 31 2c 20 31  109, 110, 111, 1
6980: 31 32 2c 20 31 31 33 2c 20 31 31 34 2c 20 31 31  12, 113, 114, 11
6990: 35 2c 20 31 31 36 2c 20 31 31 37 2c 20 31 31 38  5, 116, 117, 118
69a0: 2c 20 31 31 39 2c 0a 20 20 20 20 31 32 30 2c 20  , 119,.    120, 
69b0: 31 32 31 2c 20 31 32 32 2c 20 31 32 33 2c 20 31  121, 122, 123, 1
69c0: 32 34 2c 20 31 32 35 2c 20 31 32 36 2c 20 31 32  24, 125, 126, 12
69d0: 37 2c 20 31 32 38 2c 20 31 32 39 2c 20 31 33 30  7, 128, 129, 130
69e0: 2c 20 31 33 31 2c 20 31 33 32 2c 20 31 33 33 2c  , 131, 132, 133,
69f0: 20 31 33 34 2c 0a 20 20 20 20 31 33 35 2c 20 31   134,.    135, 1
6a00: 33 36 2c 20 31 33 37 2c 20 31 33 38 2c 20 31 33  36, 137, 138, 13
6a10: 39 2c 20 31 34 30 2c 20 31 34 31 2c 20 31 34 32  9, 140, 141, 142
6a20: 2c 20 31 34 33 2c 20 31 34 34 2c 20 31 34 35 2c  , 143, 144, 145,
6a30: 20 31 34 36 2c 20 31 34 37 2c 20 31 34 38 2c 20   146, 147, 148, 
6a40: 31 34 39 2c 0a 20 20 20 20 31 35 30 2c 20 31 35  149,.    150, 15
6a50: 31 2c 20 31 35 32 2c 20 31 35 33 2c 20 31 35 34  1, 152, 153, 154
6a60: 2c 20 31 35 35 2c 20 31 35 36 2c 20 31 35 37 2c  , 155, 156, 157,
6a70: 20 31 35 38 2c 20 31 35 39 2c 20 31 36 30 2c 20   158, 159, 160, 
6a80: 31 36 31 2c 20 31 36 32 2c 20 31 36 33 2c 20 31  161, 162, 163, 1
6a90: 36 34 2c 0a 20 20 20 20 31 36 35 2c 20 31 36 36  64,.    165, 166
6aa0: 2c 20 31 36 37 2c 20 31 36 38 2c 20 31 36 39 2c  , 167, 168, 169,
6ab0: 20 31 37 30 2c 20 31 37 31 2c 20 31 37 32 2c 20   170, 171, 172, 
6ac0: 31 37 33 2c 20 31 37 34 2c 20 31 37 35 2c 20 31  173, 174, 175, 1
6ad0: 37 36 2c 20 31 37 37 2c 20 31 37 38 2c 20 31 37  76, 177, 178, 17
6ae0: 39 2c 0a 20 20 20 20 31 38 30 2c 20 31 38 31 2c  9,.    180, 181,
6af0: 20 31 38 32 2c 20 31 38 33 2c 20 31 38 34 2c 20   182, 183, 184, 
6b00: 31 38 35 2c 20 31 38 36 2c 20 31 38 37 2c 20 31  185, 186, 187, 1
6b10: 38 38 2c 20 31 38 39 2c 20 31 39 30 2c 20 31 39  88, 189, 190, 19
6b20: 31 2c 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32  1,   0,   1,   2
6b30: 2c 0a 20 20 20 20 20 20 33 2c 20 20 20 34 2c 20  ,.      3,   4, 
6b40: 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20    5,   6,   7,  
6b50: 20 38 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31   8,   9,  10,  1
6b60: 31 2c 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34  1,  12,  13,  14
6b70: 2c 20 20 31 35 2c 20 20 31 36 2c 20 20 31 37 2c  ,  15,  16,  17,
6b80: 0a 20 20 20 20 20 31 38 2c 20 20 31 39 2c 20 20  .     18,  19,  
6b90: 32 30 2c 20 20 32 31 2c 20 20 32 32 2c 20 20 32  20,  21,  22,  2
6ba0: 33 2c 20 20 32 34 2c 20 20 32 35 2c 20 20 32 36  3,  24,  25,  26
6bb0: 2c 20 20 32 37 2c 20 20 32 38 2c 20 20 32 39 2c  ,  27,  28,  29,
6bc0: 20 20 33 30 2c 20 20 33 31 2c 20 20 20 30 2c 0a    30,  31,   0,.
6bd0: 20 20 20 20 20 20 31 2c 20 20 20 32 2c 20 20 20        1,   2,   
6be0: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
6bf0: 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c  ,   7,   8,   9,
6c00: 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20    10,  11,  12, 
6c10: 20 31 33 2c 20 20 31 34 2c 20 20 31 35 2c 0a 20   13,  14,  15,. 
6c20: 20 20 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32       0,   1,   2
6c30: 2c 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c  ,   3,   4,   5,
6c40: 20 20 20 36 2c 20 20 20 37 2c 20 20 20 30 2c 20     6,   7,   0, 
6c50: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20    1,   2,   3,  
6c60: 20 30 2c 20 20 20 31 2c 20 32 35 34 2c 0a 20 20   0,   1, 254,.  
6c70: 20 20 32 35 35 2c 0a 20 20 7d 3b 0a 20 20 63 20    255,.  };.  c 
6c80: 3d 20 69 6e 69 74 56 61 6c 5b 2a 28 7a 2b 2b 29  = initVal[*(z++)
6c90: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 30 78 63  ];.  while( (0xc
6ca0: 30 26 2a 7a 29 3d 3d 30 78 38 30 20 29 7b 0a 20  0&*z)==0x80 ){. 
6cb0: 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20 7c 20     c = (c<<6) | 
6cc0: 28 30 78 33 66 26 2a 28 7a 2b 2b 29 29 3b 0a 20  (0x3f&*(z++));. 
6cd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d   }.  return c;.}
6ce0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
6cf0: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
6d00: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
6d10: 61 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20  ality where the 
6d20: 66 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e  first string can
6d30: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
6d40: 62 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72  be a "glob" expr
6d50: 65 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ession.  Return 
6d60: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79  true (1) if they
6d70: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
6d80: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
6d90: 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
6da0: 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  rent..**.** Glob
6db0: 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
6dc0: 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
6dd0: 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
6de0: 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
6df0: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
6e00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
6e10: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
6e20: 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
6e30: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
6e40: 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
6e50: 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
6e60: 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
6e70: 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
6e90: 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
6ea0: 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
6eb0: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
6ec0: 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
6ed0: 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
6ee0: 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e  .** With the [..
6ef0: 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61  .] and [^...] ma
6f00: 74 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68  tching, a ']' ch
6f10: 61 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69  aracter can be i
6f20: 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68  ncluded.** in th
6f30: 65 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67  e list by making
6f40: 20 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68   it the first ch
6f50: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b  aracter after '[
6f60: 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20  ' or '^'.  A.** 
6f70: 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74  range of charact
6f80: 65 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69  ers can be speci
6f90: 66 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20  fied using '-'. 
6fa0: 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61   Example:.** "[a
6fb0: 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79  -z]" matches any
6fc0: 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61   single lower-ca
6fd0: 73 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d  se letter.  To m
6fe0: 61 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65  atch a '-', make
6ff0: 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20  .** it the last 
7000: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
7010: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   list..**.** Thi
7020: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75  s routine is usu
7030: 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20  ally quick, but 
7040: 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74  can be N**2 in t
7050: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a  he worst case..*
7060: 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d  *.** Hints: to m
7070: 61 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c  atch '*' or '?',
7080: 20 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d   put them in "[]
7090: 22 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  ".  Like this:.*
70a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63  *.**         abc
70b0: 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61  [*]xyz        Ma
70c0: 74 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20  tches "abc*xyz" 
70d0: 6f 6e 6c 79 0a 2a 2f 0a 69 6e 74 20 0a 73 71 6c  only.*/.int .sql
70e0: 69 74 65 47 6c 6f 62 43 6f 6d 70 61 72 65 28 63  iteGlobCompare(c
70f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7100: 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 6f  ar *zPattern, co
7110: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7120: 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72  r *zString){.  r
7130: 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b 0a 20  egister int c;. 
7140: 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
7150: 6e 74 20 73 65 65 6e 3b 0a 20 20 69 6e 74 20 63  nt seen;.  int c
7160: 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  2;..  while( (c 
7170: 3d 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d 30 20  = *zPattern)!=0 
7180: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  ){.    switch( c
7190: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27   ){.      case '
71a0: 2a 27 3a 0a 20 20 20 20 20 20 20 20 77 68 69 6c  *':.        whil
71b0: 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31  e( (c=zPattern[1
71c0: 5d 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 20 3d  ]) == '*' || c =
71d0: 3d 20 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20  = '?' ){.       
71e0: 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b     if( c=='?' ){
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7200: 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72   *zString==0 ) r
7210: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
7220: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
7230: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
7240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7250: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
7260: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7270: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
7280: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 69  urn 1;.        i
7290: 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
72a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
72b0: 53 74 72 69 6e 67 20 26 26 20 73 71 6c 69 74 65  String && sqlite
72c0: 47 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50 61  GlobCompare(&zPa
72d0: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
72e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
72f0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
7300: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
7310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7320: 20 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69     return *zStri
7330: 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 7d  ng!=0;.        }
7340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7350: 77 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 7a 53  while( (c2 = *zS
7360: 74 72 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  tring)!=0 ){.   
7370: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
7380: 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d  c2 != 0 && c2 !=
7390: 20 63 20 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53   c ){ c2 = *++zS
73a0: 74 72 69 6e 67 3b 20 7d 0a 20 20 20 20 20 20 20  tring; }.       
73b0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
73c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
73d0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
73e0: 65 47 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50  eGlobCompare(&zP
73f0: 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e  attern[1],zStrin
7400: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
7410: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7420: 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e  eNextChar(zStrin
7430: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
7440: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7450: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
7460: 20 20 20 20 63 61 73 65 20 27 3f 27 3a 20 7b 0a      case '?': {.
7470: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
7480: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
7490: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
74a0: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
74b0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 61  ng);.        zPa
74c0: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
74d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
74e0: 20 20 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20        case '[': 
74f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72  {.        int pr
7500: 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
7510: 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
7520: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
7530: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
7540: 69 74 65 43 68 61 72 56 61 6c 28 7a 53 74 72 69  iteCharVal(zStri
7550: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ng);.        if(
7560: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
7570: 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
7580: 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20  ++zPattern;.    
7590: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
75a0: 29 7b 20 69 6e 76 65 72 74 20 3d 20 31 3b 20 63  ){ invert = 1; c
75b0: 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b  2 = *++zPattern;
75c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
75d0: 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2==']' ){.      
75e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29      if( c==']' )
75f0: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
7600: 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61       c2 = *++zPa
7610: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  ttern;.        }
7620: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
7630: 28 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72  (c2 = sqliteChar
7640: 56 61 6c 28 7a 50 61 74 74 65 72 6e 29 29 21 3d  Val(zPattern))!=
7650: 30 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  0 && c2!=']' ){.
7660: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32            if( c2
7670: 3d 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72  =='-' && zPatter
7680: 6e 5b 31 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61  n[1]!=']' && zPa
7690: 74 74 65 72 6e 5b 31 5d 21 3d 30 20 26 26 20 70  ttern[1]!=0 && p
76a0: 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20  rior_c>0 ){.    
76b0: 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e          zPattern
76c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
76d0: 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56  c2 = sqliteCharV
76e0: 61 6c 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  al(zPattern);.  
76f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e            if( c>
7700: 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63  =prior_c && c<=c
7710: 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  2 ) seen = 1;.  
7720: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
7730: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
7740: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 63 32   }else if( c==c2
7750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7760: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
7770: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
7780: 63 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  c2;.          }e
7790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
77a0: 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
77b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
77c0: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
77d0: 68 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20  har(zPattern);. 
77e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
77f0: 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73   if( c2==0 || (s
7800: 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30  een ^ invert)==0
7810: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7820: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
7830: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
7840: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
7850: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
7870: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7880: 20 20 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72    if( c != *zStr
7890: 69 6e 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ing ) return 0;.
78a0: 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e          zPattern
78b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 53 74 72  ++;.        zStr
78c0: 69 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  ing++;.        b
78d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
78e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
78f0: 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a   *zString==0;.}.
7900: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
7910: 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  wo UTF-8 strings
7920: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 75 73   for equality us
7930: 69 6e 67 20 74 68 65 20 22 4c 49 4b 45 22 20 6f  ing the "LIKE" o
7940: 70 65 72 61 74 6f 72 20 6f 66 0a 2a 2a 20 53 51  perator of.** SQ
7950: 4c 2e 20 20 54 68 65 20 27 25 27 20 63 68 61 72  L.  The '%' char
7960: 61 63 74 65 72 20 6d 61 74 63 68 65 73 20 61 6e  acter matches an
7970: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 30 20  y sequence of 0 
7980: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 68 61 72 61  or more.** chara
7990: 63 74 65 72 73 20 61 6e 64 20 27 5f 27 20 6d 61  cters and '_' ma
79a0: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
79b0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 43 61 73   character.  Cas
79c0: 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 73 69 67 6e  e is.** not sign
79d0: 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  ificant..**.** T
79e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
79f0: 75 73 74 20 61 6e 20 61 64 61 70 74 61 74 69 6f  ust an adaptatio
7a00: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 47  n of the sqliteG
7a10: 6c 6f 62 43 6f 6d 70 61 72 65 28 29 0a 2a 2a 20  lobCompare().** 
7a20: 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 0a 2a  routine above..*
7a30: 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 4c 69 6b  /.int .sqliteLik
7a40: 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75  eCompare(const u
7a50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50  nsigned char *zP
7a60: 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e  attern, const un
7a70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74  signed char *zSt
7a80: 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65  ring){.  registe
7a90: 72 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63  r int c;.  int c
7aa0: 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  2;..  while( (c 
7ab0: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  = UpperToLower[*
7ac0: 7a 50 61 74 74 65 72 6e 5d 29 21 3d 30 20 29 7b  zPattern])!=0 ){
7ad0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 20 29  .    switch( c )
7ae0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 25 27  {.      case '%'
7af0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  : {.        whil
7b00: 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31  e( (c=zPattern[1
7b10: 5d 29 20 3d 3d 20 27 25 27 20 7c 7c 20 63 20 3d  ]) == '%' || c =
7b20: 3d 20 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 20  = '_' ){.       
7b30: 20 20 20 69 66 28 20 63 3d 3d 27 5f 27 20 29 7b     if( c=='_' ){
7b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7b50: 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72   *zString==0 ) r
7b60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
7b70: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
7b80: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
7b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ba0: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
7bb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7bc0: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
7bd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 63  urn 1;.        c
7be0: 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b   = UpperToLower[
7bf0: 63 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  c];.        whil
7c00: 65 28 20 28 63 32 3d 55 70 70 65 72 54 6f 4c 6f  e( (c2=UpperToLo
7c10: 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 29 21 3d  wer[*zString])!=
7c20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
7c30: 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26  hile( c2 != 0 &&
7c40: 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d   c2 != c ){ c2 =
7c50: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b   UpperToLower[*+
7c60: 2b 7a 53 74 72 69 6e 67 5d 3b 20 7d 0a 20 20 20  +zString]; }.   
7c70: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30         if( c2==0
7c80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7c90: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7ca0: 65 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50  eLikeCompare(&zP
7cb0: 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e  attern[1],zStrin
7cc0: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
7cd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e           sqliteN
7ce0: 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29  extChar(zString)
7cf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7d00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
7d20: 20 27 5f 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '_': {.        
7d30: 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  if( *zString==0 
7d40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7d50: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
7d60: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
7d70: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
7d80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
7da0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7db0: 20 69 66 28 20 63 20 21 3d 20 55 70 70 65 72 54   if( c != UpperT
7dc0: 6f 4c 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d  oLower[*zString]
7dd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
7de0: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
7df0: 0a 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67  .        zString
7e00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
7e10: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7e20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  .  }.  return *z
7e30: 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  String==0;.}../*
7e40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
7e50: 71 6c 69 74 65 2e 6d 61 67 69 63 20 66 72 6f 6d  qlite.magic from
7e60: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
7e70: 45 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  EN to SQLITE_MAG
7e80: 49 43 5f 42 55 53 59 2e 0a 2a 2a 20 52 65 74 75  IC_BUSY..** Retu
7e90: 72 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e 6f 6e  rn an error (non
7ea0: 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 6d 61  -zero) if the ma
7eb0: 67 69 63 20 77 61 73 20 6e 6f 74 20 53 51 4c 49  gic was not SQLI
7ec0: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 0a 2a 2a  TE_MAGIC_OPEN.**
7ed0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
7ee0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
7ef0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7f00: 20 69 73 20 61 20 61 74 74 65 6d 70 74 20 74 6f   is a attempt to
7f10: 20 64 65 74 65 63 74 20 69 66 20 74 77 6f 20 74   detect if two t
7f20: 68 72 65 61 64 73 20 75 73 65 20 74 68 65 0a 2a  hreads use the.*
7f30: 2a 20 73 61 6d 65 20 73 71 6c 69 74 65 2a 20 70  * same sqlite* p
7f40: 6f 69 6e 74 65 72 20 61 74 20 74 68 65 20 73 61  ointer at the sa
7f50: 6d 65 20 74 69 6d 65 2e 20 20 54 68 65 72 65 20  me time.  There 
7f60: 69 73 20 61 20 72 61 63 65 20 0a 2a 2a 20 63 6f  is a race .** co
7f70: 6e 64 69 74 69 6f 6e 20 73 6f 20 69 74 20 69 73  ndition so it is
7f80: 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
7f90: 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
7fa0: 64 65 74 65 63 74 65 64 2e 0a 2a 2a 20 42 75 74  detected..** But
7fb0: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 70 72 6f   usually the pro
7fc0: 62 6c 65 6d 20 77 69 6c 6c 20 62 65 20 73 65 65  blem will be see
7fd0: 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 77  n.  The result w
7fe0: 69 6c 6c 20 62 65 20 61 6e 0a 2a 2a 20 65 72 72  ill be an.** err
7ff0: 6f 72 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  or which can be 
8000: 75 73 65 64 20 74 6f 20 64 65 62 75 67 20 74 68  used to debug th
8010: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68  e application th
8020: 61 74 20 69 73 0a 2a 2a 20 75 73 69 6e 67 20 53  at is.** using S
8030: 51 4c 69 74 65 20 69 6e 63 6f 72 72 65 63 74 6c  QLite incorrectl
8040: 79 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  y..**.** Ticket 
8050: 23 32 30 32 3a 20 20 49 66 20 64 62 2d 3e 6d 61  #202:  If db->ma
8060: 67 69 63 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  gic is not a val
8070: 69 64 20 6f 70 65 6e 20 76 61 6c 75 65 2c 20 74  id open value, t
8080: 61 6b 65 20 63 61 72 65 20 6e 6f 74 0a 2a 2a 20  ake care not.** 
8090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64 62  to modify the db
80a0: 20 73 74 72 75 63 74 75 72 65 20 61 74 20 61 6c   structure at al
80b0: 6c 2e 20 20 49 74 20 63 6f 75 6c 64 20 62 65 20  l.  It could be 
80c0: 74 68 61 74 20 64 62 20 69 73 20 61 20 73 74 61  that db is a sta
80d0: 6c 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 20  le.** pointer.  
80e0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
80f0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
8100: 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
8110: 61 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  a prior.** call 
8120: 74 6f 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28  to sqlite_close(
8130: 64 62 29 20 61 6e 64 20 64 62 20 68 61 73 20 62  db) and db has b
8140: 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
8150: 20 20 41 6e 64 20 77 65 20 64 6f 0a 2a 2a 20 6e    And we do.** n
8160: 6f 74 20 77 61 6e 74 20 74 6f 20 77 72 69 74 65  ot want to write
8170: 20 69 6e 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65   into deallocate
8180: 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74  d memory..*/.int
8190: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e 28   sqliteSafetyOn(
81a0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69  sqlite *db){.  i
81b0: 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  f( db->magic==SQ
81c0: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20  LITE_MAGIC_OPEN 
81d0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
81e0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
81f0: 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75 72 6e  BUSY;.    return
8200: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
8210: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
8220: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 7c 7c 20  E_MAGIC_BUSY || 
8230: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
8240: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 0a 20 20  E_MAGIC_ERROR.  
8250: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64 62             || db
8260: 2d 3e 77 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20  ->want_to_close 
8270: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
8280: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8290: 45 52 52 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66  ERROR;.    db->f
82a0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
82b0: 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20  nterrupt;.  }.  
82c0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
82d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
82e0: 67 69 63 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  gic from SQLITE_
82f0: 4d 41 47 49 43 5f 42 55 53 59 20 74 6f 20 53 51  MAGIC_BUSY to SQ
8300: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 2e  LITE_MAGIC_OPEN.
8310: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
8320: 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  ror (non-zero) i
8330: 66 20 74 68 65 20 6d 61 67 69 63 20 77 61 73 20  f the magic was 
8340: 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  not SQLITE_MAGIC
8350: 5f 42 55 53 59 0a 2a 2a 20 77 68 65 6e 20 74 68  _BUSY.** when th
8360: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8370: 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lled..*/.int sql
8380: 69 74 65 53 61 66 65 74 79 4f 66 66 28 73 71 6c  iteSafetyOff(sql
8390: 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  ite *db){.  if( 
83a0: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
83b0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a  E_MAGIC_BUSY ){.
83c0: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
83d0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
83e0: 4e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  N;.    return 0;
83f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
8400: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
8410: 41 47 49 43 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d  AGIC_OPEN || db-
8420: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
8430: 41 47 49 43 5f 45 52 52 4f 52 0a 20 20 20 20 20  AGIC_ERROR.     
8440: 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 77          || db->w
8450: 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a  ant_to_close ){.
8460: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
8470: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
8480: 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  OR;.    db->flag
8490: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
84a0: 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrupt;.  }.  ret
84b0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
84c0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
84d0: 72 65 20 77 65 20 61 72 65 20 6e 6f 74 20 63 75  re we are not cu
84e0: 72 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e  rrently executin
84f0: 67 20 61 6e 20 73 71 6c 69 74 65 5f 65 78 65 63  g an sqlite_exec
8500: 28 29 2e 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ()..** If we are
8510: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 6e   currently in an
8520: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 2c 20   sqlite_exec(), 
8530: 72 65 74 75 72 6e 20 74 72 75 65 20 61 6e 64 20  return true and 
8540: 73 65 74 0a 2a 2a 20 73 71 6c 69 74 65 2e 6d 61  set.** sqlite.ma
8550: 67 69 63 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  gic to SQLITE_MA
8560: 47 49 43 5f 45 52 52 4f 52 2e 20 20 54 68 69 73  GIC_ERROR.  This
8570: 20 77 69 6c 6c 20 63 61 75 73 65 20 61 20 63 6f   will cause a co
8580: 6d 70 6c 65 74 65 0a 2a 2a 20 73 68 75 74 64 6f  mplete.** shutdo
8590: 77 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  wn of the databa
85a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
85b0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
85c0: 6f 20 74 72 79 20 74 6f 20 64 65 74 65 63 74 20  o try to detect 
85d0: 77 68 65 6e 20 41 50 49 20 72 6f 75 74 69 6e 65  when API routine
85e0: 73 20 61 72 65 20 63 61 6c 6c 65 64 0a 2a 2a 20  s are called.** 
85f0: 61 74 20 74 68 65 20 77 72 6f 6e 67 20 74 69 6d  at the wrong tim
8600: 65 20 6f 72 20 69 6e 20 74 68 65 20 77 72 6f 6e  e or in the wron
8610: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69  g sequence..*/.i
8620: 6e 74 20 73 71 6c 69 74 65 53 61 66 65 74 79 43  nt sqliteSafetyC
8630: 68 65 63 6b 28 73 71 6c 69 74 65 20 2a 64 62 29  heck(sqlite *db)
8640: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  {.  if( db->pVdb
8650: 65 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e!=0 ){.    db->
8660: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
8670: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 20 20  AGIC_ERROR;.    
8680: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
8690: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a              return 0;.}.