/ Hex Artifact Content
Login

Artifact cc95dd360fac09a059b2ab98e4c333d1a2308db5:


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 36  Id: util.c,v 1.6
0220: 38 20 32 30 30 33 2f 31 30 2f 32 32 20 32 32 3a  8 2003/10/22 22:
0230: 31 35 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  15:28 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 20 54  n *z==0;.}../* T
4020: 68 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  his comparison r
4030: 6f 75 74 69 6e 65 20 69 73 20 77 68 61 74 20 77  outine is what w
4040: 65 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  e use for compar
4050: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a  ison operations.
4060: 2a 2a 20 62 65 74 77 65 65 6e 20 6e 75 6d 65 72  ** between numer
4070: 69 63 20 76 61 6c 75 65 73 20 69 6e 20 61 6e 20  ic values in an 
4080: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  SQL expression. 
4090: 20 22 4e 75 6d 65 72 69 63 22 20 69 73 20 61 20   "Numeric" is a 
40a0: 6c 69 74 74 6c 65 0a 2a 2a 20 62 69 74 20 6d 69  little.** bit mi
40b0: 73 6c 65 61 64 69 6e 67 20 68 65 72 65 2e 20 20  sleading here.  
40c0: 57 68 61 74 20 77 65 20 6d 65 61 6e 20 69 73 20  What we mean is 
40d0: 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 73  that the strings
40e0: 20 68 61 76 65 20 61 0a 2a 2a 20 74 79 70 65 20   have a.** type 
40f0: 6f 66 20 22 6e 75 6d 65 72 69 63 22 20 66 72 6f  of "numeric" fro
4100: 6d 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 76  m the point of v
4110: 69 65 77 20 6f 66 20 53 51 4c 2e 20 20 54 68 65  iew of SQL.  The
4120: 20 73 74 72 69 6e 67 73 0a 2a 2a 20 64 6f 20 6e   strings.** do n
4130: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
4140: 6f 6e 74 61 69 6e 20 6e 75 6d 62 65 72 73 2e 20  ontain numbers. 
4150: 20 54 68 65 79 20 63 6f 75 6c 64 20 63 6f 6e 74   They could cont
4160: 61 69 6e 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  ain text..**.** 
4170: 49 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  If the input str
4180: 69 6e 67 73 20 62 6f 74 68 20 6c 6f 6f 6b 20 6c  ings both look l
4190: 69 6b 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  ike actual numbe
41a0: 72 73 20 74 68 65 6e 20 74 68 65 79 0a 2a 2a 20  rs then they.** 
41b0: 63 6f 6d 70 61 72 65 20 69 6e 20 6e 75 6d 65 72  compare in numer
41c0: 69 63 61 6c 20 6f 72 64 65 72 2e 20 20 4e 75 6d  ical order.  Num
41d0: 65 72 69 63 61 6c 20 73 74 72 69 6e 67 73 20 61  erical strings a
41e0: 72 65 20 61 6c 77 61 79 73 20 6c 65 73 73 20 0a  re always less .
41f0: 2a 2a 20 74 68 61 6e 20 6e 6f 6e 2d 6e 75 6d 65  ** than non-nume
4200: 72 69 63 20 73 74 72 69 6e 67 73 20 73 6f 20 69  ric strings so i
4210: 66 20 6f 6e 65 20 69 6e 70 75 74 20 73 74 72 69  f one input stri
4220: 6e 67 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 0a  ng looks like a.
4230: 2a 2a 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ** number and th
4240: 65 20 6f 74 68 65 72 20 64 6f 65 73 20 6e 6f 74  e other does not
4250: 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 65 20 74  , then the one t
4260: 68 61 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 0a 2a  hat looks like.*
4270: 2a 20 61 20 6e 75 6d 62 65 72 20 69 73 20 74 68  * a number is th
4280: 65 20 73 6d 61 6c 6c 65 72 2e 20 20 4e 6f 6e 2d  e smaller.  Non-
4290: 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73 20  numeric strings 
42a0: 63 6f 6d 70 61 72 65 20 69 6e 20 0a 2a 2a 20 6c  compare in .** l
42b0: 65 78 69 67 72 61 70 68 69 63 61 6c 20 6f 72 64  exigraphical ord
42c0: 65 72 20 28 74 68 65 20 73 61 6d 65 20 6f 72 64  er (the same ord
42d0: 65 72 20 61 73 20 73 74 72 63 6d 70 28 29 29 2e  er as strcmp()).
42e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f  .*/.int sqliteCo
42f0: 6d 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72  mpare(const char
4300: 20 2a 61 74 65 78 74 2c 20 63 6f 6e 73 74 20 63   *atext, const c
4310: 68 61 72 20 2a 62 74 65 78 74 29 7b 0a 20 20 69  har *btext){.  i
4320: 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 69 6e 74  nt result;.  int
4330: 20 69 73 4e 75 6d 41 2c 20 69 73 4e 75 6d 42 3b   isNumA, isNumB;
4340: 0a 20 20 69 66 28 20 61 74 65 78 74 3d 3d 30 20  .  if( atext==0 
4350: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ){.    return -1
4360: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 74  ;.  }else if( bt
4370: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
4380: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 73  turn 1;.  }.  is
4390: 4e 75 6d 41 20 3d 20 73 71 6c 69 74 65 49 73 4e  NumA = sqliteIsN
43a0: 75 6d 62 65 72 28 61 74 65 78 74 29 3b 0a 20 20  umber(atext);.  
43b0: 69 73 4e 75 6d 42 20 3d 20 73 71 6c 69 74 65 49  isNumB = sqliteI
43c0: 73 4e 75 6d 62 65 72 28 62 74 65 78 74 29 3b 0a  sNumber(btext);.
43d0: 20 20 69 66 28 20 69 73 4e 75 6d 41 20 29 7b 0a    if( isNumA ){.
43e0: 20 20 20 20 69 66 28 20 21 69 73 4e 75 6d 42 20      if( !isNumB 
43f0: 29 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20  ){.      result 
4400: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
4410: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 41  .      double rA
4420: 2c 20 72 42 3b 0a 20 20 20 20 20 20 72 41 20 3d  , rB;.      rA =
4430: 20 61 74 6f 66 28 61 74 65 78 74 29 3b 0a 20 20   atof(atext);.  
4440: 20 20 20 20 72 42 20 3d 20 61 74 6f 66 28 62 74      rB = atof(bt
4450: 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
4460: 72 41 3c 72 42 20 29 7b 0a 20 20 20 20 20 20 20  rA<rB ){.       
4470: 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20   result = -1;.  
4480: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 41      }else if( rA
4490: 3e 72 42 20 29 7b 0a 20 20 20 20 20 20 20 20 72  >rB ){.        r
44a0: 65 73 75 6c 74 20 3d 20 2b 31 3b 0a 20 20 20 20  esult = +1;.    
44b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
44c0: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
44d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
44e0: 73 65 20 69 66 28 20 69 73 4e 75 6d 42 20 29 7b  se if( isNumB ){
44f0: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2b 31  .    result = +1
4500: 3b 0a 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20  ;.  }else {.    
4510: 72 65 73 75 6c 74 20 3d 20 73 74 72 63 6d 70 28  result = strcmp(
4520: 61 74 65 78 74 2c 20 62 74 65 78 74 29 3b 0a 20  atext, btext);. 
4530: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
4540: 6c 74 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  lt; .}../*.** Th
4550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4560: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20  ed for sorting. 
4570: 20 45 61 63 68 20 6b 65 79 20 69 73 20 61 20 6c   Each key is a l
4580: 69 73 74 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  ist of one or mo
4590: 72 65 0a 2a 2a 20 6e 75 6c 6c 2d 74 65 72 6d 69  re.** null-termi
45a0: 6e 61 74 65 64 20 65 6c 65 6d 65 6e 74 73 2e 20  nated elements. 
45b0: 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72   The list is ter
45c0: 6d 69 6e 61 74 65 64 20 62 79 20 74 77 6f 20 6e  minated by two n
45d0: 75 6c 6c 73 20 69 6e 0a 2a 2a 20 61 20 72 6f 77  ulls in.** a row
45e0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
45f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
4600: 78 74 20 69 73 20 61 20 6b 65 79 20 77 69 74 68  xt is a key with
4610: 20 74 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 0a   three elements.
4620: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
4630: 20 41 6f 6e 65 5c 30 30 30 44 74 77 6f 5c 30 30   Aone\000Dtwo\00
4640: 30 41 74 68 72 65 65 5c 30 30 30 5c 30 30 30 0a  0Athree\000\000.
4650: 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 6c 65 6d 65 6e  **.** All elemen
4660: 74 73 20 62 65 67 69 6e 20 77 69 74 68 20 6f 6e  ts begin with on
4670: 65 20 6f 66 20 74 68 65 20 63 68 61 72 61 63 74  e of the charact
4680: 65 72 73 20 22 2b 2d 41 44 22 20 61 6e 64 20 65  ers "+-AD" and e
4690: 6e 64 20 77 69 74 68 20 22 5c 30 30 30 22 0a 2a  nd with "\000".*
46a0: 2a 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6d  * with zero or m
46b0: 6f 72 65 20 74 65 78 74 20 65 6c 65 6d 65 6e 74  ore text element
46c0: 73 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 45  s in between.  E
46d0: 78 63 65 70 74 2c 20 4e 55 4c 4c 20 65 6c 65 6d  xcept, NULL elem
46e0: 65 6e 74 73 0a 2a 2a 20 63 6f 6e 73 69 73 74 20  ents.** consist 
46f0: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 74  of the special t
4700: 77 6f 2d 63 68 61 72 61 63 74 65 72 20 73 65 71  wo-character seq
4710: 75 65 6e 63 65 20 22 4e 5c 30 30 30 22 2e 0a 2a  uence "N\000"..*
4720: 2a 0a 2a 2a 20 42 6f 74 68 20 61 72 67 75 6d 65  *.** Both argume
4730: 6e 74 73 20 77 69 6c 6c 20 68 61 76 65 20 74 68  nts will have th
4740: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
4750: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 69 73   elements.  This
4760: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
4770: 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  rns negative, ze
4780: 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
4790: 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
47a0: 75 6d 65 6e 74 20 69 73 20 6c 65 73 73 0a 2a 2a  ument is less.**
47b0: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
47c0: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
47d0: 20 74 68 65 20 66 69 72 73 74 2e 20 20 28 52 65   the first.  (Re
47e0: 73 75 6c 74 20 69 73 20 61 2d 62 29 2e 0a 2a 2a  sult is a-b)..**
47f0: 0a 2a 2a 20 45 61 63 68 20 65 6c 65 6d 65 6e 74  .** Each element
4800: 20 62 65 67 69 6e 73 20 77 69 74 68 20 6f 6e 65   begins with one
4810: 20 6f 66 20 74 68 65 20 63 68 61 72 61 63 74 65   of the characte
4820: 72 73 20 22 2b 22 2c 20 22 2d 22 2c 20 22 41 22  rs "+", "-", "A"
4830: 2c 20 22 44 22 2e 0a 2a 2a 20 54 68 69 73 20 63  , "D"..** This c
4840: 68 61 72 61 63 74 65 72 20 64 65 74 65 72 6d 69  haracter determi
4850: 6e 65 73 20 74 68 65 20 73 6f 72 74 20 6f 72 64  nes the sort ord
4860: 65 72 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  er and collating
4870: 20 73 65 71 75 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a   sequence:.**.**
4880: 20 20 20 20 20 2b 20 20 20 20 20 20 53 6f 72 74       +      Sort
4890: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 69 6e 20   numerically in 
48a0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 0a  ascending order.
48b0: 2a 2a 20 20 20 20 20 2d 20 20 20 20 20 20 53 6f  **     -      So
48c0: 72 74 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 69  rt numerically i
48d0: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
48e0: 65 72 0a 2a 2a 20 20 20 20 20 41 20 20 20 20 20  er.**     A     
48f0: 20 53 6f 72 74 20 61 73 20 73 74 72 69 6e 67 73   Sort as strings
4900: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
4910: 64 65 72 0a 2a 2a 20 20 20 20 20 44 20 20 20 20  der.**     D    
4920: 20 20 53 6f 72 74 20 61 73 20 73 74 72 69 6e 67    Sort as string
4930: 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20  s in descending 
4940: 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  order..**.** For
4950: 20 74 68 65 20 22 2b 22 20 61 6e 64 20 22 2d 22   the "+" and "-"
4960: 20 73 6f 72 74 69 6e 67 2c 20 70 75 72 65 20 6e   sorting, pure n
4970: 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73 20 28  umeric strings (
4980: 73 74 72 69 6e 67 73 20 66 6f 72 20 77 68 69 63  strings for whic
4990: 68 20 74 68 65 0a 2a 2a 20 69 73 4e 75 6d 28 29  h the.** isNum()
49a0: 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 20   function above 
49b0: 72 65 74 75 72 6e 73 20 54 52 55 45 29 20 61 6c  returns TRUE) al
49c0: 77 61 79 73 20 63 6f 6d 70 61 72 65 20 6c 65 73  ways compare les
49d0: 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 0a 2a  s than strings.*
49e0: 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  * that are not p
49f0: 75 72 65 20 6e 75 6d 65 72 69 63 73 2e 20 20 4e  ure numerics.  N
4a00: 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72 69 6e  on-numeric strin
4a10: 67 73 20 63 6f 6d 70 61 72 65 20 69 6e 20 6d 65  gs compare in me
4a20: 6d 63 6d 70 28 29 0a 2a 2a 20 6f 72 64 65 72 2e  mcmp().** order.
4a30: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 73 61    This is the sa
4a40: 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73  me sort order as
4a50: 20 74 68 65 20 73 71 6c 69 74 65 43 6f 6d 70 61   the sqliteCompa
4a60: 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  re() function.**
4a70: 20 61 62 6f 76 65 20 67 65 6e 65 72 61 74 65 73   above generates
4a80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74  ..**.** The last
4a90: 20 70 6f 69 6e 74 20 69 73 20 61 20 63 68 61 6e   point is a chan
4aa0: 67 65 20 66 72 6f 6d 20 76 65 72 73 69 6f 6e 20  ge from version 
4ab0: 32 2e 36 2e 33 20 74 6f 20 76 65 72 73 69 6f 6e  2.6.3 to version
4ac0: 20 32 2e 37 2e 30 2e 20 20 49 6e 0a 2a 2a 20 76   2.7.0.  In.** v
4ad0: 65 72 73 69 6f 6e 20 32 2e 36 2e 33 20 61 6e 64  ersion 2.6.3 and
4ae0: 20 65 61 72 6c 69 65 72 2c 20 73 75 62 73 74 72   earlier, substr
4af0: 69 6e 67 73 20 6f 66 20 64 69 67 69 74 73 20 63  ings of digits c
4b00: 6f 6d 70 61 72 65 20 69 6e 20 6e 75 6d 65 72 69  ompare in numeri
4b10: 63 61 6c 20 0a 2a 2a 20 61 6e 64 20 63 61 73 65  cal .** and case
4b20: 20 77 61 73 20 75 73 65 64 20 6f 6e 6c 79 20 74   was used only t
4b30: 6f 20 62 72 65 61 6b 20 61 20 74 69 65 2e 0a 2a  o break a tie..*
4b40: 2a 0a 2a 2a 20 45 6c 65 6d 65 6e 74 73 20 74 68  *.** Elements th
4b50: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 41  at begin with 'A
4b60: 27 20 6f 72 20 27 44 27 20 63 6f 6d 70 61 72 65  ' or 'D' compare
4b70: 20 69 6e 20 6d 65 6d 63 6d 70 28 29 20 6f 72 64   in memcmp() ord
4b80: 65 72 20 72 65 67 61 72 64 6c 65 73 73 0a 2a 2a  er regardless.**
4b90: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
4ba0: 6f 74 20 74 68 65 79 20 6c 6f 6f 6b 20 6c 69 6b  ot they look lik
4bb0: 65 20 61 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  e a number..**.*
4bc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
4bd0: 73 6f 72 74 20 6f 72 64 65 72 20 69 6d 70 6f 73  sort order impos
4be0: 65 64 20 62 79 20 74 68 65 20 72 75 6c 65 73 20  ed by the rules 
4bf0: 61 62 6f 76 65 20 69 73 20 74 68 65 20 73 61 6d  above is the sam
4c00: 65 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6f 72  e.** from the or
4c10: 64 65 72 69 6e 67 20 64 65 66 69 6e 65 64 20 62  dering defined b
4c20: 79 20 74 68 65 20 22 3c 22 2c 20 22 3c 3d 22 2c  y the "<", "<=",
4c30: 20 22 3e 22 2c 20 61 6e 64 20 22 3e 3d 22 20 6f   ">", and ">=" o
4c40: 70 65 72 61 74 6f 72 73 0a 2a 2a 20 6f 66 20 65  perators.** of e
4c50: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 66  xpressions and f
4c60: 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54 68 69  or indices.  Thi
4c70: 73 20 77 61 73 20 6e 6f 74 20 74 68 65 20 63 61  s was not the ca
4c80: 73 65 20 66 6f 72 20 76 65 72 73 69 6f 6e 0a 2a  se for version.*
4c90: 2a 20 32 2e 36 2e 33 20 61 6e 64 20 65 61 72 6c  * 2.6.3 and earl
4ca0: 69 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ier..*/.int sqli
4cb0: 74 65 53 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  teSortCompare(co
4cc0: 6e 73 74 20 63 68 61 72 20 2a 61 2c 20 63 6f 6e  nst char *a, con
4cd0: 73 74 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 69  st char *b){.  i
4ce0: 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e  nt res = 0;.  in
4cf0: 74 20 69 73 4e 75 6d 41 2c 20 69 73 4e 75 6d 42  t isNumA, isNumB
4d00: 3b 0a 20 20 69 6e 74 20 64 69 72 20 3d 20 30 3b  ;.  int dir = 0;
4d10: 0a 0a 20 20 77 68 69 6c 65 28 20 72 65 73 3d 3d  ..  while( res==
4d20: 30 20 26 26 20 2a 61 20 26 26 20 2a 62 20 29 7b  0 && *a && *b ){
4d30: 0a 20 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d 27  .    if( a[0]=='
4d40: 4e 27 20 7c 7c 20 62 5b 30 5d 3d 3d 27 4e 27 20  N' || b[0]=='N' 
4d50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  ){.      if( a[0
4d60: 5d 3d 3d 62 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ]==b[0] ){.     
4d70: 20 20 20 61 20 2b 3d 20 32 3b 0a 20 20 20 20 20     a += 2;.     
4d80: 20 20 20 62 20 2b 3d 20 32 3b 0a 20 20 20 20 20     b += 2;.     
4d90: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4da0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
4db0: 5b 30 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20 20 20  [0]=='N' ){.    
4dc0: 20 20 20 20 64 69 72 20 3d 20 62 5b 30 5d 3b 0a      dir = b[0];.
4dd0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31          res = -1
4de0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4df0: 20 20 20 20 20 20 20 64 69 72 20 3d 20 61 5b 30         dir = a[0
4e00: 5d 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ];.        res =
4e10: 20 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   +1;.      }.   
4e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4e30: 20 20 20 20 61 73 73 65 72 74 28 20 61 5b 30 5d      assert( a[0]
4e40: 3d 3d 62 5b 30 5d 20 29 3b 0a 20 20 20 20 69 66  ==b[0] );.    if
4e50: 28 20 28 64 69 72 3d 61 5b 30 5d 29 3d 3d 27 41  ( (dir=a[0])=='A
4e60: 27 20 7c 7c 20 61 5b 30 5d 3d 3d 27 44 27 20 29  ' || a[0]=='D' )
4e70: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 74  {.      res = st
4e80: 72 63 6d 70 28 26 61 5b 31 5d 2c 26 62 5b 31 5d  rcmp(&a[1],&b[1]
4e90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
4ea0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
4eb0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4e 75 6d  lse{.      isNum
4ec0: 41 20 3d 20 73 71 6c 69 74 65 49 73 4e 75 6d 62  A = sqliteIsNumb
4ed0: 65 72 28 26 61 5b 31 5d 29 3b 0a 20 20 20 20 20  er(&a[1]);.     
4ee0: 20 69 73 4e 75 6d 42 20 3d 20 73 71 6c 69 74 65   isNumB = sqlite
4ef0: 49 73 4e 75 6d 62 65 72 28 26 62 5b 31 5d 29 3b  IsNumber(&b[1]);
4f00: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 75 6d  .      if( isNum
4f10: 41 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  A ){.        dou
4f20: 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20  ble rA, rB;.    
4f30: 20 20 20 20 69 66 28 20 21 69 73 4e 75 6d 42 20      if( !isNumB 
4f40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
4f50: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
4f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4f70: 7d 0a 20 20 20 20 20 20 20 20 72 41 20 3d 20 61  }.        rA = a
4f80: 74 6f 66 28 26 61 5b 31 5d 29 3b 0a 20 20 20 20  tof(&a[1]);.    
4f90: 20 20 20 20 72 42 20 3d 20 61 74 6f 66 28 26 62      rB = atof(&b
4fa0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
4fb0: 28 20 72 41 3c 72 42 20 29 7b 0a 20 20 20 20 20  ( rA<rB ){.     
4fc0: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20       res = -1;. 
4fd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ff0: 20 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a 20    if( rA>rB ){. 
5000: 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2b           res = +
5010: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
5020: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5030: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
5040: 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 20 20  NumB ){.        
5050: 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20  res = +1;.      
5060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
5080: 73 20 3d 20 73 74 72 63 6d 70 28 26 61 5b 31 5d  s = strcmp(&a[1]
5090: 2c 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  ,&b[1]);.       
50a0: 20 69 66 28 20 72 65 73 20 29 20 62 72 65 61 6b   if( res ) break
50b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
50c0: 20 20 20 20 61 20 2b 3d 20 73 74 72 6c 65 6e 28      a += strlen(
50d0: 26 61 5b 31 5d 29 20 2b 20 32 3b 0a 20 20 20 20  &a[1]) + 2;.    
50e0: 62 20 2b 3d 20 73 74 72 6c 65 6e 28 26 62 5b 31  b += strlen(&b[1
50f0: 5d 29 20 2b 20 32 3b 0a 20 20 7d 0a 20 20 69 66  ]) + 2;.  }.  if
5100: 28 20 64 69 72 3d 3d 27 2d 27 20 7c 7c 20 64 69  ( dir=='-' || di
5110: 72 3d 3d 27 44 27 20 29 20 72 65 73 20 3d 20 2d  r=='D' ) res = -
5120: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  res;.  return re
5130: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  s;.}../*.** Some
5140: 20 70 6f 77 65 72 73 20 6f 66 20 36 34 2e 20 20   powers of 64.  
5150: 54 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 20  These constants 
5160: 61 72 65 20 6e 65 65 64 65 64 20 69 6e 20 74 68  are needed in th
5170: 65 0a 2a 2a 20 73 71 6c 69 74 65 52 65 61 6c 54  e.** sqliteRealT
5180: 6f 53 6f 72 74 61 62 6c 65 28 29 20 72 6f 75 74  oSortable() rout
5190: 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 23 64  ine below..*/.#d
51a0: 65 66 69 6e 65 20 5f 36 34 65 33 20 20 28 36 34  efine _64e3  (64
51b0: 2e 30 20 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30  .0 * 64.0 * 64.0
51c0: 29 0a 23 64 65 66 69 6e 65 20 5f 36 34 65 34 20  ).#define _64e4 
51d0: 20 28 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20   (64.0 * 64.0 * 
51e0: 36 34 2e 30 20 2a 20 36 34 2e 30 29 0a 23 64 65  64.0 * 64.0).#de
51f0: 66 69 6e 65 20 5f 36 34 65 31 35 20 28 5f 36 34  fine _64e15 (_64
5200: 65 33 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36 34  e3 * _64e4 * _64
5210: 65 34 20 2a 20 5f 36 34 65 34 29 0a 23 64 65 66  e4 * _64e4).#def
5220: 69 6e 65 20 5f 36 34 65 31 36 20 28 5f 36 34 65  ine _64e16 (_64e
5230: 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36 34 65  4 * _64e4 * _64e
5240: 34 20 2a 20 5f 36 34 65 34 29 0a 23 64 65 66 69  4 * _64e4).#defi
5250: 6e 65 20 5f 36 34 65 36 33 20 28 5f 36 34 65 31  ne _64e63 (_64e1
5260: 35 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f 36 34  5 * _64e16 * _64
5270: 65 31 36 20 2a 20 5f 36 34 65 31 36 29 0a 23 64  e16 * _64e16).#d
5280: 65 66 69 6e 65 20 5f 36 34 65 36 34 20 28 5f 36  efine _64e64 (_6
5290: 34 65 31 36 20 2a 20 5f 36 34 65 31 36 20 2a 20  4e16 * _64e16 * 
52a0: 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 29  _64e16 * _64e16)
52b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
52c0: 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
52d0: 63 6f 6e 76 65 72 74 73 20 61 20 64 6f 75 62 6c  converts a doubl
52e0: 65 2d 70 72 65 63 69 73 69 6f 6e 20 66 6c 6f 61  e-precision floa
52f0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting point.** nu
5300: 6d 62 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  mber into a stri
5310: 6e 67 2e 20 20 54 68 65 20 72 65 73 75 6c 74 69  ng.  The resulti
5320: 6e 67 20 73 74 72 69 6e 67 20 68 61 73 20 74 68  ng string has th
5330: 65 20 70 72 6f 70 65 72 74 79 20 74 68 61 74 0a  e property that.
5340: 2a 2a 20 74 77 6f 20 73 75 63 68 20 73 74 72 69  ** two such stri
5350: 6e 67 73 20 63 6f 6d 70 61 72 69 65 64 20 75 73  ngs comparied us
5360: 69 6e 67 20 73 74 72 63 6d 70 28 29 20 6f 72 20  ing strcmp() or 
5370: 6d 65 6d 63 6d 70 28 29 20 77 69 6c 6c 20 67 69  memcmp() will gi
5380: 76 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72  ve the.** same r
5390: 65 73 75 6c 74 73 20 61 73 20 61 20 6e 75 6d 65  esults as a nume
53a0: 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  ric comparison o
53b0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
53c0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
53d0: 20 6e 75 6d 62 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   numbers..**.** 
53e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
53f0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
5400: 20 64 61 74 61 62 61 73 65 20 6b 65 79 73 20 66   database keys f
5410: 72 6f 6d 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  rom floating poi
5420: 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 73 75  nt.** numbers su
5430: 63 68 20 74 68 61 74 20 74 68 65 20 6b 65 79 73  ch that the keys
5440: 20 73 6f 72 74 20 69 6e 20 74 68 65 20 73 61 6d   sort in the sam
5450: 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20 6f  e order as the o
5460: 72 69 67 69 6e 61 6c 0a 2a 2a 20 66 6c 6f 61 74  riginal.** float
5470: 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
5480: 73 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  s even though th
5490: 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6d 70 61  e keys are compa
54a0: 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 6d 65 6d  red using.** mem
54b0: 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cmp()..**.** The
54c0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
54d0: 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  n should have al
54e0: 6c 6f 63 61 74 65 64 20 61 74 20 6c 65 61 73 74  located at least
54f0: 20 31 34 20 63 68 61 72 61 63 74 65 72 73 0a 2a   14 characters.*
5500: 2a 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  * of space for t
5510: 68 65 20 62 75 66 66 65 72 20 7a 5b 5d 2e 0a 2a  he buffer z[]..*
5520: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65 61  /.void sqliteRea
5530: 6c 54 6f 53 6f 72 74 61 62 6c 65 28 64 6f 75 62  lToSortable(doub
5540: 6c 65 20 72 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  le r, char *z){.
5550: 20 20 69 6e 74 20 6e 65 67 3b 0a 20 20 69 6e 74    int neg;.  int
5560: 20 65 78 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20   exp;.  int cnt 
5570: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
5580: 61 72 72 61 79 20 6d 61 70 73 20 69 6e 74 65 67  array maps integ
5590: 65 72 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ers between 0 an
55a0: 64 20 36 33 20 69 6e 74 6f 20 62 61 73 65 2d 36  d 63 into base-6
55b0: 34 20 64 69 67 69 74 73 2e 0a 20 20 2a 2a 20 54  4 digits..  ** T
55c0: 68 65 20 64 69 67 69 74 73 20 6d 75 73 74 20 62  he digits must b
55d0: 65 20 63 68 6f 73 65 6e 20 73 75 63 68 20 61 74  e chosen such at
55e0: 20 74 68 65 69 72 20 41 53 43 49 49 20 63 6f 64   their ASCII cod
55f0: 65 73 20 61 72 65 20 69 6e 63 72 65 61 73 69 6e  es are increasin
5600: 67 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6d 65 61  g..  ** This mea
5610: 6e 73 20 77 65 20 63 61 6e 20 6e 6f 74 20 75 73  ns we can not us
5620: 65 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61  e the traditiona
5630: 6c 20 62 61 73 65 2d 36 34 20 64 69 67 69 74 20  l base-64 digit 
5640: 73 65 74 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  set. */.  static
5650: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 69 67   const char zDig
5660: 69 74 5b 5d 20 3d 20 0a 20 20 20 20 20 22 30 31  it[] = .     "01
5670: 32 33 34 35 36 37 38 39 22 0a 20 20 20 20 20 22  23456789".     "
5680: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
5690: 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
56a0: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
56b0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
56c0: 20 20 20 22 7c 7e 22 3b 0a 20 20 69 66 28 20 72     "|~";.  if( r
56d0: 3c 30 2e 30 20 29 7b 0a 20 20 20 20 6e 65 67 20  <0.0 ){.    neg 
56e0: 3d 20 31 3b 0a 20 20 20 20 72 20 3d 20 2d 72 3b  = 1;.    r = -r;
56f0: 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 2d 27 3b  .    *z++ = '-';
5700: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
5710: 6e 65 67 20 3d 20 30 3b 0a 20 20 20 20 2a 7a 2b  neg = 0;.    *z+
5720: 2b 20 3d 20 27 30 27 3b 0a 20 20 7d 0a 20 20 65  + = '0';.  }.  e
5730: 78 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  xp = 0;..  if( r
5740: 3d 3d 30 2e 30 20 29 7b 0a 20 20 20 20 65 78 70  ==0.0 ){.    exp
5750: 20 3d 20 2d 31 30 32 34 3b 0a 20 20 7d 65 6c 73   = -1024;.  }els
5760: 65 20 69 66 28 20 72 3c 28 30 2e 35 2f 36 34 2e  e if( r<(0.5/64.
5770: 30 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  0) ){.    while(
5780: 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 36 34 20   r < 0.5/_64e64 
5790: 26 26 20 65 78 70 20 3e 20 2d 39 36 31 20 20 29  && exp > -961  )
57a0: 7b 20 72 20 2a 3d 20 5f 36 34 65 36 34 3b 20 20  { r *= _64e64;  
57b0: 65 78 70 20 2d 3d 20 36 34 3b 20 7d 0a 20 20 20  exp -= 64; }.   
57c0: 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f   while( r < 0.5/
57d0: 5f 36 34 65 31 36 20 26 26 20 65 78 70 20 3e 20  _64e16 && exp > 
57e0: 2d 31 30 30 39 20 29 7b 20 72 20 2a 3d 20 5f 36  -1009 ){ r *= _6
57f0: 34 65 31 36 3b 20 20 65 78 70 20 2d 3d 20 31 36  4e16;  exp -= 16
5800: 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72  ; }.    while( r
5810: 20 3c 20 30 2e 35 2f 5f 36 34 65 34 20 20 26 26   < 0.5/_64e4  &&
5820: 20 65 78 70 20 3e 20 2d 31 30 32 31 20 29 7b 20   exp > -1021 ){ 
5830: 72 20 2a 3d 20 5f 36 34 65 34 3b 20 20 20 65 78  r *= _64e4;   ex
5840: 70 20 2d 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68  p -= 4; }.    wh
5850: 69 6c 65 28 20 72 20 3c 20 30 2e 35 2f 36 34 2e  ile( r < 0.5/64.
5860: 30 20 20 20 26 26 20 65 78 70 20 3e 20 2d 31 30  0   && exp > -10
5870: 32 34 20 29 7b 20 72 20 2a 3d 20 36 34 2e 30 3b  24 ){ r *= 64.0;
5880: 20 20 20 20 65 78 70 20 2d 3d 20 31 3b 20 7d 0a      exp -= 1; }.
5890: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 3e 3d 30    }else if( r>=0
58a0: 2e 35 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  .5 ){.    while(
58b0: 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34 65 36 33   r >= 0.5*_64e63
58c0: 20 26 26 20 65 78 70 20 3c 20 39 36 30 20 20 29   && exp < 960  )
58d0: 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36 34 65 36  { r *= 1.0/_64e6
58e0: 34 3b 20 65 78 70 20 2b 3d 20 36 34 3b 20 7d 0a  4; exp += 64; }.
58f0: 20 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d 20      while( r >= 
5900: 30 2e 35 2a 5f 36 34 65 31 35 20 26 26 20 65 78  0.5*_64e15 && ex
5910: 70 20 3c 20 31 30 30 38 20 29 7b 20 72 20 2a 3d  p < 1008 ){ r *=
5920: 20 31 2e 30 2f 5f 36 34 65 31 36 3b 20 65 78 70   1.0/_64e16; exp
5930: 20 2b 3d 20 31 36 3b 20 7d 0a 20 20 20 20 77 68   += 16; }.    wh
5940: 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36  ile( r >= 0.5*_6
5950: 34 65 33 20 20 26 26 20 65 78 70 20 3c 20 31 30  4e3  && exp < 10
5960: 32 30 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f  20 ){ r *= 1.0/_
5970: 36 34 65 34 3b 20 20 65 78 70 20 2b 3d 20 34 3b  64e4;  exp += 4;
5980: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20   }.    while( r 
5990: 3e 3d 20 30 2e 35 20 20 20 20 20 20 20 20 26 26  >= 0.5        &&
59a0: 20 65 78 70 20 3c 20 31 30 32 33 20 29 7b 20 72   exp < 1023 ){ r
59b0: 20 2a 3d 20 31 2e 30 2f 36 34 2e 30 3b 20 20 20   *= 1.0/64.0;   
59c0: 65 78 70 20 2b 3d 20 31 3b 20 7d 0a 20 20 7d 0a  exp += 1; }.  }.
59d0: 20 20 69 66 28 20 6e 65 67 20 29 7b 0a 20 20 20    if( neg ){.   
59e0: 20 65 78 70 20 3d 20 2d 65 78 70 3b 0a 20 20 20   exp = -exp;.   
59f0: 20 72 20 3d 20 2d 72 3b 0a 20 20 7d 0a 20 20 65   r = -r;.  }.  e
5a00: 78 70 20 2b 3d 20 31 30 32 34 3b 0a 20 20 72 20  xp += 1024;.  r 
5a10: 2b 3d 20 30 2e 35 3b 0a 20 20 69 66 28 20 65 78  += 0.5;.  if( ex
5a20: 70 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<0 ) return;.  
5a30: 69 66 28 20 65 78 70 3e 3d 32 30 34 38 20 7c 7c  if( exp>=2048 ||
5a40: 20 72 3e 3d 31 2e 30 20 29 7b 0a 20 20 20 20 73   r>=1.0 ){.    s
5a50: 74 72 63 70 79 28 7a 2c 20 22 7e 7e 7e 7e 7e 7e  trcpy(z, "~~~~~~
5a60: 7e 7e 7e 7e 7e 7e 22 29 3b 0a 20 20 20 20 72 65  ~~~~~~");.    re
5a70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2a 7a 2b 2b  turn;.  }.  *z++
5a80: 20 3d 20 7a 44 69 67 69 74 5b 28 65 78 70 3e 3e   = zDigit[(exp>>
5a90: 36 29 26 30 78 33 66 5d 3b 0a 20 20 2a 7a 2b 2b  6)&0x3f];.  *z++
5aa0: 20 3d 20 7a 44 69 67 69 74 5b 65 78 70 20 26 20   = zDigit[exp & 
5ab0: 30 78 33 66 5d 3b 0a 20 20 77 68 69 6c 65 28 20  0x3f];.  while( 
5ac0: 72 3e 30 2e 30 20 26 26 20 63 6e 74 3c 31 30 20  r>0.0 && cnt<10 
5ad0: 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 67 69 74  ){.    int digit
5ae0: 3b 0a 20 20 20 20 72 20 2a 3d 20 36 34 2e 30 3b  ;.    r *= 64.0;
5af0: 0a 20 20 20 20 64 69 67 69 74 20 3d 20 28 69 6e  .    digit = (in
5b00: 74 29 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t)r;.    assert(
5b10: 20 64 69 67 69 74 3e 3d 30 20 26 26 20 64 69 67   digit>=0 && dig
5b20: 69 74 3c 36 34 20 29 3b 0a 20 20 20 20 2a 7a 2b  it<64 );.    *z+
5b30: 2b 20 3d 20 7a 44 69 67 69 74 5b 64 69 67 69 74  + = zDigit[digit
5b40: 20 26 20 30 78 33 66 5d 3b 0a 20 20 20 20 72 20   & 0x3f];.    r 
5b50: 2d 3d 20 64 69 67 69 74 3b 0a 20 20 20 20 63 6e  -= digit;.    cn
5b60: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 7a 20 3d 20  t++;.  }.  *z = 
5b70: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
5b80: 49 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20 58  ITE_UTF8./*.** X
5b90: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
5ba0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
5bb0: 6f 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61  of a UTF-8 chara
5bc0: 63 74 65 72 2e 20 20 49 6e 63 72 65 6d 65 6e 74  cter.  Increment
5bd0: 0a 2a 2a 20 58 20 73 6f 20 74 68 61 74 20 69 74  .** X so that it
5be0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
5bf0: 65 78 74 20 63 68 61 72 61 63 74 65 72 2e 20 20  ext character.  
5c00: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
5c10: 72 69 67 68 74 0a 2a 2a 20 69 66 20 58 20 70 6f  right.** if X po
5c20: 69 6e 74 73 20 74 6f 20 61 20 77 65 6c 6c 2d 66  ints to a well-f
5c30: 6f 72 6d 65 64 20 55 54 46 2d 38 20 73 74 72 69  ormed UTF-8 stri
5c40: 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  ng..*/.#define s
5c50: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58 29  qliteNextChar(X)
5c60: 20 20 77 68 69 6c 65 28 20 28 30 78 63 30 26 2a    while( (0xc0&*
5c70: 2b 2b 28 58 29 29 3d 3d 30 78 38 30 20 29 7b 7d  ++(X))==0x80 ){}
5c80: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 43  .#define sqliteC
5c90: 68 61 72 56 61 6c 28 58 29 20 20 20 73 71 6c 69  harVal(X)   sqli
5ca0: 74 65 5f 75 74 66 38 5f 74 6f 5f 69 6e 74 28 58  te_utf8_to_int(X
5cb0: 29 0a 0a 23 65 6c 73 65 20 2f 2a 20 21 64 65 66  )..#else /* !def
5cc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38  ined(SQLITE_UTF8
5cd0: 29 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 69  ) */./*.** For i
5ce0: 73 6f 38 38 35 39 20 65 6e 63 6f 64 69 6e 67 2c  so8859 encoding,
5cf0: 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61 63   the next charac
5d00: 74 65 72 20 69 73 20 6a 75 73 74 20 74 68 65 20  ter is just the 
5d10: 6e 65 78 74 20 62 79 74 65 2e 0a 2a 2f 0a 23 64  next byte..*/.#d
5d20: 65 66 69 6e 65 20 73 71 6c 69 74 65 4e 65 78 74  efine sqliteNext
5d30: 43 68 61 72 28 58 29 20 20 28 2b 2b 28 58 29 29  Char(X)  (++(X))
5d40: 3b 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  ;.#define sqlite
5d50: 43 68 61 72 56 61 6c 28 58 29 20 20 20 28 28 69  CharVal(X)   ((i
5d60: 6e 74 29 2a 28 58 29 29 0a 0a 23 65 6e 64 69 66  nt)*(X))..#endif
5d70: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
5d80: 54 45 5f 55 54 46 38 29 20 2a 2f 0a 0a 0a 23 69  TE_UTF8) */...#i
5d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54 46 38  fdef SQLITE_UTF8
5da0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
5db0: 68 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  he UTF-8 charact
5dc0: 65 72 20 74 6f 20 77 68 69 63 68 20 7a 20 70 6f  er to which z po
5dd0: 69 6e 74 73 20 69 6e 74 6f 20 61 20 33 31 2d 62  ints into a 31-b
5de0: 69 74 0a 2a 2a 20 55 43 53 20 63 68 61 72 61 63  it.** UCS charac
5df0: 74 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ter.  This only 
5e00: 77 6f 72 6b 73 20 72 69 67 68 74 20 69 66 20 7a  works right if z
5e10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 65 6c   points to a wel
5e20: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55 54 46 2d  l-formed.** UTF-
5e30: 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  8 string..*/.sta
5e40: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 75  tic int sqlite_u
5e50: 74 66 38 5f 74 6f 5f 69 6e 74 28 63 6f 6e 73 74  tf8_to_int(const
5e60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5e70: 7a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 73  z){.  int c;.  s
5e80: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
5e90: 69 6e 69 74 56 61 6c 5b 5d 20 3d 20 7b 0a 20 20  initVal[] = {.  
5ea0: 20 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32 2c      0,   1,   2,
5eb0: 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20     3,   4,   5, 
5ec0: 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20 20    6,   7,   8,  
5ed0: 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20 31   9,  10,  11,  1
5ee0: 32 2c 20 20 31 33 2c 20 20 31 34 2c 0a 20 20 20  2,  13,  14,.   
5ef0: 20 20 31 35 2c 20 20 31 36 2c 20 20 31 37 2c 20    15,  16,  17, 
5f00: 20 31 38 2c 20 20 31 39 2c 20 20 32 30 2c 20 20   18,  19,  20,  
5f10: 32 31 2c 20 20 32 32 2c 20 20 32 33 2c 20 20 32  21,  22,  23,  2
5f20: 34 2c 20 20 32 35 2c 20 20 32 36 2c 20 20 32 37  4,  25,  26,  27
5f30: 2c 20 20 32 38 2c 20 20 32 39 2c 0a 20 20 20 20  ,  28,  29,.    
5f40: 20 33 30 2c 20 20 33 31 2c 20 20 33 32 2c 20 20   30,  31,  32,  
5f50: 33 33 2c 20 20 33 34 2c 20 20 33 35 2c 20 20 33  33,  34,  35,  3
5f60: 36 2c 20 20 33 37 2c 20 20 33 38 2c 20 20 33 39  6,  37,  38,  39
5f70: 2c 20 20 34 30 2c 20 20 34 31 2c 20 20 34 32 2c  ,  40,  41,  42,
5f80: 20 20 34 33 2c 20 20 34 34 2c 0a 20 20 20 20 20    43,  44,.     
5f90: 34 35 2c 20 20 34 36 2c 20 20 34 37 2c 20 20 34  45,  46,  47,  4
5fa0: 38 2c 20 20 34 39 2c 20 20 35 30 2c 20 20 35 31  8,  49,  50,  51
5fb0: 2c 20 20 35 32 2c 20 20 35 33 2c 20 20 35 34 2c  ,  52,  53,  54,
5fc0: 20 20 35 35 2c 20 20 35 36 2c 20 20 35 37 2c 20    55,  56,  57, 
5fd0: 20 35 38 2c 20 20 35 39 2c 0a 20 20 20 20 20 36   58,  59,.     6
5fe0: 30 2c 20 20 36 31 2c 20 20 36 32 2c 20 20 36 33  0,  61,  62,  63
5ff0: 2c 20 20 36 34 2c 20 20 36 35 2c 20 20 36 36 2c  ,  64,  65,  66,
6000: 20 20 36 37 2c 20 20 36 38 2c 20 20 36 39 2c 20    67,  68,  69, 
6010: 20 37 30 2c 20 20 37 31 2c 20 20 37 32 2c 20 20   70,  71,  72,  
6020: 37 33 2c 20 20 37 34 2c 0a 20 20 20 20 20 37 35  73,  74,.     75
6030: 2c 20 20 37 36 2c 20 20 37 37 2c 20 20 37 38 2c  ,  76,  77,  78,
6040: 20 20 37 39 2c 20 20 38 30 2c 20 20 38 31 2c 20    79,  80,  81, 
6050: 20 38 32 2c 20 20 38 33 2c 20 20 38 34 2c 20 20   82,  83,  84,  
6060: 38 35 2c 20 20 38 36 2c 20 20 38 37 2c 20 20 38  85,  86,  87,  8
6070: 38 2c 20 20 38 39 2c 0a 20 20 20 20 20 39 30 2c  8,  89,.     90,
6080: 20 20 39 31 2c 20 20 39 32 2c 20 20 39 33 2c 20    91,  92,  93, 
6090: 20 39 34 2c 20 20 39 35 2c 20 20 39 36 2c 20 20   94,  95,  96,  
60a0: 39 37 2c 20 20 39 38 2c 20 20 39 39 2c 20 31 30  97,  98,  99, 10
60b0: 30 2c 20 31 30 31 2c 20 31 30 32 2c 20 31 30 33  0, 101, 102, 103
60c0: 2c 20 31 30 34 2c 0a 20 20 20 20 31 30 35 2c 20  , 104,.    105, 
60d0: 31 30 36 2c 20 31 30 37 2c 20 31 30 38 2c 20 31  106, 107, 108, 1
60e0: 30 39 2c 20 31 31 30 2c 20 31 31 31 2c 20 31 31  09, 110, 111, 11
60f0: 32 2c 20 31 31 33 2c 20 31 31 34 2c 20 31 31 35  2, 113, 114, 115
6100: 2c 20 31 31 36 2c 20 31 31 37 2c 20 31 31 38 2c  , 116, 117, 118,
6110: 20 31 31 39 2c 0a 20 20 20 20 31 32 30 2c 20 31   119,.    120, 1
6120: 32 31 2c 20 31 32 32 2c 20 31 32 33 2c 20 31 32  21, 122, 123, 12
6130: 34 2c 20 31 32 35 2c 20 31 32 36 2c 20 31 32 37  4, 125, 126, 127
6140: 2c 20 31 32 38 2c 20 31 32 39 2c 20 31 33 30 2c  , 128, 129, 130,
6150: 20 31 33 31 2c 20 31 33 32 2c 20 31 33 33 2c 20   131, 132, 133, 
6160: 31 33 34 2c 0a 20 20 20 20 31 33 35 2c 20 31 33  134,.    135, 13
6170: 36 2c 20 31 33 37 2c 20 31 33 38 2c 20 31 33 39  6, 137, 138, 139
6180: 2c 20 31 34 30 2c 20 31 34 31 2c 20 31 34 32 2c  , 140, 141, 142,
6190: 20 31 34 33 2c 20 31 34 34 2c 20 31 34 35 2c 20   143, 144, 145, 
61a0: 31 34 36 2c 20 31 34 37 2c 20 31 34 38 2c 20 31  146, 147, 148, 1
61b0: 34 39 2c 0a 20 20 20 20 31 35 30 2c 20 31 35 31  49,.    150, 151
61c0: 2c 20 31 35 32 2c 20 31 35 33 2c 20 31 35 34 2c  , 152, 153, 154,
61d0: 20 31 35 35 2c 20 31 35 36 2c 20 31 35 37 2c 20   155, 156, 157, 
61e0: 31 35 38 2c 20 31 35 39 2c 20 31 36 30 2c 20 31  158, 159, 160, 1
61f0: 36 31 2c 20 31 36 32 2c 20 31 36 33 2c 20 31 36  61, 162, 163, 16
6200: 34 2c 0a 20 20 20 20 31 36 35 2c 20 31 36 36 2c  4,.    165, 166,
6210: 20 31 36 37 2c 20 31 36 38 2c 20 31 36 39 2c 20   167, 168, 169, 
6220: 31 37 30 2c 20 31 37 31 2c 20 31 37 32 2c 20 31  170, 171, 172, 1
6230: 37 33 2c 20 31 37 34 2c 20 31 37 35 2c 20 31 37  73, 174, 175, 17
6240: 36 2c 20 31 37 37 2c 20 31 37 38 2c 20 31 37 39  6, 177, 178, 179
6250: 2c 0a 20 20 20 20 31 38 30 2c 20 31 38 31 2c 20  ,.    180, 181, 
6260: 31 38 32 2c 20 31 38 33 2c 20 31 38 34 2c 20 31  182, 183, 184, 1
6270: 38 35 2c 20 31 38 36 2c 20 31 38 37 2c 20 31 38  85, 186, 187, 18
6280: 38 2c 20 31 38 39 2c 20 31 39 30 2c 20 31 39 31  8, 189, 190, 191
6290: 2c 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32 2c  ,   0,   1,   2,
62a0: 0a 20 20 20 20 20 20 33 2c 20 20 20 34 2c 20 20  .      3,   4,  
62b0: 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20   5,   6,   7,   
62c0: 38 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31 31  8,   9,  10,  11
62d0: 2c 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34 2c  ,  12,  13,  14,
62e0: 20 20 31 35 2c 20 20 31 36 2c 20 20 31 37 2c 0a    15,  16,  17,.
62f0: 20 20 20 20 20 31 38 2c 20 20 31 39 2c 20 20 32       18,  19,  2
6300: 30 2c 20 20 32 31 2c 20 20 32 32 2c 20 20 32 33  0,  21,  22,  23
6310: 2c 20 20 32 34 2c 20 20 32 35 2c 20 20 32 36 2c  ,  24,  25,  26,
6320: 20 20 32 37 2c 20 20 32 38 2c 20 20 32 39 2c 20    27,  28,  29, 
6330: 20 33 30 2c 20 20 33 31 2c 20 20 20 30 2c 0a 20   30,  31,   0,. 
6340: 20 20 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33       1,   2,   3
6350: 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c  ,   4,   5,   6,
6360: 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c 20     7,   8,   9, 
6370: 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20 20   10,  11,  12,  
6380: 31 33 2c 20 20 31 34 2c 20 20 31 35 2c 0a 20 20  13,  14,  15,.  
6390: 20 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32 2c      0,   1,   2,
63a0: 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20     3,   4,   5, 
63b0: 20 20 36 2c 20 20 20 37 2c 20 20 20 30 2c 20 20    6,   7,   0,  
63c0: 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20 20   1,   2,   3,   
63d0: 30 2c 20 20 20 31 2c 20 32 35 34 2c 0a 20 20 20  0,   1, 254,.   
63e0: 20 32 35 35 2c 0a 20 20 7d 3b 0a 20 20 63 20 3d   255,.  };.  c =
63f0: 20 69 6e 69 74 56 61 6c 5b 2a 28 7a 2b 2b 29 5d   initVal[*(z++)]
6400: 3b 0a 20 20 77 68 69 6c 65 28 20 28 30 78 63 30  ;.  while( (0xc0
6410: 26 2a 7a 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20  &*z)==0x80 ){.  
6420: 20 20 63 20 3d 20 28 63 3c 3c 36 29 20 7c 20 28    c = (c<<6) | (
6430: 30 78 33 66 26 2a 28 7a 2b 2b 29 29 3b 0a 20 20  0x3f&*(z++));.  
6440: 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
6450: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
6460: 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38 20  mpare two UTF-8 
6470: 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75 61  strings for equa
6480: 6c 69 74 79 20 77 68 65 72 65 20 74 68 65 20 66  lity where the f
6490: 69 72 73 74 20 73 74 72 69 6e 67 20 63 61 6e 0a  irst string can.
64a0: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
64b0: 65 20 61 20 22 67 6c 6f 62 22 20 65 78 70 72 65  e a "glob" expre
64c0: 73 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74  ssion.  Return t
64d0: 72 75 65 20 28 31 29 20 69 66 20 74 68 65 79 0a  rue (1) if they.
64e0: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
64f0: 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66  and false (0) if
6500: 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72   they are differ
6510: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62  ent..**.** Globb
6520: 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ing rules:.**.**
6530: 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20        '*'       
6540: 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
6550: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
6560: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e  more characters.
6570: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20  .**.**      '?' 
6580: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78        Matches ex
6590: 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63  actly one charac
65a0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ter..**.**     [
65b0: 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65  ...]      Matche
65c0: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
65d0: 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65  from the enclose
65e0: 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20  d list of.**    
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
6600: 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
6610: 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74    [^...]     Mat
6620: 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
6630: 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e  er not in the en
6640: 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a  closed list..**.
6650: 2a 2a 20 57 69 74 68 20 74 68 65 20 5b 2e 2e 2e  ** With the [...
6660: 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d 20 6d 61 74  ] and [^...] mat
6670: 63 68 69 6e 67 2c 20 61 20 27 5d 27 20 63 68 61  ching, a ']' cha
6680: 72 61 63 74 65 72 20 63 61 6e 20 62 65 20 69 6e  racter can be in
6690: 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cluded.** in the
66a0: 20 6c 69 73 74 20 62 79 20 6d 61 6b 69 6e 67 20   list by making 
66b0: 69 74 20 74 68 65 20 66 69 72 73 74 20 63 68 61  it the first cha
66c0: 72 61 63 74 65 72 20 61 66 74 65 72 20 27 5b 27  racter after '['
66d0: 20 6f 72 20 27 5e 27 2e 20 20 41 0a 2a 2a 20 72   or '^'.  A.** r
66e0: 61 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74 65  ange of characte
66f0: 72 73 20 63 61 6e 20 62 65 20 73 70 65 63 69 66  rs can be specif
6700: 69 65 64 20 75 73 69 6e 67 20 27 2d 27 2e 20 20  ied using '-'.  
6710: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 5b 61 2d  Example:.** "[a-
6720: 7a 5d 22 20 6d 61 74 63 68 65 73 20 61 6e 79 20  z]" matches any 
6730: 73 69 6e 67 6c 65 20 6c 6f 77 65 72 2d 63 61 73  single lower-cas
6740: 65 20 6c 65 74 74 65 72 2e 20 20 54 6f 20 6d 61  e letter.  To ma
6750: 74 63 68 20 61 20 27 2d 27 2c 20 6d 61 6b 65 0a  tch a '-', make.
6760: 2a 2a 20 69 74 20 74 68 65 20 6c 61 73 74 20 63  ** it the last c
6770: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
6780: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
6790: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 75 61   routine is usua
67a0: 6c 6c 79 20 71 75 69 63 6b 2c 20 62 75 74 20 63  lly quick, but c
67b0: 61 6e 20 62 65 20 4e 2a 2a 32 20 69 6e 20 74 68  an be N**2 in th
67c0: 65 20 77 6f 72 73 74 20 63 61 73 65 2e 0a 2a 2a  e worst case..**
67d0: 0a 2a 2a 20 48 69 6e 74 73 3a 20 74 6f 20 6d 61  .** Hints: to ma
67e0: 74 63 68 20 27 2a 27 20 6f 72 20 27 3f 27 2c 20  tch '*' or '?', 
67f0: 70 75 74 20 74 68 65 6d 20 69 6e 20 22 5b 5d 22  put them in "[]"
6800: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
6810: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 62 63 5b  .**         abc[
6820: 2a 5d 78 79 7a 20 20 20 20 20 20 20 20 4d 61 74  *]xyz        Mat
6830: 63 68 65 73 20 22 61 62 63 2a 78 79 7a 22 20 6f  ches "abc*xyz" o
6840: 6e 6c 79 0a 2a 2f 0a 69 6e 74 20 0a 73 71 6c 69  nly.*/.int .sqli
6850: 74 65 47 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  teGlobCompare(co
6860: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6870: 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20 63 6f 6e  r *zPattern, con
6880: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6890: 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72 65   *zString){.  re
68a0: 67 69 73 74 65 72 20 69 6e 74 20 63 3b 0a 20 20  gister int c;.  
68b0: 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
68c0: 74 20 73 65 65 6e 3b 0a 20 20 69 6e 74 20 63 32  t seen;.  int c2
68d0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
68e0: 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d 30 20 29   *zPattern)!=0 )
68f0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 20  {.    switch( c 
6900: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 2a  ){.      case '*
6910: 27 3a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ':.        while
6920: 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d  ( (c=zPattern[1]
6930: 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 20 3d 3d  ) == '*' || c ==
6940: 20 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20   '?' ){.        
6950: 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a    if( c=='?' ){.
6960: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6970: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
6980: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6990: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
69a0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
69b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69c0: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
69d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69e0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
69f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66  rn 1;.        if
6a00: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
6a10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
6a20: 74 72 69 6e 67 20 26 26 20 73 71 6c 69 74 65 47  tring && sqliteG
6a30: 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50 61 74  lobCompare(&zPat
6a40: 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29  tern[1],zString)
6a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6a60: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
6a70: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
6a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a90: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
6aa0: 67 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  g!=0;.        }e
6ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
6ac0: 68 69 6c 65 28 20 28 63 32 20 3d 20 2a 7a 53 74  hile( (c2 = *zSt
6ad0: 72 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ring)!=0 ){.    
6ae0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
6af0: 32 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20  2 != 0 && c2 != 
6b00: 63 20 29 7b 20 63 32 20 3d 20 2a 2b 2b 7a 53 74  c ){ c2 = *++zSt
6b10: 72 69 6e 67 3b 20 7d 0a 20 20 20 20 20 20 20 20  ring; }.        
6b20: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
6b30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6b40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6b50: 47 6c 6f 62 43 6f 6d 70 61 72 65 28 26 7a 50 61  GlobCompare(&zPa
6b60: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
6b70: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
6b80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6b90: 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67  NextChar(zString
6ba0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
6bb0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6bc0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6bd0: 20 20 20 63 61 73 65 20 27 3f 27 3a 20 7b 0a 20     case '?': {. 
6be0: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72         if( *zStr
6bf0: 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ing==0 ) return 
6c00: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
6c10: 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69 6e  eNextChar(zStrin
6c20: 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 61 74  g);.        zPat
6c30: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tern++;.        
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6c50: 20 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20 7b       case '[': {
6c60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 69  .        int pri
6c70: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
6c80: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
6c90: 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
6ca0: 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
6cb0: 74 65 43 68 61 72 56 61 6c 28 7a 53 74 72 69 6e  teCharVal(zStrin
6cc0: 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
6cd0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
6ce0: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 2b  .        c2 = *+
6cf0: 2b 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20  +zPattern;.     
6d00: 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29     if( c2=='^' )
6d10: 7b 20 69 6e 76 65 72 74 20 3d 20 31 3b 20 63 32  { invert = 1; c2
6d20: 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 20   = *++zPattern; 
6d30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
6d40: 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
6d50: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
6d60: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
6d70: 20 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74      c2 = *++zPat
6d80: 74 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tern;.        }.
6d90: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
6da0: 63 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56  c2 = sqliteCharV
6db0: 61 6c 28 7a 50 61 74 74 65 72 6e 29 29 21 3d 30  al(zPattern))!=0
6dc0: 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
6dd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d           if( c2=
6de0: 3d 27 2d 27 20 26 26 20 7a 50 61 74 74 65 72 6e  ='-' && zPattern
6df0: 5b 31 5d 21 3d 27 5d 27 20 26 26 20 7a 50 61 74  [1]!=']' && zPat
6e00: 74 65 72 6e 5b 31 5d 21 3d 30 20 26 26 20 70 72  tern[1]!=0 && pr
6e10: 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
6e20: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
6e30: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
6e40: 32 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56 61  2 = sqliteCharVa
6e50: 6c 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  l(zPattern);.   
6e60: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
6e70: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
6e80: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
6e90: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
6ea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
6eb0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 63 32 20  }else if( c==c2 
6ec0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6ed0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
6ee0: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
6ef0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  2;.          }el
6f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6f10: 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
6f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f30: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
6f40: 61 72 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ar(zPattern);.  
6f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f60: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
6f70: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
6f80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6f90: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
6fa0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6fb0: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
6fc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
6fe0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
6ff0: 20 69 66 28 20 63 20 21 3d 20 2a 7a 53 74 72 69   if( c != *zStri
7000: 6e 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ng ) return 0;. 
7010: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
7020: 2b 3b 0a 20 20 20 20 20 20 20 20 7a 53 74 72 69  +;.        zStri
7030: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  ng++;.        br
7040: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7050: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7060: 2a 7a 53 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a  *zString==0;.}..
7070: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
7080: 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20  o UTF-8 strings 
7090: 66 6f 72 20 65 71 75 61 6c 69 74 79 20 75 73 69  for equality usi
70a0: 6e 67 20 74 68 65 20 22 4c 49 4b 45 22 20 6f 70  ng the "LIKE" op
70b0: 65 72 61 74 6f 72 20 6f 66 0a 2a 2a 20 53 51 4c  erator of.** SQL
70c0: 2e 20 20 54 68 65 20 27 25 27 20 63 68 61 72 61  .  The '%' chara
70d0: 63 74 65 72 20 6d 61 74 63 68 65 73 20 61 6e 79  cter matches any
70e0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 30 20 6f   sequence of 0 o
70f0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 68 61 72 61 63  r more.** charac
7100: 74 65 72 73 20 61 6e 64 20 27 5f 27 20 6d 61 74  ters and '_' mat
7110: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
7120: 63 68 61 72 61 63 74 65 72 2e 20 20 43 61 73 65  character.  Case
7130: 20 69 73 0a 2a 2a 20 6e 6f 74 20 73 69 67 6e 69   is.** not signi
7140: 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ficant..**.** Th
7150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
7160: 73 74 20 61 6e 20 61 64 61 70 74 61 74 69 6f 6e  st an adaptation
7170: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 47 6c   of the sqliteGl
7180: 6f 62 43 6f 6d 70 61 72 65 28 29 0a 2a 2a 20 72  obCompare().** r
7190: 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 0a 2a 2f  outine above..*/
71a0: 0a 69 6e 74 20 0a 73 71 6c 69 74 65 4c 69 6b 65  .int .sqliteLike
71b0: 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75 6e  Compare(const un
71c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61  signed char *zPa
71d0: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73  ttern, const uns
71e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72  igned char *zStr
71f0: 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65 72  ing){.  register
7200: 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 32   int c;.  int c2
7210: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
7220: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a   UpperToLower[*z
7230: 50 61 74 74 65 72 6e 5d 29 21 3d 30 20 29 7b 0a  Pattern])!=0 ){.
7240: 20 20 20 20 73 77 69 74 63 68 28 20 63 20 29 7b      switch( c ){
7250: 0a 20 20 20 20 20 20 63 61 73 65 20 27 25 27 3a  .      case '%':
7260: 20 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   {.        while
7270: 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 31 5d  ( (c=zPattern[1]
7280: 29 20 3d 3d 20 27 25 27 20 7c 7c 20 63 20 3d 3d  ) == '%' || c ==
7290: 20 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 20 20   '_' ){.        
72a0: 20 20 69 66 28 20 63 3d 3d 27 5f 27 20 29 7b 0a    if( c=='_' ){.
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
72c0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
72d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
72e0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
72f0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
7300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7310: 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20     zPattern++;. 
7320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7330: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
7340: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 63 20  rn 1;.        c 
7350: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  = UpperToLower[c
7360: 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
7370: 28 20 28 63 32 3d 55 70 70 65 72 54 6f 4c 6f 77  ( (c2=UpperToLow
7380: 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 29 21 3d 30  er[*zString])!=0
7390: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
73a0: 69 6c 65 28 20 63 32 20 21 3d 20 30 20 26 26 20  ile( c2 != 0 && 
73b0: 63 32 20 21 3d 20 63 20 29 7b 20 63 32 20 3d 20  c2 != c ){ c2 = 
73c0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b  UpperToLower[*++
73d0: 7a 53 74 72 69 6e 67 5d 3b 20 7d 0a 20 20 20 20  zString]; }.    
73e0: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
73f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7400: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7410: 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50 61  LikeCompare(&zPa
7420: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
7430: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
7440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4e 65          sqliteNe
7450: 78 74 43 68 61 72 28 7a 53 74 72 69 6e 67 29 3b  xtChar(zString);
7460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7480: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
7490: 27 5f 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  '_': {.        i
74a0: 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29  f( *zString==0 )
74b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
74c0: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
74d0: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
74e0: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
74f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
7510: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7520: 69 66 28 20 63 20 21 3d 20 55 70 70 65 72 54 6f  if( c != UpperTo
7530: 4c 6f 77 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20  Lower[*zString] 
7540: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7550: 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a      zPattern++;.
7560: 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e 67 2b          zString+
7570: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
7580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53    }.  return *zS
75a0: 74 72 69 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  tring==0;.}../*.
75b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 71  ** Change the sq
75c0: 6c 69 74 65 2e 6d 61 67 69 63 20 66 72 6f 6d 20  lite.magic from 
75d0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
75e0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
75f0: 43 5f 42 55 53 59 2e 0a 2a 2a 20 52 65 74 75 72  C_BUSY..** Retur
7600: 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e 6f 6e 2d  n an error (non-
7610: 7a 65 72 6f 29 20 69 66 20 74 68 65 20 6d 61 67  zero) if the mag
7620: 69 63 20 77 61 73 20 6e 6f 74 20 53 51 4c 49 54  ic was not SQLIT
7630: 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 0a 2a 2a 20  E_MAGIC_OPEN.** 
7640: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
7650: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
7660: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7670: 69 73 20 61 20 61 74 74 65 6d 70 74 20 74 6f 20  is a attempt to 
7680: 64 65 74 65 63 74 20 69 66 20 74 77 6f 20 74 68  detect if two th
7690: 72 65 61 64 73 20 75 73 65 20 74 68 65 0a 2a 2a  reads use the.**
76a0: 20 73 61 6d 65 20 73 71 6c 69 74 65 2a 20 70 6f   same sqlite* po
76b0: 69 6e 74 65 72 20 61 74 20 74 68 65 20 73 61 6d  inter at the sam
76c0: 65 20 74 69 6d 65 2e 20 20 54 68 65 72 65 20 69  e time.  There i
76d0: 73 20 61 20 72 61 63 65 20 0a 2a 2a 20 63 6f 6e  s a race .** con
76e0: 64 69 74 69 6f 6e 20 73 6f 20 69 74 20 69 73 20  dition so it is 
76f0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
7700: 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 64  e error is not d
7710: 65 74 65 63 74 65 64 2e 0a 2a 2a 20 42 75 74 20  etected..** But 
7720: 75 73 75 61 6c 6c 79 20 74 68 65 20 70 72 6f 62  usually the prob
7730: 6c 65 6d 20 77 69 6c 6c 20 62 65 20 73 65 65 6e  lem will be seen
7740: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 77 69  .  The result wi
7750: 6c 6c 20 62 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  ll be an.** erro
7760: 72 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  r which can be u
7770: 73 65 64 20 74 6f 20 64 65 62 75 67 20 74 68 65  sed to debug the
7780: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68 61   application tha
7790: 74 20 69 73 0a 2a 2a 20 75 73 69 6e 67 20 53 51  t is.** using SQ
77a0: 4c 69 74 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  Lite incorrectly
77b0: 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
77c0: 32 30 32 3a 20 20 49 66 20 64 62 2d 3e 6d 61 67  202:  If db->mag
77d0: 69 63 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  ic is not a vali
77e0: 64 20 6f 70 65 6e 20 76 61 6c 75 65 2c 20 74 61  d open value, ta
77f0: 6b 65 20 63 61 72 65 20 6e 6f 74 0a 2a 2a 20 74  ke care not.** t
7800: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64 62 20  o modify the db 
7810: 73 74 72 75 63 74 75 72 65 20 61 74 20 61 6c 6c  structure at all
7820: 2e 20 20 49 74 20 63 6f 75 6c 64 20 62 65 20 74  .  It could be t
7830: 68 61 74 20 64 62 20 69 73 20 61 20 73 74 61 6c  hat db is a stal
7840: 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 20 49  e.** pointer.  I
7850: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
7860: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
7870: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
7880: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
7890: 6f 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64  o sqlite_close(d
78a0: 62 29 20 61 6e 64 20 64 62 20 68 61 73 20 62 65  b) and db has be
78b0: 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  en deallocated. 
78c0: 20 41 6e 64 20 77 65 20 64 6f 0a 2a 2a 20 6e 6f   And we do.** no
78d0: 74 20 77 61 6e 74 20 74 6f 20 77 72 69 74 65 20  t want to write 
78e0: 69 6e 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 64  into deallocated
78f0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20   memory..*/.int 
7900: 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e 28 73  sqliteSafetyOn(s
7910: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66  qlite *db){.  if
7920: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
7930: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29  ITE_MAGIC_OPEN )
7940: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
7950: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
7960: 55 53 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  USY;.    return 
7970: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  0;.  }else if( d
7980: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
7990: 5f 4d 41 47 49 43 5f 42 55 53 59 20 7c 7c 20 64  _MAGIC_BUSY || d
79a0: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
79b0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 0a 20 20 20  _MAGIC_ERROR.   
79c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d            || db-
79d0: 3e 77 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29  >want_to_close )
79e0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
79f0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
7a00: 52 52 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  RROR;.    db->fl
7a10: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
7a20: 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72  terrupt;.  }.  r
7a30: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
7a40: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 67  * Change the mag
7a50: 69 63 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 4d  ic from SQLITE_M
7a60: 41 47 49 43 5f 42 55 53 59 20 74 6f 20 53 51 4c  AGIC_BUSY to SQL
7a70: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 2e 0a  ITE_MAGIC_OPEN..
7a80: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
7a90: 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  or (non-zero) if
7aa0: 20 74 68 65 20 6d 61 67 69 63 20 77 61 73 20 6e   the magic was n
7ab0: 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ot SQLITE_MAGIC_
7ac0: 42 55 53 59 0a 2a 2a 20 77 68 65 6e 20 74 68 69  BUSY.** when thi
7ad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7ae0: 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  led..*/.int sqli
7af0: 74 65 53 61 66 65 74 79 4f 66 66 28 73 71 6c 69  teSafetyOff(sqli
7b00: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
7b10: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
7b20: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20  _MAGIC_BUSY ){. 
7b30: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
7b40: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
7b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7b60: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
7b70: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7b80: 47 49 43 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e  GIC_OPEN || db->
7b90: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7ba0: 47 49 43 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  GIC_ERROR.      
7bb0: 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 77 61         || db->wa
7bc0: 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20  nt_to_close ){. 
7bd0: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
7be0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
7bf0: 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  R;.    db->flags
7c00: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
7c10: 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rupt;.  }.  retu
7c20: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
7c30: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
7c40: 65 20 77 65 20 61 72 65 20 6e 6f 74 20 63 75 72  e we are not cur
7c50: 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
7c60: 20 61 6e 20 73 71 6c 69 74 65 5f 65 78 65 63 28   an sqlite_exec(
7c70: 29 2e 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  )..** If we are 
7c80: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 6e 20  currently in an 
7c90: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 2c 20 72  sqlite_exec(), r
7ca0: 65 74 75 72 6e 20 74 72 75 65 20 61 6e 64 20 73  eturn true and s
7cb0: 65 74 0a 2a 2a 20 73 71 6c 69 74 65 2e 6d 61 67  et.** sqlite.mag
7cc0: 69 63 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  ic to SQLITE_MAG
7cd0: 49 43 5f 45 52 52 4f 52 2e 20 20 54 68 69 73 20  IC_ERROR.  This 
7ce0: 77 69 6c 6c 20 63 61 75 73 65 20 61 20 63 6f 6d  will cause a com
7cf0: 70 6c 65 74 65 0a 2a 2a 20 73 68 75 74 64 6f 77  plete.** shutdow
7d00: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7d10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
7d20: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
7d30: 20 74 72 79 20 74 6f 20 64 65 74 65 63 74 20 77   try to detect w
7d40: 68 65 6e 20 41 50 49 20 72 6f 75 74 69 6e 65 73  hen API routines
7d50: 20 61 72 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 61   are called.** a
7d60: 74 20 74 68 65 20 77 72 6f 6e 67 20 74 69 6d 65  t the wrong time
7d70: 20 6f 72 20 69 6e 20 74 68 65 20 77 72 6f 6e 67   or in the wrong
7d80: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e   sequence..*/.in
7d90: 74 20 73 71 6c 69 74 65 53 61 66 65 74 79 43 68  t sqliteSafetyCh
7da0: 65 63 6b 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  eck(sqlite *db){
7db0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
7dc0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  !=0 ){.    db->m
7dd0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
7de0: 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  GIC_ERROR;.    r
7df0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
7e00: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.