/ Hex Artifact Content
Login

Artifact 48f1e99803e924433477a7ccbdab35663acb621d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74  ******.** Utilit
0180: 79 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  y functions used
0190: 20 74 68 72 6f 75 67 68 6f 75 74 20 73 71 6c 69   throughout sqli
01a0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
01b0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e  ile contains fun
01c0: 63 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 6f 63  ctions for alloc
01d0: 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 63 6f  ating memory, co
01e0: 6d 70 61 72 69 6e 67 0a 2a 2a 20 73 74 72 69 6e  mparing.** strin
01f0: 67 73 2c 20 61 6e 64 20 73 74 75 66 66 20 6c 69  gs, and stuff li
0200: 6b 65 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 24  ke that..**.** $
0210: 49 64 3a 20 75 74 69 6c 2e 63 2c 76 20 31 2e 37  Id: util.c,v 1.7
0220: 34 2e 32 2e 31 20 32 30 30 34 2f 30 37 2f 31 35  4.2.1 2004/07/15
0230: 20 31 33 3a 30 38 3a 34 31 20 64 72 68 20 45 78   13:08:41 drh Ex
0240: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0250: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0260: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
0270: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  >.#include <ctyp
0280: 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 6d  e.h>../*.** If m
0290: 61 6c 6c 6f 63 28 29 20 65 76 65 72 20 66 61 69  alloc() ever fai
02a0: 6c 73 2c 20 74 68 69 73 20 67 6c 6f 62 61 6c 20  ls, this global 
02b0: 76 61 72 69 61 62 6c 65 20 67 65 74 73 20 73 65  variable gets se
02c0: 74 20 74 6f 20 31 2e 0a 2a 2a 20 54 68 69 73 20  t to 1..** This 
02d0: 63 61 75 73 65 73 20 74 68 65 20 6c 69 62 72 61  causes the libra
02e0: 72 79 20 74 6f 20 61 62 6f 72 74 20 61 6e 64 20  ry to abort and 
02f0: 6e 65 76 65 72 20 61 67 61 69 6e 20 66 75 6e 63  never again func
0300: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0310: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
0320: 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  d = 0;../*.** If
0330: 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 20 69 73   MEMORY_DEBUG is
0340: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 75   defined, then u
0350: 73 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d  se versions of m
0360: 61 6c 6c 6f 63 28 29 20 61 6e 64 0a 2a 2a 20 66  alloc() and.** f
0370: 72 65 65 28 29 20 74 68 61 74 20 74 72 61 63 6b  ree() that track
0380: 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 20 61 6e   memory usage an
0390: 64 20 63 68 65 63 6b 20 66 6f 72 20 62 75 66 66  d check for buff
03a0: 65 72 20 6f 76 65 72 72 75 6e 73 2e 0a 2a 2f 0a  er overruns..*/.
03b0: 23 69 66 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45  #ifdef MEMORY_DE
03c0: 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 6b  BUG../*.** For k
03d0: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
03e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
03f0: 6c 6c 6f 63 73 20 61 6e 64 20 66 72 65 65 73 2e  llocs and frees.
0400: 20 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73     This.** is us
0410: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
0420: 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 2e 0a 2a 2f  memory leaks..*/
0430: 0a 69 6e 74 20 73 71 6c 69 74 65 5f 6e 4d 61 6c  .int sqlite_nMal
0440: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
0450: 4e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65  Number of sqlite
0460: 4d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73 20 2a  Malloc() calls *
0470: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 6e 46 72  /.int sqlite_nFr
0480: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee;           /*
0490: 20 4e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74   Number of sqlit
04a0: 65 46 72 65 65 28 29 20 63 61 6c 6c 73 20 2a 2f  eFree() calls */
04b0: 0a 69 6e 74 20 73 71 6c 69 74 65 5f 69 4d 61 6c  .int sqlite_iMal
04c0: 6c 6f 63 46 61 69 6c 3b 20 20 20 20 20 2f 2a 20  locFail;     /* 
04d0: 46 61 69 6c 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Fail sqliteMallo
04e0: 63 28 29 20 61 66 74 65 72 20 74 68 69 73 20 6d  c() after this m
04f0: 61 6e 79 20 63 61 6c 6c 73 20 2a 2f 0a 23 69 66  any calls */.#if
0500: 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a   MEMORY_DEBUG>1.
0510: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 63 6e  static int memcn
0520: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
0530: 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 33  *.** Number of 3
0540: 32 2d 62 69 74 20 67 75 61 72 64 20 77 6f 72 64  2-bit guard word
0550: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 47  s.*/.#define N_G
0560: 55 41 52 44 20 31 0a 0a 2f 2a 0a 2a 2a 20 41 6c  UARD 1../*.** Al
0570: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
0580: 79 20 61 6e 64 20 73 65 74 20 69 74 20 74 6f 20  y and set it to 
0590: 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55  zero.  Return NU
05a0: 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f  LL if.** no memo
05b0: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ry is available.
05c0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
05d0: 4d 61 6c 6c 6f 63 5f 28 69 6e 74 20 6e 2c 20 69  Malloc_(int n, i
05e0: 6e 74 20 62 5a 65 72 6f 2c 20 63 68 61 72 20 2a  nt bZero, char *
05f0: 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29  zFile, int line)
0600: 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69  {.  void *p;.  i
0610: 6e 74 20 2a 70 69 3b 0a 20 20 69 6e 74 20 69 2c  nt *pi;.  int i,
0620: 20 6b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   k;.  if( sqlite
0630: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 3d 30 20  _iMallocFail>=0 
0640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69 4d  ){.    sqlite_iM
0650: 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b 0a 20 20 20  allocFail--;.   
0660: 20 69 66 28 20 73 71 6c 69 74 65 5f 69 4d 61 6c   if( sqlite_iMal
0670: 6c 6f 63 46 61 69 6c 3d 3d 30 20 29 7b 0a 20 20  locFail==0 ){.  
0680: 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f      sqlite_mallo
0690: 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 23 69 66 20  c_failed++;.#if 
06a0: 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20  MEMORY_DEBUG>1. 
06b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
06c0: 65 72 72 2c 22 2a 2a 2a 2a 20 66 61 69 6c 65 64  err,"**** failed
06d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 64 20   to allocate %d 
06e0: 62 79 74 65 73 20 61 74 20 25 73 3a 25 64 5c 6e  bytes at %s:%d\n
06f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
0700: 20 6e 2c 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b   n, zFile,line);
0710: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71  .#endif.      sq
0720: 6c 69 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  lite_iMallocFail
0730: 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  --;.      return
0740: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0750: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
0760: 6e 20 30 3b 0a 20 20 6b 20 3d 20 28 6e 2b 73 69  n 0;.  k = (n+si
0770: 7a 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a  zeof(int)-1)/siz
0780: 65 6f 66 28 69 6e 74 29 3b 0a 20 20 70 69 20 3d  eof(int);.  pi =
0790: 20 6d 61 6c 6c 6f 63 28 20 28 4e 5f 47 55 41 52   malloc( (N_GUAR
07a0: 44 2a 32 2b 31 2b 6b 29 2a 73 69 7a 65 6f 66 28  D*2+1+k)*sizeof(
07b0: 69 6e 74 29 29 3b 0a 20 20 69 66 28 20 70 69 3d  int));.  if( pi=
07c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
07d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b  _malloc_failed++
07e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
07f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 5f 6e 4d 61    }.  sqlite_nMa
0800: 6c 6c 6f 63 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  lloc++;.  for(i=
0810: 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b  0; i<N_GUARD; i+
0820: 2b 29 20 70 69 5b 69 5d 20 3d 20 30 78 64 65 61  +) pi[i] = 0xdea
0830: 64 31 31 32 32 3b 0a 20 20 70 69 5b 4e 5f 47 55  d1122;.  pi[N_GU
0840: 41 52 44 5d 20 3d 20 6e 3b 0a 20 20 66 6f 72 28  ARD] = n;.  for(
0850: 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20  i=0; i<N_GUARD; 
0860: 69 2b 2b 29 20 70 69 5b 6b 2b 31 2b 4e 5f 47 55  i++) pi[k+1+N_GU
0870: 41 52 44 2b 69 5d 20 3d 20 30 78 64 65 61 64 33  ARD+i] = 0xdead3
0880: 33 34 34 3b 0a 20 20 70 20 3d 20 26 70 69 5b 4e  344;.  p = &pi[N
0890: 5f 47 55 41 52 44 2b 31 5d 3b 0a 20 20 6d 65 6d  _GUARD+1];.  mem
08a0: 73 65 74 28 70 2c 20 62 5a 65 72 6f 3d 3d 30 2c  set(p, bZero==0,
08b0: 20 6e 29 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f   n);.#if MEMORY_
08c0: 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74  DEBUG>1.  fprint
08d0: 66 28 73 74 64 65 72 72 2c 22 25 30 36 64 20 6d  f(stderr,"%06d m
08e0: 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 20 61  alloc %d bytes a
08f0: 74 20 30 78 25 78 20 66 72 6f 6d 20 25 73 3a 25  t 0x%x from %s:%
0900: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 2b 2b 6d 65  d\n",.      ++me
0910: 6d 63 6e 74 2c 20 6e 2c 20 28 69 6e 74 29 70 2c  mcnt, n, (int)p,
0920: 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65   zFile,line);.#e
0930: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b  ndif.  return p;
0940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0950: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
0960: 76 65 6e 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ven pointer was 
0970: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
0980: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  liteMalloc().** 
0990: 61 6e 64 20 69 73 20 61 62 6c 65 20 74 6f 20 68  and is able to h
09a0: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 4e 20 62  old at least N b
09b0: 79 74 65 73 2e 20 20 52 61 69 73 65 20 61 6e 20  ytes.  Raise an 
09c0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
09d0: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
09e0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
09f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
0a00: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
0a10: 70 6f 73 65 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  poses only..*/.v
0a20: 6f 69 64 20 73 71 6c 69 74 65 43 68 65 63 6b 4d  oid sqliteCheckM
0a30: 65 6d 6f 72 79 28 76 6f 69 64 20 2a 70 2c 20 69  emory(void *p, i
0a40: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 2a 70 69  nt N){.  int *pi
0a50: 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 2c 20 69   = p;.  int n, i
0a60: 2c 20 6b 3b 0a 20 20 70 69 20 2d 3d 20 4e 5f 47  , k;.  pi -= N_G
0a70: 55 41 52 44 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  UARD+1;.  for(i=
0a80: 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b  0; i<N_GUARD; i+
0a90: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
0aa0: 70 69 5b 69 5d 3d 3d 30 78 64 65 61 64 31 31 32  pi[i]==0xdead112
0ab0: 32 20 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 70  2 );.  }.  n = p
0ac0: 69 5b 4e 5f 47 55 41 52 44 5d 3b 0a 20 20 61 73  i[N_GUARD];.  as
0ad0: 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c  sert( N>=0 && N<
0ae0: 6e 20 29 3b 0a 20 20 6b 20 3d 20 28 6e 2b 73 69  n );.  k = (n+si
0af0: 7a 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a  zeof(int)-1)/siz
0b00: 65 6f 66 28 69 6e 74 29 3b 0a 20 20 66 6f 72 28  eof(int);.  for(
0b10: 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20  i=0; i<N_GUARD; 
0b20: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
0b30: 28 20 70 69 5b 6b 2b 4e 5f 47 55 41 52 44 2b 31  ( pi[k+N_GUARD+1
0b40: 2b 69 5d 3d 3d 30 78 64 65 61 64 33 33 34 34 20  +i]==0xdead3344 
0b50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0b60: 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  Free memory prev
0b70: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
0b80: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
0b90: 63 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c().*/.void sqli
0ba0: 74 65 46 72 65 65 5f 28 76 6f 69 64 20 2a 70 2c  teFree_(void *p,
0bb0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
0bc0: 74 20 6c 69 6e 65 29 7b 0a 20 20 69 66 28 20 70  t line){.  if( p
0bd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 2a 70 69 2c   ){.    int *pi,
0be0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 20 20 70 69   i, k, n;.    pi
0bf0: 20 3d 20 70 3b 0a 20 20 20 20 70 69 20 2d 3d 20   = p;.    pi -= 
0c00: 4e 5f 47 55 41 52 44 2b 31 3b 0a 20 20 20 20 73  N_GUARD+1;.    s
0c10: 71 6c 69 74 65 5f 6e 46 72 65 65 2b 2b 3b 0a 20  qlite_nFree++;. 
0c20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
0c30: 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20  GUARD; i++){.   
0c40: 20 20 20 69 66 28 20 70 69 5b 69 5d 21 3d 30 78     if( pi[i]!=0x
0c50: 64 65 61 64 31 31 32 32 20 29 7b 0a 20 20 20 20  dead1122 ){.    
0c60: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
0c70: 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d 65 6d 6f  rr,"Low-end memo
0c80: 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  ry corruption at
0c90: 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70   0x%x\n", (int)p
0ca0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
0cb0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
0cc0: 0a 20 20 20 20 6e 20 3d 20 70 69 5b 4e 5f 47 55  .    n = pi[N_GU
0cd0: 41 52 44 5d 3b 0a 20 20 20 20 6b 20 3d 20 28 6e  ARD];.    k = (n
0ce0: 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d 31 29 2f  +sizeof(int)-1)/
0cf0: 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20  sizeof(int);.   
0d00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 47 55   for(i=0; i<N_GU
0d10: 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ARD; i++){.     
0d20: 20 69 66 28 20 70 69 5b 6b 2b 4e 5f 47 55 41 52   if( pi[k+N_GUAR
0d30: 44 2b 31 2b 69 5d 21 3d 30 78 64 65 61 64 33 33  D+1+i]!=0xdead33
0d40: 34 34 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  44 ){.        fp
0d50: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 48 69  rintf(stderr,"Hi
0d60: 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f  gh-end memory co
0d70: 72 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25 78  rruption at 0x%x
0d80: 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20 20  \n", (int)p);.  
0d90: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
0da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0db0: 6d 65 6d 73 65 74 28 70 69 2c 20 30 78 66 66 2c  memset(pi, 0xff,
0dc0: 20 28 6b 2b 4e 5f 47 55 41 52 44 2a 32 2b 31 29   (k+N_GUARD*2+1)
0dd0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 23  *sizeof(int));.#
0de0: 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e  if MEMORY_DEBUG>
0df0: 31 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  1.    fprintf(st
0e00: 64 65 72 72 2c 22 25 30 36 64 20 66 72 65 65 20  derr,"%06d free 
0e10: 25 64 20 62 79 74 65 73 20 61 74 20 30 78 25 78  %d bytes at 0x%x
0e20: 20 66 72 6f 6d 20 25 73 3a 25 64 5c 6e 22 2c 0a   from %s:%d\n",.
0e30: 20 20 20 20 20 20 20 20 20 2b 2b 6d 65 6d 63 6e           ++memcn
0e40: 74 2c 20 6e 2c 20 28 69 6e 74 29 70 2c 20 7a 46  t, n, (int)p, zF
0e50: 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65 6e 64 69  ile,line);.#endi
0e60: 66 0a 20 20 20 20 66 72 65 65 28 70 69 29 3b 0a  f.    free(pi);.
0e70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
0e80: 69 7a 65 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f  ize a prior allo
0e90: 63 61 74 69 6f 6e 2e 20 20 49 66 20 70 3d 3d 30  cation.  If p==0
0ea0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
0eb0: 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73  ine.** works jus
0ec0: 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 4d 61 6c  t like sqliteMal
0ed0: 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d 3d 30 2c  loc().  If n==0,
0ee0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
0ef0: 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a 75 73 74  ne.** works just
0f00: 20 6c 69 6b 65 20 73 71 6c 69 74 65 46 72 65 65   like sqliteFree
0f10: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ()..*/.void *sql
0f20: 69 74 65 52 65 61 6c 6c 6f 63 5f 28 76 6f 69 64  iteRealloc_(void
0f30: 20 2a 6f 6c 64 50 2c 20 69 6e 74 20 6e 2c 20 63   *oldP, int n, c
0f40: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
0f50: 6c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 2a 6f 6c  line){.  int *ol
0f60: 64 50 69 2c 20 2a 70 69 2c 20 69 2c 20 6b 2c 20  dPi, *pi, i, k, 
0f70: 6f 6c 64 4e 2c 20 6f 6c 64 4b 3b 0a 20 20 76 6f  oldN, oldK;.  vo
0f80: 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6f 6c 64  id *p;.  if( old
0f90: 50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  P==0 ){.    retu
0fa0: 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f  rn sqliteMalloc_
0fb0: 28 6e 2c 31 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29  (n,1,zFile,line)
0fc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30  ;.  }.  if( n==0
0fd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
0fe0: 65 65 5f 28 6f 6c 64 50 2c 7a 46 69 6c 65 2c 6c  ee_(oldP,zFile,l
0ff0: 69 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ine);.    return
1000: 20 30 3b 0a 20 20 7d 0a 20 20 6f 6c 64 50 69 20   0;.  }.  oldPi 
1010: 3d 20 6f 6c 64 50 3b 0a 20 20 6f 6c 64 50 69 20  = oldP;.  oldPi 
1020: 2d 3d 20 4e 5f 47 55 41 52 44 2b 31 3b 0a 20 20  -= N_GUARD+1;.  
1030: 69 66 28 20 6f 6c 64 50 69 5b 30 5d 21 3d 30 78  if( oldPi[0]!=0x
1040: 64 65 61 64 31 31 32 32 20 29 7b 0a 20 20 20 20  dead1122 ){.    
1050: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1060: 4c 6f 77 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63  Low-end memory c
1070: 6f 72 72 75 70 74 69 6f 6e 20 69 6e 20 72 65 61  orruption in rea
1080: 6c 6c 6f 63 20 61 74 20 30 78 25 78 5c 6e 22 2c  lloc at 0x%x\n",
1090: 20 28 69 6e 74 29 6f 6c 64 50 29 3b 0a 20 20 20   (int)oldP);.   
10a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10b0: 20 6f 6c 64 4e 20 3d 20 6f 6c 64 50 69 5b 4e 5f   oldN = oldPi[N_
10c0: 47 55 41 52 44 5d 3b 0a 20 20 6f 6c 64 4b 20 3d  GUARD];.  oldK =
10d0: 20 28 6f 6c 64 4e 2b 73 69 7a 65 6f 66 28 69 6e   (oldN+sizeof(in
10e0: 74 29 2d 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74  t)-1)/sizeof(int
10f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1100: 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a 20  N_GUARD; i++){. 
1110: 20 20 20 69 66 28 20 6f 6c 64 50 69 5b 6f 6c 64     if( oldPi[old
1120: 4b 2b 4e 5f 47 55 41 52 44 2b 31 2b 69 5d 21 3d  K+N_GUARD+1+i]!=
1130: 30 78 64 65 61 64 33 33 34 34 20 29 7b 0a 20 20  0xdead3344 ){.  
1140: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1150: 72 72 2c 22 48 69 67 68 2d 65 6e 64 20 6d 65 6d  rr,"High-end mem
1160: 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ory corruption i
1170: 6e 20 72 65 61 6c 6c 6f 63 20 61 74 20 30 78 25  n realloc at 0x%
1180: 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1190: 20 20 20 20 28 69 6e 74 29 6f 6c 64 50 29 3b 0a      (int)oldP);.
11a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6b 20 3d 20      }.  }.  k = 
11c0: 28 6e 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29  (n + sizeof(int)
11d0: 20 2d 20 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74   - 1)/sizeof(int
11e0: 29 3b 0a 20 20 70 69 20 3d 20 6d 61 6c 6c 6f 63  );.  pi = malloc
11f0: 28 20 28 6b 2b 4e 5f 47 55 41 52 44 2a 32 2b 31  ( (k+N_GUARD*2+1
1200: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
1210: 0a 20 20 69 66 28 20 70 69 3d 3d 30 20 29 7b 0a  .  if( pi==0 ){.
1220: 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f      sqlite_mallo
1230: 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 20 20  c_failed++;.    
1240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1250: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 47 55 41  for(i=0; i<N_GUA
1260: 52 44 3b 20 69 2b 2b 29 20 70 69 5b 69 5d 20 3d  RD; i++) pi[i] =
1270: 20 30 78 64 65 61 64 31 31 32 32 3b 0a 20 20 70   0xdead1122;.  p
1280: 69 5b 4e 5f 47 55 41 52 44 5d 20 3d 20 6e 3b 0a  i[N_GUARD] = n;.
1290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 47    for(i=0; i<N_G
12a0: 55 41 52 44 3b 20 69 2b 2b 29 20 70 69 5b 6b 2b  UARD; i++) pi[k+
12b0: 4e 5f 47 55 41 52 44 2b 31 2b 69 5d 20 3d 20 30  N_GUARD+1+i] = 0
12c0: 78 64 65 61 64 33 33 34 34 3b 0a 20 20 70 20 3d  xdead3344;.  p =
12d0: 20 26 70 69 5b 4e 5f 47 55 41 52 44 2b 31 5d 3b   &pi[N_GUARD+1];
12e0: 0a 20 20 6d 65 6d 63 70 79 28 70 2c 20 6f 6c 64  .  memcpy(p, old
12f0: 50 2c 20 6e 3e 6f 6c 64 4e 20 3f 20 6f 6c 64 4e  P, n>oldN ? oldN
1300: 20 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3e 6f   : n);.  if( n>o
1310: 6c 64 4e 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ldN ){.    memse
1320: 74 28 26 28 28 63 68 61 72 2a 29 70 29 5b 6f 6c  t(&((char*)p)[ol
1330: 64 4e 5d 2c 20 30 2c 20 6e 2d 6f 6c 64 4e 29 3b  dN], 0, n-oldN);
1340: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 6f 6c  .  }.  memset(ol
1350: 64 50 69 2c 20 30 78 61 62 2c 20 28 6f 6c 64 4b  dPi, 0xab, (oldK
1360: 2b 4e 5f 47 55 41 52 44 2b 32 29 2a 73 69 7a 65  +N_GUARD+2)*size
1370: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 66 72 65 65  of(int));.  free
1380: 28 6f 6c 64 50 69 29 3b 0a 23 69 66 20 4d 45 4d  (oldPi);.#if MEM
1390: 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70  ORY_DEBUG>1.  fp
13a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 30  rintf(stderr,"%0
13b0: 36 64 20 72 65 61 6c 6c 6f 63 20 25 64 20 74 6f  6d realloc %d to
13c0: 20 25 64 20 62 79 74 65 73 20 61 74 20 30 78 25   %d bytes at 0x%
13d0: 78 20 74 6f 20 30 78 25 78 20 61 74 20 25 73 3a  x to 0x%x at %s:
13e0: 25 64 5c 6e 22 2c 0a 20 20 20 20 2b 2b 6d 65 6d  %d\n",.    ++mem
13f0: 63 6e 74 2c 20 6f 6c 64 4e 2c 20 6e 2c 20 28 69  cnt, oldN, n, (i
1400: 6e 74 29 6f 6c 64 50 2c 20 28 69 6e 74 29 70 2c  nt)oldP, (int)p,
1410: 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 23   zFile, line);.#
1420: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
1430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1440: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
1450: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d   string into mem
1460: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1470: 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 46 72  m malloc().** Fr
1480: 65 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ee the original 
1490: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c  string using sql
14a0: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  iteFree()..**.**
14b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14c0: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20 73   called on all s
14d0: 74 72 69 6e 67 73 20 74 68 61 74 20 61 72 65 20  trings that are 
14e0: 70 61 73 73 65 64 20 6f 75 74 73 69 64 65 20 6f  passed outside o
14f0: 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20  f.** the SQLite 
1500: 6c 69 62 72 61 72 79 2e 20 20 54 68 61 74 20 77  library.  That w
1510: 61 79 20 63 6c 69 65 6e 74 73 20 63 61 6e 20 66  ay clients can f
1520: 72 65 65 20 74 68 65 20 73 74 72 69 6e 67 20 75  ree the string u
1530: 73 69 6e 67 20 66 72 65 65 28 29 0a 2a 2a 20 72  sing free().** r
1540: 61 74 68 65 72 20 74 68 61 6e 20 68 61 76 69 6e  ather than havin
1550: 67 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  g to call sqlite
1560: 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Free()..*/.void 
1570: 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63  sqliteStrRealloc
1580: 28 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20 20 63  (char **pz){.  c
1590: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28  har *zNew;.  if(
15a0: 20 70 7a 3d 3d 30 20 7c 7c 20 2a 70 7a 3d 3d 30   pz==0 || *pz==0
15b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 65   ) return;.  zNe
15c0: 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  w = malloc( strl
15d0: 65 6e 28 2a 70 7a 29 20 2b 20 31 20 29 3b 0a 20  en(*pz) + 1 );. 
15e0: 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a   if( zNew==0 ){.
15f0: 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f      sqlite_mallo
1600: 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20 20 20  c_failed++;.    
1610: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b  sqliteFree(*pz);
1620: 0a 20 20 20 20 2a 70 7a 20 3d 20 30 3b 0a 20 20  .    *pz = 0;.  
1630: 7d 0a 20 20 73 74 72 63 70 79 28 7a 4e 65 77 2c  }.  strcpy(zNew,
1640: 20 2a 70 7a 29 3b 0a 20 20 73 71 6c 69 74 65 46   *pz);.  sqliteF
1650: 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20  ree(*pz);.  *pz 
1660: 3d 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = zNew;.}../*.**
1670: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
1680: 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  a string in memo
1690: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
16a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
16b0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 53  */.char *sqliteS
16c0: 74 72 44 75 70 5f 28 63 6f 6e 73 74 20 63 68 61  trDup_(const cha
16d0: 72 20 2a 7a 2c 20 63 68 61 72 20 2a 7a 46 69 6c  r *z, char *zFil
16e0: 65 2c 20 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20  e, int line){.  
16f0: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66  char *zNew;.  if
1700: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1710: 30 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  0;.  zNew = sqli
1720: 74 65 4d 61 6c 6c 6f 63 5f 28 73 74 72 6c 65 6e  teMalloc_(strlen
1730: 28 7a 29 2b 31 2c 20 30 2c 20 7a 46 69 6c 65 2c  (z)+1, 0, zFile,
1740: 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a 4e   line);.  if( zN
1750: 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65 77  ew ) strcpy(zNew
1760: 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  , z);.  return z
1770: 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c  New;.}.char *sql
1780: 69 74 65 53 74 72 4e 44 75 70 5f 28 63 6f 6e 73  iteStrNDup_(cons
1790: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
17a0: 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  , char *zFile, i
17b0: 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72  nt line){.  char
17c0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d   *zNew;.  if( z=
17d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17e0: 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   zNew = sqliteMa
17f0: 6c 6c 6f 63 5f 28 6e 2b 31 2c 20 30 2c 20 7a 46  lloc_(n+1, 0, zF
1800: 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66  ile, line);.  if
1810: 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( zNew ){.    me
1820: 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29  mcpy(zNew, z, n)
1830: 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20  ;.    zNew[n] = 
1840: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1850: 7a 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  zNew;.}.#endif /
1860: 2a 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 20 2a  * MEMORY_DEBUG *
1870: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1880: 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 73 20  lowing versions 
1890: 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  of malloc() and 
18a0: 66 72 65 65 28 29 20 61 72 65 20 66 6f 72 20 75  free() are for u
18b0: 73 65 20 69 6e 20 61 0a 2a 2a 20 6e 6f 72 6d 61  se in a.** norma
18c0: 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20  l build..*/.#if 
18d0: 21 64 65 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f  !defined(MEMORY_
18e0: 44 45 42 55 47 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c  DEBUG)../*.** Al
18f0: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
1900: 79 20 61 6e 64 20 73 65 74 20 69 74 20 74 6f 20  y and set it to 
1910: 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55  zero.  Return NU
1920: 4c 4c 20 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f  LL if.** no memo
1930: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ry is available.
1940: 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
1950: 65 4d 61 6c 6c 6f 63 52 61 77 28 29 2e 0a 2a 2f  eMallocRaw()..*/
1960: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c  .void *sqliteMal
1970: 6c 6f 63 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  loc(int n){.  vo
1980: 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 28 70 20  id *p;.  if( (p 
1990: 3d 20 6d 61 6c 6c 6f 63 28 6e 29 29 3d 3d 30 20  = malloc(n))==0 
19a0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29  ){.    if( n>0 )
19b0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
19c0: 61 69 6c 65 64 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ailed++;.  }else
19d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20  {.    memset(p, 
19e0: 30 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, n);.  }.  ret
19f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1a00: 41 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  Allocate new mem
1a10: 6f 72 79 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ory but do not s
1a20: 65 74 20 69 74 20 74 6f 20 7a 65 72 6f 2e 20 20  et it to zero.  
1a30: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
1a40: 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69 73 20 61  * no memory is a
1a50: 76 61 69 6c 61 62 6c 65 2e 20 20 53 65 65 20 61  vailable.  See a
1a60: 6c 73 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  lso sqliteMalloc
1a70: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ()..*/.void *sql
1a80: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 69 6e 74  iteMallocRaw(int
1a90: 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a   n){.  void *p;.
1aa0: 20 20 69 66 28 20 28 70 20 3d 20 6d 61 6c 6c 6f    if( (p = mallo
1ab0: 63 28 6e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  c(n))==0 ){.    
1ac0: 69 66 28 20 6e 3e 30 20 29 20 73 71 6c 69 74 65  if( n>0 ) sqlite
1ad0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b  _malloc_failed++
1ae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
1b00: 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c  memory previousl
1b10: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1b20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a  sqliteMalloc().*
1b30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 72 65  /.void sqliteFre
1b40: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66  e(void *p){.  if
1b50: 28 20 70 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ( p ){.    free(
1b60: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
1b70: 20 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20   Resize a prior 
1b80: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
1b90: 70 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20  p==0, then this 
1ba0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73  routine.** works
1bb0: 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
1bc0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e  eMalloc().  If n
1bd0: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ==0, then this r
1be0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20  outine.** works 
1bf0: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
1c00: 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Free()..*/.void 
1c10: 2a 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 76  *sqliteRealloc(v
1c20: 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a  oid *p, int n){.
1c30: 20 20 76 6f 69 64 20 2a 70 32 3b 0a 20 20 69 66    void *p2;.  if
1c40: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ( p==0 ){.    re
1c50: 74 75 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  turn sqliteMallo
1c60: 63 28 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  c(n);.  }.  if( 
1c70: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  n==0 ){.    sqli
1c80: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72  teFree(p);.    r
1c90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1ca0: 32 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2c 20 6e  2 = realloc(p, n
1cb0: 29 3b 0a 20 20 69 66 28 20 70 32 3d 3d 30 20 29  );.  if( p2==0 )
1cc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c  {.    sqlite_mal
1cd0: 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20  loc_failed++;.  
1ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 32 3b 0a 7d  }.  return p2;.}
1cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
1d00: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20  opy of a string 
1d10: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1d20: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
1d30: 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72 20 2a  lloc().*/.char *
1d40: 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6e  sqliteStrDup(con
1d50: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1d60: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28  har *zNew;.  if(
1d70: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   z==0 ) return 0
1d80: 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  zNew = sqlit
1d90: 65 4d 61 6c 6c 6f 63 52 61 77 28 73 74 72 6c 65  eMallocRaw(strle
1da0: 6e 28 7a 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a  n(z)+1);.  if( z
1db0: 4e 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65  New ) strcpy(zNe
1dc0: 77 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, z);.  return 
1dd0: 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71  zNew;.}.char *sq
1de0: 6c 69 74 65 53 74 72 4e 44 75 70 28 63 6f 6e 73  liteStrNDup(cons
1df0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1e00: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
1e10: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1e20: 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d  turn 0;.  zNew =
1e30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1e40: 28 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65  (n+1);.  if( zNe
1e50: 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  w ){.    memcpy(
1e60: 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  zNew, z, n);.   
1e70: 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zNew[n] = 0;.  
1e80: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b  }.  return zNew;
1e90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1ea0: 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42  fined(MEMORY_DEB
1eb0: 55 47 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72  UG) */../*.** Cr
1ec0: 65 61 74 65 20 61 20 73 74 72 69 6e 67 20 66 72  eate a string fr
1ed0: 6f 6d 20 74 68 65 20 32 6e 64 20 61 6e 64 20 73  om the 2nd and s
1ee0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
1ef0: 6e 74 73 20 28 75 70 20 74 6f 20 74 68 65 0a 2a  nts (up to the.*
1f00: 2a 20 66 69 72 73 74 20 4e 55 4c 4c 20 61 72 67  * first NULL arg
1f10: 75 6d 65 6e 74 29 2c 20 73 74 6f 72 65 20 74 68  ument), store th
1f20: 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  e string in memo
1f30: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f40: 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  .** sqliteMalloc
1f50: 28 29 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20  () and make the 
1f60: 70 6f 69 6e 74 65 72 20 69 6e 64 69 63 61 74 65  pointer indicate
1f70: 64 20 62 79 20 74 68 65 20 31 73 74 20 61 72 67  d by the 1st arg
1f80: 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 20 74  ument.** point t
1f90: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  o that string.  
1fa0: 54 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74  The 1st argument
1fb0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20   must either be 
1fc0: 4e 55 4c 4c 20 6f 72 20 0a 2a 2a 20 70 6f 69 6e  NULL or .** poin
1fd0: 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t to memory obta
1fe0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1ff0: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69  Malloc()..*/.voi
2000: 64 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e  d sqliteSetStrin
2010: 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 63 6f 6e  g(char **pz, con
2020: 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 2c  st char *zFirst,
2030: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2040: 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   ap;.  int nByte
2050: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2060: 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  z;.  char *zResu
2070: 6c 74 3b 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30  lt;..  if( pz==0
2080: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79   ) return;.  nBy
2090: 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 72  te = strlen(zFir
20a0: 73 74 29 20 2b 20 31 3b 0a 20 20 76 61 5f 73 74  st) + 1;.  va_st
20b0: 61 72 74 28 61 70 2c 20 7a 46 69 72 73 74 29 3b  art(ap, zFirst);
20c0: 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76  .  while( (z = v
20d0: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
20e0: 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20  char*))!=0 ){.  
20f0: 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65    nByte += strle
2100: 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65  n(z);.  }.  va_e
2110: 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  nd(ap);.  sqlite
2120: 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a  Free(*pz);.  *pz
2130: 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c   = zResult = sql
2140: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
2150: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 52 65  yte );.  if( zRe
2160: 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  sult==0 ){.    r
2170: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 74 72  eturn;.  }.  str
2180: 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 46 69  cpy(zResult, zFi
2190: 72 73 74 29 3b 0a 20 20 7a 52 65 73 75 6c 74 20  rst);.  zResult 
21a0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c  += strlen(zResul
21b0: 74 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  t);.  va_start(a
21c0: 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 77 68  p, zFirst);.  wh
21d0: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
21e0: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
21f0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
2200: 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 29 3b  cpy(zResult, z);
2210: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20  .    zResult += 
2220: 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b  strlen(zResult);
2230: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
2240: 29 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59  );.#ifdef MEMORY
2250: 5f 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f 52  _DEBUG.#if MEMOR
2260: 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69  Y_DEBUG>1.  fpri
2270: 6e 74 66 28 73 74 64 65 72 72 2c 22 73 74 72 69  ntf(stderr,"stri
2280: 6e 67 20 61 74 20 30 78 25 78 20 69 73 20 25 73  ng at 0x%x is %s
2290: 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20 2a  \n", (int)*pz, *
22a0: 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  pz);.#endif.#end
22b0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b  if.}../*.** Work
22c0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 53 65 74  s like sqliteSet
22d0: 53 74 72 69 6e 67 2c 20 62 75 74 20 65 61 63 68  String, but each
22e0: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 77 20 66   string is now f
22f0: 6f 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 61 20  ollowed by.** a 
2300: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 77  length integer w
2310: 68 69 63 68 20 73 70 65 63 69 66 69 65 73 20 68  hich specifies h
2320: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  ow much of the s
2330: 6f 75 72 63 65 20 73 74 72 69 6e 67 20 0a 2a 2a  ource string .**
2340: 20 74 6f 20 63 6f 70 79 20 28 69 6e 20 62 79 74   to copy (in byt
2350: 65 73 29 2e 20 20 2d 31 20 6d 65 61 6e 73 20 75  es).  -1 means u
2360: 73 65 20 74 68 65 20 77 68 6f 6c 65 20 73 74 72  se the whole str
2370: 69 6e 67 2e 20 20 54 68 65 20 31 73 74 20 0a 2a  ing.  The 1st .*
2380: 2a 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  * argument must 
2390: 65 69 74 68 65 72 20 62 65 20 4e 55 4c 4c 20 6f  either be NULL o
23a0: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
23b0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
23c0: 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  .** sqliteMalloc
23d0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
23e0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 63 68 61  teSetNString(cha
23f0: 72 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20  r **pz, ...){.  
2400: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2410: 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f 6e 73 74  t nByte;.  const
2420: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
2430: 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74   *zResult;.  int
2440: 20 6e 3b 0a 0a 20 20 69 66 28 20 70 7a 3d 3d 30   n;..  if( pz==0
2450: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 42 79   ) return;.  nBy
2460: 74 65 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61  te = 0;.  va_sta
2470: 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77 68  rt(ap, pz);.  wh
2480: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
2490: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
24a0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ))!=0 ){.    n =
24b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
24c0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29  ;.    if( n<=0 )
24d0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
24e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a      nByte += n;.
24f0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
2500: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a  ;.  sqliteFree(*
2510: 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 52 65  pz);.  *pz = zRe
2520: 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  sult = sqliteMal
2530: 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 2b 20  locRaw( nByte + 
2540: 31 20 29 3b 0a 20 20 69 66 28 20 7a 52 65 73 75  1 );.  if( zResu
2550: 6c 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  lt==0 ) return;.
2560: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70    va_start(ap, p
2570: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20  z);.  while( (z 
2580: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
2590: 73 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b  st char*))!=0 ){
25a0: 0a 20 20 20 20 6e 20 3d 20 76 61 5f 61 72 67 28  .    n = va_arg(
25b0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 69 66  ap, int);.    if
25c0: 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72  ( n<=0 ) n = str
25d0: 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 73 74 72 6e  len(z);.    strn
25e0: 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 2c 20  cpy(zResult, z, 
25f0: 6e 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  n);.    zResult 
2600: 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20 2a 7a 52 65  += n;.  }.  *zRe
2610: 73 75 6c 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  sult = 0;.#ifdef
2620: 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 0a 23 69   MEMORY_DEBUG.#i
2630: 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31  f MEMORY_DEBUG>1
2640: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
2650: 72 2c 22 73 74 72 69 6e 67 20 61 74 20 30 78 25  r,"string at 0x%
2660: 78 20 69 73 20 25 73 5c 6e 22 2c 20 28 69 6e 74  x is %s\n", (int
2670: 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a 23 65 6e 64  )*pz, *pz);.#end
2680: 69 66 0a 23 65 6e 64 69 66 0a 20 20 76 61 5f 65  if.#endif.  va_e
2690: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
26a0: 20 41 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   Add an error me
26b0: 73 73 61 67 65 20 74 6f 20 70 50 61 72 73 65 2d  ssage to pParse-
26c0: 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20 69 6e 63  >zErrMsg and inc
26d0: 72 65 6d 65 6e 74 20 70 50 61 72 73 65 2d 3e 6e  rement pParse->n
26e0: 45 72 72 2e 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  Err..** The foll
26f0: 6f 77 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67  owing formatting
2700: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
2710: 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  allowed:.**.**  
2720: 20 20 20 20 25 73 20 20 20 20 20 20 49 6e 73 65      %s      Inse
2730: 72 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 20  rt a string.**  
2740: 20 20 20 20 25 7a 20 20 20 20 20 20 41 20 73 74      %z      A st
2750: 72 69 6e 67 20 74 68 61 74 20 73 68 6f 75 6c 64  ring that should
2760: 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20   be freed after 
2770: 75 73 65 0a 2a 2a 20 20 20 20 20 20 25 64 20 20  use.**      %d  
2780: 20 20 20 20 49 6e 73 65 72 74 20 61 6e 20 69 6e      Insert an in
2790: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 25 54  teger.**      %T
27a0: 20 20 20 20 20 20 49 6e 73 65 72 74 20 61 20 74        Insert a t
27b0: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 20 25 53 20  oken.**      %S 
27c0: 20 20 20 20 20 49 6e 73 65 72 74 20 74 68 65 20       Insert the 
27d0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
27e0: 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
27f0: 69 64 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73  id sqliteErrorMs
2800: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
2810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2820: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2830: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 70 50 61 72  _list ap;.  pPar
2840: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 73 71  se->nErr++;.  sq
2850: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
2860: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f  >zErrMsg);.  va_
2870: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
2880: 74 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 45  t);.  pParse->zE
2890: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 56 4d  rrMsg = sqliteVM
28a0: 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  Printf(zFormat, 
28b0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
28c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  );.}../*.** Conv
28d0: 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65  ert an SQL-style
28e0: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69   quoted string i
28f0: 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72  nto a normal str
2900: 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a  ing by removing.
2910: 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63 68 61  ** the quote cha
2920: 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f  racters.  The co
2930: 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65  nversion is done
2940: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74   in-place.  If t
2950: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73  he.** input does
2960: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
2970: 61 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  a quote characte
2980: 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
2990: 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tine.** is a no-
29a0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 32 2d 46  op..**.** 2002-F
29b0: 65 62 2d 31 34 3a 20 54 68 69 73 20 72 6f 75 74  eb-14: This rout
29c0: 69 6e 65 20 69 73 20 65 78 74 65 6e 64 65 64 20  ine is extended 
29d0: 74 6f 20 72 65 6d 6f 76 65 20 4d 53 2d 41 63 63  to remove MS-Acc
29e0: 65 73 73 20 73 74 79 6c 65 0a 2a 2a 20 62 72 61  ess style.** bra
29f0: 63 6b 65 74 73 20 66 72 6f 6d 20 61 72 6f 75 6e  ckets from aroun
2a00: 64 20 69 64 65 6e 74 69 66 65 72 73 2e 20 20 46  d identifers.  F
2a10: 6f 72 20 65 78 61 6d 70 6c 65 3a 20 20 22 5b 61  or example:  "[a
2a20: 2d 62 2d 63 5d 22 20 62 65 63 6f 6d 65 73 0a 2a  -b-c]" becomes.*
2a30: 2a 20 22 61 2d 62 2d 63 22 2e 0a 2a 2f 0a 76 6f  * "a-b-c"..*/.vo
2a40: 69 64 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  id sqliteDequote
2a50: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74  (char *z){.  int
2a60: 20 71 75 6f 74 65 3b 0a 20 20 69 6e 74 20 69 2c   quote;.  int i,
2a70: 20 6a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   j;.  if( z==0 )
2a80: 20 72 65 74 75 72 6e 3b 0a 20 20 71 75 6f 74 65   return;.  quote
2a90: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 73 77 69 74 63   = z[0];.  switc
2aa0: 68 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  h( quote ){.    
2ab0: 63 61 73 65 20 27 5c 27 27 3a 20 20 62 72 65 61  case '\'':  brea
2ac0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 22 27 3a  k;.    case '"':
2ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2ae0: 73 65 20 27 5b 27 3a 20 20 20 71 75 6f 74 65 20  se '[':   quote 
2af0: 3d 20 27 5d 27 3b 20 20 62 72 65 61 6b 3b 0a 20  = ']';  break;. 
2b00: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 72     default:    r
2b10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
2b20: 28 69 3d 31 2c 20 6a 3d 30 3b 20 7a 5b 69 5d 3b  (i=1, j=0; z[i];
2b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
2b40: 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  [i]==quote ){.  
2b50: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
2b60: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  quote ){.       
2b70: 20 7a 5b 6a 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b   z[j++] = quote;
2b80: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
2b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ba0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 30 3b 0a 20     z[j++] = 0;. 
2bb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2bc0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2bd0: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  .      z[j++] = 
2be0: 7a 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  z[i];.    }.  }.
2bf0: 7d 0a 0a 2f 2a 20 41 6e 20 61 72 72 61 79 20 74  }../* An array t
2c00: 6f 20 6d 61 70 20 61 6c 6c 20 75 70 70 65 72 2d  o map all upper-
2c10: 63 61 73 65 20 63 68 61 72 61 63 74 65 72 73 20  case characters 
2c20: 69 6e 74 6f 20 74 68 65 69 72 20 63 6f 72 72 65  into their corre
2c30: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65  sponding.** lowe
2c40: 72 2d 63 61 73 65 20 63 68 61 72 61 63 74 65 72  r-case character
2c50: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  . .*/.static uns
2c60: 69 67 6e 65 64 20 63 68 61 72 20 55 70 70 65 72  igned char Upper
2c70: 54 6f 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20 20  ToLower[] = {.  
2c80: 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20      0,  1,  2,  
2c90: 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20  3,  4,  5,  6,  
2ca0: 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c 20 31  7,  8,  9, 10, 1
2cb0: 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31  1, 12, 13, 14, 1
2cc0: 35 2c 20 31 36 2c 20 31 37 2c 0a 20 20 20 20 20  5, 16, 17,.     
2cd0: 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c 20  18, 19, 20, 21, 
2ce0: 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c 20  22, 23, 24, 25, 
2cf0: 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20  26, 27, 28, 29, 
2d00: 33 30 2c 20 33 31 2c 20 33 32 2c 20 33 33 2c 20  30, 31, 32, 33, 
2d10: 33 34 2c 20 33 35 2c 0a 20 20 20 20 20 33 36 2c  34, 35,.     36,
2d20: 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c   37, 38, 39, 40,
2d30: 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 34 34 2c   41, 42, 43, 44,
2d40: 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c   45, 46, 47, 48,
2d50: 20 34 39 2c 20 35 30 2c 20 35 31 2c 20 35 32 2c   49, 50, 51, 52,
2d60: 20 35 33 2c 0a 20 20 20 20 20 35 34 2c 20 35 35   53,.     54, 55
2d70: 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39  , 56, 57, 58, 59
2d80: 2c 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 36 33  , 60, 61, 62, 63
2d90: 2c 20 36 34 2c 20 39 37 2c 20 39 38 2c 20 39 39  , 64, 97, 98, 99
2da0: 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33  ,100,101,102,103
2db0: 2c 0a 20 20 20 20 31 30 34 2c 31 30 35 2c 31 30  ,.    104,105,10
2dc0: 36 2c 31 30 37 2c 31 30 38 2c 31 30 39 2c 31 31  6,107,108,109,11
2dd0: 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31  0,111,112,113,11
2de0: 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31  4,115,116,117,11
2df0: 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 0a 20  8,119,120,121,. 
2e00: 20 20 20 31 32 32 2c 20 39 31 2c 20 39 32 2c 20     122, 91, 92, 
2e10: 39 33 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c 20  93, 94, 95, 96, 
2e20: 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 31  97, 98, 99,100,1
2e30: 30 31 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c 31  01,102,103,104,1
2e40: 30 35 2c 31 30 36 2c 31 30 37 2c 0a 20 20 20 20  05,106,107,.    
2e50: 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c  108,109,110,111,
2e60: 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c  112,113,114,115,
2e70: 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c  116,117,118,119,
2e80: 31 32 30 2c 31 32 31 2c 31 32 32 2c 31 32 33 2c  120,121,122,123,
2e90: 31 32 34 2c 31 32 35 2c 0a 20 20 20 20 31 32 36  124,125,.    126
2ea0: 2c 31 32 37 2c 31 32 38 2c 31 32 39 2c 31 33 30  ,127,128,129,130
2eb0: 2c 31 33 31 2c 31 33 32 2c 31 33 33 2c 31 33 34  ,131,132,133,134
2ec0: 2c 31 33 35 2c 31 33 36 2c 31 33 37 2c 31 33 38  ,135,136,137,138
2ed0: 2c 31 33 39 2c 31 34 30 2c 31 34 31 2c 31 34 32  ,139,140,141,142
2ee0: 2c 31 34 33 2c 0a 20 20 20 20 31 34 34 2c 31 34  ,143,.    144,14
2ef0: 35 2c 31 34 36 2c 31 34 37 2c 31 34 38 2c 31 34  5,146,147,148,14
2f00: 39 2c 31 35 30 2c 31 35 31 2c 31 35 32 2c 31 35  9,150,151,152,15
2f10: 33 2c 31 35 34 2c 31 35 35 2c 31 35 36 2c 31 35  3,154,155,156,15
2f20: 37 2c 31 35 38 2c 31 35 39 2c 31 36 30 2c 31 36  7,158,159,160,16
2f30: 31 2c 0a 20 20 20 20 31 36 32 2c 31 36 33 2c 31  1,.    162,163,1
2f40: 36 34 2c 31 36 35 2c 31 36 36 2c 31 36 37 2c 31  64,165,166,167,1
2f50: 36 38 2c 31 36 39 2c 31 37 30 2c 31 37 31 2c 31  68,169,170,171,1
2f60: 37 32 2c 31 37 33 2c 31 37 34 2c 31 37 35 2c 31  72,173,174,175,1
2f70: 37 36 2c 31 37 37 2c 31 37 38 2c 31 37 39 2c 0a  76,177,178,179,.
2f80: 20 20 20 20 31 38 30 2c 31 38 31 2c 31 38 32 2c      180,181,182,
2f90: 31 38 33 2c 31 38 34 2c 31 38 35 2c 31 38 36 2c  183,184,185,186,
2fa0: 31 38 37 2c 31 38 38 2c 31 38 39 2c 31 39 30 2c  187,188,189,190,
2fb0: 31 39 31 2c 31 39 32 2c 31 39 33 2c 31 39 34 2c  191,192,193,194,
2fc0: 31 39 35 2c 31 39 36 2c 31 39 37 2c 0a 20 20 20  195,196,197,.   
2fd0: 20 31 39 38 2c 31 39 39 2c 32 30 30 2c 32 30 31   198,199,200,201
2fe0: 2c 32 30 32 2c 32 30 33 2c 32 30 34 2c 32 30 35  ,202,203,204,205
2ff0: 2c 32 30 36 2c 32 30 37 2c 32 30 38 2c 32 30 39  ,206,207,208,209
3000: 2c 32 31 30 2c 32 31 31 2c 32 31 32 2c 32 31 33  ,210,211,212,213
3010: 2c 32 31 34 2c 32 31 35 2c 0a 20 20 20 20 32 31  ,214,215,.    21
3020: 36 2c 32 31 37 2c 32 31 38 2c 32 31 39 2c 32 32  6,217,218,219,22
3030: 30 2c 32 32 31 2c 32 32 32 2c 32 32 33 2c 32 32  0,221,222,223,22
3040: 34 2c 32 32 35 2c 32 32 36 2c 32 32 37 2c 32 32  4,225,226,227,22
3050: 38 2c 32 32 39 2c 32 33 30 2c 32 33 31 2c 32 33  8,229,230,231,23
3060: 32 2c 32 33 33 2c 0a 20 20 20 20 32 33 34 2c 32  2,233,.    234,2
3070: 33 35 2c 32 33 36 2c 32 33 37 2c 32 33 38 2c 32  35,236,237,238,2
3080: 33 39 2c 32 34 30 2c 32 34 31 2c 32 34 32 2c 32  39,240,241,242,2
3090: 34 33 2c 32 34 34 2c 32 34 35 2c 32 34 36 2c 32  43,244,245,246,2
30a0: 34 37 2c 32 34 38 2c 32 34 39 2c 32 35 30 2c 32  47,248,249,250,2
30b0: 35 31 2c 0a 20 20 20 20 32 35 32 2c 32 35 33 2c  51,.    252,253,
30c0: 32 35 34 2c 32 35 35 0a 7d 3b 0a 0a 2f 2a 0a 2a  254,255.};../*.*
30d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30e0: 63 6f 6d 70 75 74 65 73 20 61 20 68 61 73 68 20  computes a hash 
30f0: 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  on the name of a
3100: 20 6b 65 79 77 6f 72 64 2e 0a 2a 2a 20 43 61 73   keyword..** Cas
3110: 65 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69  e is not signifi
3120: 63 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cant..*/.int sql
3130: 69 74 65 48 61 73 68 4e 6f 43 61 73 65 28 63 6f  iteHashNoCase(co
3140: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
3150: 20 6e 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30   n){.  int h = 0
3160: 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e  ;.  if( n<=0 ) n
3170: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
3180: 77 68 69 6c 65 28 20 6e 20 3e 20 30 20 20 29 7b  while( n > 0  ){
3190: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 33 29 20  .    h = (h<<3) 
31a0: 5e 20 68 20 5e 20 55 70 70 65 72 54 6f 4c 6f 77  ^ h ^ UpperToLow
31b0: 65 72 5b 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er[(unsigned cha
31c0: 72 29 2a 7a 2b 2b 5d 3b 0a 20 20 20 20 6e 2d 2d  r)*z++];.    n--
31d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
31e0: 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a 7d   & 0x7fffffff;.}
31f0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73 79 73  ../*.** Some sys
3200: 74 65 6d 73 20 68 61 76 65 20 73 74 72 69 63 6d  tems have stricm
3210: 70 28 29 2e 20 20 4f 74 68 65 72 73 20 68 61 76  p().  Others hav
3220: 65 20 73 74 72 63 61 73 65 63 6d 70 28 29 2e 20  e strcasecmp(). 
3230: 20 42 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 72   Because.** ther
3240: 65 20 69 73 20 6e 6f 20 63 6f 6e 73 69 73 74 65  e is no consiste
3250: 6e 63 79 2c 20 77 65 20 77 69 6c 6c 20 64 65 66  ncy, we will def
3260: 69 6e 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a  ine our own..*/.
3270: 69 6e 74 20 73 71 6c 69 74 65 53 74 72 49 43 6d  int sqliteStrICm
3280: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  p(const char *zL
3290: 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eft, const char 
32a0: 2a 7a 52 69 67 68 74 29 7b 0a 20 20 72 65 67 69  *zRight){.  regi
32b0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68  ster unsigned ch
32c0: 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d  ar *a, *b;.  a =
32d0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
32e0: 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28  *)zLeft;.  b = (
32f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3300: 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28  zRight;.  while(
3310: 20 2a 61 21 3d 30 20 26 26 20 55 70 70 65 72 54   *a!=0 && UpperT
3320: 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65  oLower[*a]==Uppe
3330: 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61  rToLower[*b]){ a
3340: 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74  ++; b++; }.  ret
3350: 75 72 6e 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  urn UpperToLower
3360: 5b 2a 61 5d 20 2d 20 55 70 70 65 72 54 6f 4c 6f  [*a] - UpperToLo
3370: 77 65 72 5b 2a 62 5d 3b 0a 7d 0a 69 6e 74 20 73  wer[*b];.}.int s
3380: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 63 6f  qliteStrNICmp(co
3390: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
33a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
33b0: 67 68 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  ght, int N){.  r
33c0: 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64  egister unsigned
33d0: 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20   char *a, *b;.  
33e0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
33f0: 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20  ar *)zLeft;.  b 
3400: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3410: 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69   *)zRight;.  whi
3420: 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a  le( N-- > 0 && *
3430: 61 21 3d 30 20 26 26 20 55 70 70 65 72 54 6f 4c  a!=0 && UpperToL
3440: 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54  ower[*a]==UpperT
3450: 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b  oLower[*b]){ a++
3460: 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  ; b++; }.  retur
3470: 6e 20 4e 3c 30 20 3f 20 30 20 3a 20 55 70 70 65  n N<0 ? 0 : Uppe
3480: 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 20 2d 20 55  rToLower[*a] - U
3490: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b  pperToLower[*b];
34a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34b0: 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 61 20   TRUE if z is a 
34c0: 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74 72  pure numeric str
34d0: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ing.  Return FAL
34e0: 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 74 72  SE if the.** str
34f0: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ing contains any
3500: 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68   character which
3510: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
3520: 61 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  a number..**.** 
3530: 41 6d 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  Am empty string 
3540: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6e 6f  is considered no
3550: 6e 2d 6e 75 6d 65 72 69 63 2e 0a 2a 2f 0a 69 6e  n-numeric..*/.in
3560: 74 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72  t sqliteIsNumber
3570: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3580: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
3590: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
35a0: 0a 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28  .  if( !isdigit(
35b0: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
35c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
35d0: 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74    while( isdigit
35e0: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
35f0: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
3600: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3610: 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20 29 20   !isdigit(*z) ) 
3620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
3630: 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a 7a 29  ile( isdigit(*z)
3640: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ z++; }.  }. 
3650: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
3660: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3670: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3680: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
3690: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 69   z++;.    if( !i
36a0: 73 64 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sdigit(*z) ) ret
36b0: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
36c0: 28 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  ( isdigit(*z) ){
36d0: 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   z++; }.  }.  re
36e0: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
36f0: 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20  *.** The string 
3700: 7a 5b 5d 20 69 73 20 61 6e 20 61 73 63 69 69 20  z[] is an ascii 
3710: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
3720: 66 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72 2e  f a real number.
3730: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 69 73  .** Convert this
3740: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 64 6f 75   string to a dou
3750: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
3760: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
3770: 74 68 61 74 20 7a 5b 5d 20 72 65 61 6c 6c 79 20  that z[] really 
3780: 69 73 20 61 20 76 61 6c 69 64 20 6e 75 6d 62 65  is a valid numbe
3790: 72 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20  r.  If it.** is 
37a0: 6e 6f 74 2c 20 74 68 65 20 72 65 73 75 6c 74 20  not, the result 
37b0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a  is undefined..**
37c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
37d0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
37e0: 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   of the library 
37f0: 61 74 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  atof() function 
3800: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 6c  because.** the l
3810: 69 62 72 61 72 79 20 61 74 6f 66 28 29 20 6d 69  ibrary atof() mi
3820: 67 68 74 20 77 61 6e 74 20 74 6f 20 75 73 65 20  ght want to use 
3830: 22 2c 22 20 61 73 20 74 68 65 20 64 65 63 69 6d  "," as the decim
3840: 61 6c 20 70 6f 69 6e 74 20 69 6e 73 74 65 61 64  al point instead
3850: 0a 2a 2a 20 6f 66 20 22 2e 22 20 64 65 70 65 6e  .** of "." depen
3860: 64 69 6e 67 20 6f 6e 20 68 6f 77 20 6c 6f 63 61  ding on how loca
3870: 6c 65 20 69 73 20 73 65 74 2e 20 20 42 75 74 20  le is set.  But 
3880: 74 68 61 74 20 77 6f 75 6c 64 20 63 61 75 73 65  that would cause
3890: 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 66 6f 72   problems.** for
38a0: 20 53 51 4c 2e 20 20 53 6f 20 74 68 69 73 20 72   SQL.  So this r
38b0: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 75 73  outine always us
38c0: 65 73 20 22 2e 22 20 72 65 67 61 72 64 6c 65 73  es "." regardles
38d0: 73 20 6f 66 20 6c 6f 63 61 6c 65 2e 0a 2a 2f 0a  s of locale..*/.
38e0: 64 6f 75 62 6c 65 20 73 71 6c 69 74 65 41 74 6f  double sqliteAto
38f0: 46 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  F(const char *z,
3900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
3910: 45 6e 64 29 7b 0a 20 20 69 6e 74 20 73 69 67 6e  End){.  int sign
3920: 20 3d 20 31 3b 0a 20 20 4c 4f 4e 47 44 4f 55 42   = 1;.  LONGDOUB
3930: 4c 45 5f 54 59 50 45 20 76 31 20 3d 20 30 2e 30  LE_TYPE v1 = 0.0
3940: 3b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20  ;.  if( *z=='-' 
3950: 29 7b 0a 20 20 20 20 73 69 67 6e 20 3d 20 2d 31  ){.    sign = -1
3960: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 65 6c  ;.    z++;.  }el
3970: 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 29  se if( *z=='+' )
3980: 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  {.    z++;.  }. 
3990: 20 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28   while( isdigit(
39a0: 2a 7a 29 20 29 7b 0a 20 20 20 20 76 31 20 3d 20  *z) ){.    v1 = 
39b0: 76 31 2a 31 30 2e 30 20 2b 20 28 2a 7a 20 2d 20  v1*10.0 + (*z - 
39c0: 27 30 27 29 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  '0');.    z++;. 
39d0: 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27   }.  if( *z=='.'
39e0: 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
39f0: 4c 45 5f 54 59 50 45 20 64 69 76 69 73 6f 72 20  LE_TYPE divisor 
3a00: 3d 20 31 2e 30 3b 0a 20 20 20 20 7a 2b 2b 3b 0a  = 1.0;.    z++;.
3a10: 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67      while( isdig
3a20: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20 20  it(*z) ){.      
3a30: 76 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20 28  v1 = v1*10.0 + (
3a40: 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 20  *z - '0');.     
3a50: 20 64 69 76 69 73 6f 72 20 2a 3d 20 31 30 2e 30   divisor *= 10.0
3a60: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
3a70: 20 7d 0a 20 20 20 20 76 31 20 2f 3d 20 64 69 76   }.    v1 /= div
3a80: 69 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  isor;.  }.  if( 
3a90: 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='e' || *z=='
3aa0: 45 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 73  E' ){.    int es
3ab0: 69 67 6e 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ign = 1;.    int
3ac0: 20 65 76 61 6c 20 3d 20 30 3b 0a 20 20 20 20 4c   eval = 0;.    L
3ad0: 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 73  ONGDOUBLE_TYPE s
3ae0: 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20  cale = 1.0;.    
3af0: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3b00: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 65 73  ='-' ){.      es
3b10: 69 67 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ign = -1;.      
3b20: 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  z++;.    }else i
3b30: 66 28 20 2a 7a 3d 3d 27 2b 27 20 29 7b 0a 20 20  f( *z=='+' ){.  
3b40: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
3b50: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
3b60: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 20 20 65  t(*z) ){.      e
3b70: 76 61 6c 20 3d 20 65 76 61 6c 2a 31 30 20 2b 20  val = eval*10 + 
3b80: 2a 7a 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  *z - '0';.      
3b90: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  z++;.    }.    w
3ba0: 68 69 6c 65 28 20 65 76 61 6c 3e 3d 36 34 20 29  hile( eval>=64 )
3bb0: 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b  { scale *= 1.0e+
3bc0: 36 34 3b 20 65 76 61 6c 20 2d 3d 20 36 34 3b 20  64; eval -= 64; 
3bd0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61  }.    while( eva
3be0: 6c 3e 3d 31 36 20 29 7b 20 73 63 61 6c 65 20 2a  l>=16 ){ scale *
3bf0: 3d 20 31 2e 30 65 2b 31 36 3b 20 65 76 61 6c 20  = 1.0e+16; eval 
3c00: 2d 3d 20 31 36 3b 20 7d 0a 20 20 20 20 77 68 69  -= 16; }.    whi
3c10: 6c 65 28 20 65 76 61 6c 3e 3d 34 20 29 7b 20 73  le( eval>=4 ){ s
3c20: 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 34 3b 20  cale *= 1.0e+4; 
3c30: 65 76 61 6c 20 2d 3d 20 34 3b 20 7d 0a 20 20 20  eval -= 4; }.   
3c40: 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d 31 20   while( eval>=1 
3c50: 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e 30 65  ){ scale *= 1.0e
3c60: 2b 31 3b 20 65 76 61 6c 20 2d 3d 20 31 3b 20 7d  +1; eval -= 1; }
3c70: 0a 20 20 20 20 69 66 28 20 65 73 69 67 6e 3c 30  .    if( esign<0
3c80: 20 29 7b 0a 20 20 20 20 20 20 76 31 20 2f 3d 20   ){.      v1 /= 
3c90: 73 63 61 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65  scale;.    }else
3ca0: 7b 0a 20 20 20 20 20 20 76 31 20 2a 3d 20 73 63  {.      v1 *= sc
3cb0: 61 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ale;.    }.  }. 
3cc0: 20 69 66 28 20 70 7a 45 6e 64 20 29 20 2a 70 7a   if( pzEnd ) *pz
3cd0: 45 6e 64 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72  End = z;.  retur
3ce0: 6e 20 73 69 67 6e 3c 30 20 3f 20 2d 76 31 20 3a  n sign<0 ? -v1 :
3cf0: 20 76 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   v1;.}../*.** Th
3d00: 65 20 73 74 72 69 6e 67 20 7a 4e 75 6d 20 72 65  e string zNum re
3d10: 70 72 65 73 65 6e 74 73 20 61 6e 20 69 6e 74 65  presents an inte
3d20: 67 65 72 2e 20 20 54 68 65 72 65 20 6d 69 67 68  ger.  There migh
3d30: 74 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  t be some other.
3d40: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
3d50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 69 6e 74  ollowing the int
3d60: 65 67 65 72 20 74 6f 6f 2c 20 62 75 74 20 74 68  eger too, but th
3d70: 61 74 20 70 61 72 74 20 69 73 20 69 67 6e 6f 72  at part is ignor
3d80: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ed..** If the in
3d90: 74 65 67 65 72 20 74 68 61 74 20 74 68 65 20 70  teger that the p
3da0: 72 65 66 69 78 20 6f 66 20 7a 4e 75 6d 20 72 65  refix of zNum re
3db0: 70 72 65 73 65 6e 74 73 20 77 69 6c 6c 20 66 69  presents will fi
3dc0: 74 20 69 6e 20 61 0a 2a 2a 20 33 32 2d 62 69 74  t in a.** 32-bit
3dd0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2c   signed integer,
3de0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 4f   return TRUE.  O
3df0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
3e00: 46 41 4c 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FALSE..**.** Thi
3e10: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3e20: 73 20 46 41 4c 53 45 20 66 6f 72 20 74 68 65 20  s FALSE for the 
3e30: 73 74 72 69 6e 67 20 2d 32 31 34 37 34 38 33 36  string -21474836
3e40: 34 38 20 65 76 65 6e 20 74 68 61 74 0a 2a 2a 20  48 even that.** 
3e50: 74 68 61 74 20 6e 75 6d 62 65 72 20 77 69 6c 6c  that number will
3e60: 2c 20 69 6e 20 74 68 65 6f 72 79 20 66 69 74 20  , in theory fit 
3e70: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
3e80: 67 65 72 2e 20 20 42 75 74 20 70 6f 73 69 74 69  ger.  But positi
3e90: 76 65 0a 2a 2a 20 32 31 34 37 34 38 33 36 34 38  ve.** 2147483648
3ea0: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 69 6e   will not fit in
3eb0: 20 33 32 20 62 69 74 73 2e 20 20 53 6f 20 69 74   32 bits.  So it
3ec0: 20 73 65 65 6d 73 20 73 61 66 65 72 20 74 6f 20   seems safer to 
3ed0: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 2e  return.** false.
3ee0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 46 69  .*/.int sqliteFi
3ef0: 74 73 49 6e 33 32 42 69 74 73 28 63 6f 6e 73 74  tsIn32Bits(const
3f00: 20 63 68 61 72 20 2a 7a 4e 75 6d 29 7b 0a 20 20   char *zNum){.  
3f10: 69 6e 74 20 69 2c 20 63 3b 0a 20 20 69 66 28 20  int i, c;.  if( 
3f20: 2a 7a 4e 75 6d 3d 3d 27 2d 27 20 7c 7c 20 2a 7a  *zNum=='-' || *z
3f30: 4e 75 6d 3d 3d 27 2b 27 20 29 20 7a 4e 75 6d 2b  Num=='+' ) zNum+
3f40: 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  +;.  for(i=0; (c
3f50: 3d 7a 4e 75 6d 5b 69 5d 29 3e 3d 27 30 27 20 26  =zNum[i])>='0' &
3f60: 26 20 63 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d  & c<='9'; i++){}
3f70: 0a 20 20 72 65 74 75 72 6e 20 69 3c 31 30 20 7c  .  return i<10 |
3f80: 7c 20 28 69 3d 3d 31 30 20 26 26 20 6d 65 6d 63  | (i==10 && memc
3f90: 6d 70 28 7a 4e 75 6d 2c 22 32 31 34 37 34 38 33  mp(zNum,"2147483
3fa0: 36 34 37 22 2c 31 30 29 3c 3d 30 29 3b 0a 7d 0a  647",10)<=0);.}.
3fb0: 0a 2f 2a 20 54 68 69 73 20 63 6f 6d 70 61 72 69  ./* This compari
3fc0: 73 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 77  son routine is w
3fd0: 68 61 74 20 77 65 20 75 73 65 20 66 6f 72 20 63  hat we use for c
3fe0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
3ff0: 69 6f 6e 73 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ions.** between 
4000: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 69  numeric values i
4010: 6e 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73 73  n an SQL express
4020: 69 6f 6e 2e 20 20 22 4e 75 6d 65 72 69 63 22 20  ion.  "Numeric" 
4030: 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 62  is a little.** b
4040: 69 74 20 6d 69 73 6c 65 61 64 69 6e 67 20 68 65  it misleading he
4050: 72 65 2e 20 20 57 68 61 74 20 77 65 20 6d 65 61  re.  What we mea
4060: 6e 20 69 73 20 74 68 61 74 20 74 68 65 20 73 74  n is that the st
4070: 72 69 6e 67 73 20 68 61 76 65 20 61 0a 2a 2a 20  rings have a.** 
4080: 74 79 70 65 20 6f 66 20 22 6e 75 6d 65 72 69 63  type of "numeric
4090: 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  " from the point
40a0: 20 6f 66 20 76 69 65 77 20 6f 66 20 53 51 4c 2e   of view of SQL.
40b0: 20 20 54 68 65 20 73 74 72 69 6e 67 73 0a 2a 2a    The strings.**
40c0: 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
40d0: 69 6c 79 20 63 6f 6e 74 61 69 6e 20 6e 75 6d 62  ily contain numb
40e0: 65 72 73 2e 20 20 54 68 65 79 20 63 6f 75 6c 64  ers.  They could
40f0: 20 63 6f 6e 74 61 69 6e 20 74 65 78 74 2e 0a 2a   contain text..*
4100: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
4110: 74 20 73 74 72 69 6e 67 73 20 62 6f 74 68 20 6c  t strings both l
4120: 6f 6f 6b 20 6c 69 6b 65 20 61 63 74 75 61 6c 20  ook like actual 
4130: 6e 75 6d 62 65 72 73 20 74 68 65 6e 20 74 68 65  numbers then the
4140: 79 0a 2a 2a 20 63 6f 6d 70 61 72 65 20 69 6e 20  y.** compare in 
4150: 6e 75 6d 65 72 69 63 61 6c 20 6f 72 64 65 72 2e  numerical order.
4160: 20 20 4e 75 6d 65 72 69 63 61 6c 20 73 74 72 69    Numerical stri
4170: 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6c  ngs are always l
4180: 65 73 73 20 0a 2a 2a 20 74 68 61 6e 20 6e 6f 6e  ess .** than non
4190: 2d 6e 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73  -numeric strings
41a0: 20 73 6f 20 69 66 20 6f 6e 65 20 69 6e 70 75 74   so if one input
41b0: 20 73 74 72 69 6e 67 20 6c 6f 6f 6b 73 20 6c 69   string looks li
41c0: 6b 65 20 61 0a 2a 2a 20 6e 75 6d 62 65 72 20 61  ke a.** number a
41d0: 6e 64 20 74 68 65 20 6f 74 68 65 72 20 64 6f 65  nd the other doe
41e0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
41f0: 6f 6e 65 20 74 68 61 74 20 6c 6f 6f 6b 73 20 6c  one that looks l
4200: 69 6b 65 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20  ike.** a number 
4210: 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 72 2e 20  is the smaller. 
4220: 20 4e 6f 6e 2d 6e 75 6d 65 72 69 63 20 73 74 72   Non-numeric str
4230: 69 6e 67 73 20 63 6f 6d 70 61 72 65 20 69 6e 20  ings compare in 
4240: 0a 2a 2a 20 6c 65 78 69 67 72 61 70 68 69 63 61  .** lexigraphica
4250: 6c 20 6f 72 64 65 72 20 28 74 68 65 20 73 61 6d  l order (the sam
4260: 65 20 6f 72 64 65 72 20 61 73 20 73 74 72 63 6d  e order as strcm
4270: 70 28 29 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  p())..*/.int sql
4280: 69 74 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  iteCompare(const
4290: 20 63 68 61 72 20 2a 61 74 65 78 74 2c 20 63 6f   char *atext, co
42a0: 6e 73 74 20 63 68 61 72 20 2a 62 74 65 78 74 29  nst char *btext)
42b0: 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a  {.  int result;.
42c0: 20 20 69 6e 74 20 69 73 4e 75 6d 41 2c 20 69 73    int isNumA, is
42d0: 4e 75 6d 42 3b 0a 20 20 69 66 28 20 61 74 65 78  NumB;.  if( atex
42e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
42f0: 72 6e 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69  rn -1;.  }else i
4300: 66 28 20 62 74 65 78 74 3d 3d 30 20 29 7b 0a 20  f( btext==0 ){. 
4310: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4320: 0a 20 20 69 73 4e 75 6d 41 20 3d 20 73 71 6c 69  .  isNumA = sqli
4330: 74 65 49 73 4e 75 6d 62 65 72 28 61 74 65 78 74  teIsNumber(atext
4340: 29 3b 0a 20 20 69 73 4e 75 6d 42 20 3d 20 73 71  );.  isNumB = sq
4350: 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 62 74 65  liteIsNumber(bte
4360: 78 74 29 3b 0a 20 20 69 66 28 20 69 73 4e 75 6d  xt);.  if( isNum
4370: 41 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  A ){.    if( !is
4380: 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 72 65  NumB ){.      re
4390: 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  sult = -1;.    }
43a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 75 62  else{.      doub
43b0: 6c 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20 20  le rA, rB;.     
43c0: 20 72 41 20 3d 20 73 71 6c 69 74 65 41 74 6f 46   rA = sqliteAtoF
43d0: 28 61 74 65 78 74 2c 20 30 29 3b 0a 20 20 20 20  (atext, 0);.    
43e0: 20 20 72 42 20 3d 20 73 71 6c 69 74 65 41 74 6f    rB = sqliteAto
43f0: 46 28 62 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  F(btext, 0);.   
4400: 20 20 20 69 66 28 20 72 41 3c 72 42 20 29 7b 0a     if( rA<rB ){.
4410: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4420: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
4430: 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a 20 20   if( rA>rB ){.  
4440: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2b        result = +
4450: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
4460: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4470: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4480: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  }.  }else if( is
4490: 4e 75 6d 42 20 29 7b 0a 20 20 20 20 72 65 73 75  NumB ){.    resu
44a0: 6c 74 20 3d 20 2b 31 3b 0a 20 20 7d 65 6c 73 65  lt = +1;.  }else
44b0: 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20   {.    result = 
44c0: 73 74 72 63 6d 70 28 61 74 65 78 74 2c 20 62 74  strcmp(atext, bt
44d0: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ext);.  }.  retu
44e0: 72 6e 20 72 65 73 75 6c 74 3b 20 0a 7d 0a 0a 2f  rn result; .}../
44f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4500: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 73 6f  e is used for so
4510: 72 74 69 6e 67 2e 20 20 45 61 63 68 20 6b 65 79  rting.  Each key
4520: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6f 6e   is a list of on
4530: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c  e or more.** nul
4540: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 65 6c 65  l-terminated ele
4550: 6d 65 6e 74 73 2e 20 20 54 68 65 20 6c 69 73 74  ments.  The list
4560: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62   is terminated b
4570: 79 20 74 77 6f 20 6e 75 6c 6c 73 20 69 6e 0a 2a  y two nulls in.*
4580: 2a 20 61 20 72 6f 77 2e 20 20 46 6f 72 20 65 78  * a row.  For ex
4590: 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  ample, the follo
45a0: 77 69 6e 67 20 74 65 78 74 20 69 73 20 61 20 6b  wing text is a k
45b0: 65 79 20 77 69 74 68 20 74 68 72 65 65 20 65 6c  ey with three el
45c0: 65 6d 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ements.**.**    
45d0: 20 20 20 20 20 20 20 20 41 6f 6e 65 5c 30 30 30          Aone\000
45e0: 44 74 77 6f 5c 30 30 30 41 74 68 72 65 65 5c 30  Dtwo\000Athree\0
45f0: 30 30 5c 30 30 30 0a 2a 2a 0a 2a 2a 20 41 6c 6c  00\000.**.** All
4600: 20 65 6c 65 6d 65 6e 74 73 20 62 65 67 69 6e 20   elements begin 
4610: 77 69 74 68 20 6f 6e 65 20 6f 66 20 74 68 65 20  with one of the 
4620: 63 68 61 72 61 63 74 65 72 73 20 22 2b 2d 41 44  characters "+-AD
4630: 22 20 61 6e 64 20 65 6e 64 20 77 69 74 68 20 22  " and end with "
4640: 5c 30 30 30 22 0a 2a 2a 20 77 69 74 68 20 7a 65  \000".** with ze
4650: 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 78 74 20  ro or more text 
4660: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 62 65 74 77  elements in betw
4670: 65 65 6e 2e 20 20 45 78 63 65 70 74 2c 20 4e 55  een.  Except, NU
4680: 4c 4c 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 63  LL elements.** c
4690: 6f 6e 73 69 73 74 20 6f 66 20 74 68 65 20 73 70  onsist of the sp
46a0: 65 63 69 61 6c 20 74 77 6f 2d 63 68 61 72 61 63  ecial two-charac
46b0: 74 65 72 20 73 65 71 75 65 6e 63 65 20 22 4e 5c  ter sequence "N\
46c0: 30 30 30 22 2e 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  000"..**.** Both
46d0: 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20   arguments will 
46e0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
46f0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4700: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
4710: 2a 2a 20 72 65 74 75 72 6e 73 20 6e 65 67 61 74  ** returns negat
4720: 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
4730: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4740: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
4750: 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 2c 20 65 71  less.** than, eq
4760: 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
4770: 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
4780: 74 2e 20 20 28 52 65 73 75 6c 74 20 69 73 20 61  t.  (Result is a
4790: 2d 62 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  -b)..**.** Each 
47a0: 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77  element begins w
47b0: 69 74 68 20 6f 6e 65 20 6f 66 20 74 68 65 20 63  ith one of the c
47c0: 68 61 72 61 63 74 65 72 73 20 22 2b 22 2c 20 22  haracters "+", "
47d0: 2d 22 2c 20 22 41 22 2c 20 22 44 22 2e 0a 2a 2a  -", "A", "D"..**
47e0: 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72 20   This character 
47f0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 73  determines the s
4800: 6f 72 74 20 6f 72 64 65 72 20 61 6e 64 20 63 6f  ort order and co
4810: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4820: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 20 20  :.**.**     +   
4830: 20 20 20 53 6f 72 74 20 6e 75 6d 65 72 69 63 61     Sort numerica
4840: 6c 6c 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  lly in ascending
4850: 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 20 2d 20   order.**     - 
4860: 20 20 20 20 20 53 6f 72 74 20 6e 75 6d 65 72 69       Sort numeri
4870: 63 61 6c 6c 79 20 69 6e 20 64 65 73 63 65 6e 64  cally in descend
4880: 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20  ing order.**    
4890: 20 41 20 20 20 20 20 20 53 6f 72 74 20 61 73 20   A      Sort as 
48a0: 73 74 72 69 6e 67 73 20 69 6e 20 61 73 63 65 6e  strings in ascen
48b0: 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20  ding order.**   
48c0: 20 20 44 20 20 20 20 20 20 53 6f 72 74 20 61 73    D      Sort as
48d0: 20 73 74 72 69 6e 67 73 20 69 6e 20 64 65 73 63   strings in desc
48e0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a  ending order..**
48f0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 22 2b 22 20  .** For the "+" 
4900: 61 6e 64 20 22 2d 22 20 73 6f 72 74 69 6e 67 2c  and "-" sorting,
4910: 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74   pure numeric st
4920: 72 69 6e 67 73 20 28 73 74 72 69 6e 67 73 20 66  rings (strings f
4930: 6f 72 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20  or which the.** 
4940: 69 73 4e 75 6d 28 29 20 66 75 6e 63 74 69 6f 6e  isNum() function
4950: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 73 20 54   above returns T
4960: 52 55 45 29 20 61 6c 77 61 79 73 20 63 6f 6d 70  RUE) always comp
4970: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74  are less than st
4980: 72 69 6e 67 73 0a 2a 2a 20 74 68 61 74 20 61 72  rings.** that ar
4990: 65 20 6e 6f 74 20 70 75 72 65 20 6e 75 6d 65 72  e not pure numer
49a0: 69 63 73 2e 20 20 4e 6f 6e 2d 6e 75 6d 65 72 69  ics.  Non-numeri
49b0: 63 20 73 74 72 69 6e 67 73 20 63 6f 6d 70 61 72  c strings compar
49c0: 65 20 69 6e 20 6d 65 6d 63 6d 70 28 29 0a 2a 2a  e in memcmp().**
49d0: 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73   order.  This is
49e0: 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f   the same sort o
49f0: 72 64 65 72 20 61 73 20 74 68 65 20 73 71 6c 69  rder as the sqli
4a00: 74 65 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  teCompare() func
4a10: 74 69 6f 6e 0a 2a 2a 20 61 62 6f 76 65 20 67 65  tion.** above ge
4a20: 6e 65 72 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  nerates..**.** T
4a30: 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73  he last point is
4a40: 20 61 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 76   a change from v
4a50: 65 72 73 69 6f 6e 20 32 2e 36 2e 33 20 74 6f 20  ersion 2.6.3 to 
4a60: 76 65 72 73 69 6f 6e 20 32 2e 37 2e 30 2e 20 20  version 2.7.0.  
4a70: 49 6e 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32 2e  In.** version 2.
4a80: 36 2e 33 20 61 6e 64 20 65 61 72 6c 69 65 72 2c  6.3 and earlier,
4a90: 20 73 75 62 73 74 72 69 6e 67 73 20 6f 66 20 64   substrings of d
4aa0: 69 67 69 74 73 20 63 6f 6d 70 61 72 65 20 69 6e  igits compare in
4ab0: 20 6e 75 6d 65 72 69 63 61 6c 20 0a 2a 2a 20 61   numerical .** a
4ac0: 6e 64 20 63 61 73 65 20 77 61 73 20 75 73 65 64  nd case was used
4ad0: 20 6f 6e 6c 79 20 74 6f 20 62 72 65 61 6b 20 61   only to break a
4ae0: 20 74 69 65 2e 0a 2a 2a 0a 2a 2a 20 45 6c 65 6d   tie..**.** Elem
4af0: 65 6e 74 73 20 74 68 61 74 20 62 65 67 69 6e 20  ents that begin 
4b00: 77 69 74 68 20 27 41 27 20 6f 72 20 27 44 27 20  with 'A' or 'D' 
4b10: 63 6f 6d 70 61 72 65 20 69 6e 20 6d 65 6d 63 6d  compare in memcm
4b20: 70 28 29 20 6f 72 64 65 72 20 72 65 67 61 72 64  p() order regard
4b30: 6c 65 73 73 0a 2a 2a 20 6f 66 20 77 68 65 74 68  less.** of wheth
4b40: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 79 20 6c  er or not they l
4b50: 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65  ook like a numbe
4b60: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  r..**.** Note th
4b70: 61 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  at the sort orde
4b80: 72 20 69 6d 70 6f 73 65 64 20 62 79 20 74 68 65  r imposed by the
4b90: 20 72 75 6c 65 73 20 61 62 6f 76 65 20 69 73 20   rules above is 
4ba0: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 66 72 6f 6d  the same.** from
4bb0: 20 74 68 65 20 6f 72 64 65 72 69 6e 67 20 64 65   the ordering de
4bc0: 66 69 6e 65 64 20 62 79 20 74 68 65 20 22 3c 22  fined by the "<"
4bd0: 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 61 6e 64  , "<=", ">", and
4be0: 20 22 3e 3d 22 20 6f 70 65 72 61 74 6f 72 73 0a   ">=" operators.
4bf0: 2a 2a 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  ** of expression
4c00: 73 20 61 6e 64 20 66 6f 72 20 69 6e 64 69 63 65  s and for indice
4c10: 73 2e 20 20 54 68 69 73 20 77 61 73 20 6e 6f 74  s.  This was not
4c20: 20 74 68 65 20 63 61 73 65 20 66 6f 72 20 76 65   the case for ve
4c30: 72 73 69 6f 6e 0a 2a 2a 20 32 2e 36 2e 33 20 61  rsion.** 2.6.3 a
4c40: 6e 64 20 65 61 72 6c 69 65 72 2e 0a 2a 2f 0a 69  nd earlier..*/.i
4c50: 6e 74 20 73 71 6c 69 74 65 53 6f 72 74 43 6f 6d  nt sqliteSortCom
4c60: 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pare(const char 
4c70: 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *a, const char *
4c80: 62 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  b){.  int res = 
4c90: 30 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41 2c  0;.  int isNumA,
4ca0: 20 69 73 4e 75 6d 42 3b 0a 20 20 69 6e 74 20 64   isNumB;.  int d
4cb0: 69 72 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ir = 0;..  while
4cc0: 28 20 72 65 73 3d 3d 30 20 26 26 20 2a 61 20 26  ( res==0 && *a &
4cd0: 26 20 2a 62 20 29 7b 0a 20 20 20 20 69 66 28 20  & *b ){.    if( 
4ce0: 61 5b 30 5d 3d 3d 27 4e 27 20 7c 7c 20 62 5b 30  a[0]=='N' || b[0
4cf0: 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='N' ){.      
4d00: 69 66 28 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20 29  if( a[0]==b[0] )
4d10: 7b 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20 32  {.        a += 2
4d20: 3b 0a 20 20 20 20 20 20 20 20 62 20 2b 3d 20 32  ;.        b += 2
4d30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
4d40: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
4d50: 20 20 69 66 28 20 61 5b 30 5d 3d 3d 27 4e 27 20    if( a[0]=='N' 
4d60: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 72 20 3d  ){.        dir =
4d70: 20 62 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 72   b[0];.        r
4d80: 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  es = -1;.      }
4d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 69  else{.        di
4da0: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
4db0: 20 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20    res = +1;.    
4dc0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4de0: 74 28 20 61 5b 30 5d 3d 3d 62 5b 30 5d 20 29 3b  t( a[0]==b[0] );
4df0: 0a 20 20 20 20 69 66 28 20 28 64 69 72 3d 61 5b  .    if( (dir=a[
4e00: 30 5d 29 3d 3d 27 41 27 20 7c 7c 20 61 5b 30 5d  0])=='A' || a[0]
4e10: 3d 3d 27 44 27 20 29 7b 0a 20 20 20 20 20 20 72  =='D' ){.      r
4e20: 65 73 20 3d 20 73 74 72 63 6d 70 28 26 61 5b 31  es = strcmp(&a[1
4e30: 5d 2c 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20  ],&b[1]);.      
4e40: 69 66 28 20 72 65 73 20 29 20 62 72 65 61 6b 3b  if( res ) break;
4e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4e60: 20 20 69 73 4e 75 6d 41 20 3d 20 73 71 6c 69 74    isNumA = sqlit
4e70: 65 49 73 4e 75 6d 62 65 72 28 26 61 5b 31 5d 29  eIsNumber(&a[1])
4e80: 3b 0a 20 20 20 20 20 20 69 73 4e 75 6d 42 20 3d  ;.      isNumB =
4e90: 20 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28   sqliteIsNumber(
4ea0: 26 62 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  &b[1]);.      if
4eb0: 28 20 69 73 4e 75 6d 41 20 29 7b 0a 20 20 20 20  ( isNumA ){.    
4ec0: 20 20 20 20 64 6f 75 62 6c 65 20 72 41 2c 20 72      double rA, r
4ed0: 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  B;.        if( !
4ee0: 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20  isNumB ){.      
4ef0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
4f00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4f20: 20 72 41 20 3d 20 73 71 6c 69 74 65 41 74 6f 46   rA = sqliteAtoF
4f30: 28 26 61 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  (&a[1], 0);.    
4f40: 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65 41      rB = sqliteA
4f50: 74 6f 46 28 26 62 5b 31 5d 2c 20 30 29 3b 0a 20  toF(&b[1], 0);. 
4f60: 20 20 20 20 20 20 20 69 66 28 20 72 41 3c 72 42         if( rA<rB
4f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
4f80: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  s = -1;.        
4f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4fa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
4fb0: 41 3e 72 42 20 29 7b 0a 20 20 20 20 20 20 20 20  A>rB ){.        
4fc0: 20 20 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20    res = +1;.    
4fd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4fe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
4ff0: 73 65 20 69 66 28 20 69 73 4e 75 6d 42 20 29 7b  se if( isNumB ){
5000: 0a 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 62 72 65 61 6b  1;.        break
5020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5030: 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 74 72         res = str
5040: 63 6d 70 28 26 61 5b 31 5d 2c 26 62 5b 31 5d 29  cmp(&a[1],&b[1])
5050: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
5060: 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  s ) break;.     
5070: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 20 2b   }.    }.    a +
5080: 3d 20 73 74 72 6c 65 6e 28 26 61 5b 31 5d 29 20  = strlen(&a[1]) 
5090: 2b 20 32 3b 0a 20 20 20 20 62 20 2b 3d 20 73 74  + 2;.    b += st
50a0: 72 6c 65 6e 28 26 62 5b 31 5d 29 20 2b 20 32 3b  rlen(&b[1]) + 2;
50b0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 72 3d 3d  .  }.  if( dir==
50c0: 27 2d 27 20 7c 7c 20 64 69 72 3d 3d 27 44 27 20  '-' || dir=='D' 
50d0: 29 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20  ) res = -res;.  
50e0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
50f0: 2a 0a 2a 2a 20 53 6f 6d 65 20 70 6f 77 65 72 73  *.** Some powers
5100: 20 6f 66 20 36 34 2e 20 20 54 68 65 73 65 20 63   of 64.  These c
5110: 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 6e 65 65  onstants are nee
5120: 64 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  ded in the.** sq
5130: 6c 69 74 65 52 65 61 6c 54 6f 53 6f 72 74 61 62  liteRealToSortab
5140: 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c  le() routine bel
5150: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  ow..*/.#define _
5160: 36 34 65 33 20 20 28 36 34 2e 30 20 2a 20 36 34  64e3  (64.0 * 64
5170: 2e 30 20 2a 20 36 34 2e 30 29 0a 23 64 65 66 69  .0 * 64.0).#defi
5180: 6e 65 20 5f 36 34 65 34 20 20 28 36 34 2e 30 20  ne _64e4  (64.0 
5190: 2a 20 36 34 2e 30 20 2a 20 36 34 2e 30 20 2a 20  * 64.0 * 64.0 * 
51a0: 36 34 2e 30 29 0a 23 64 65 66 69 6e 65 20 5f 36  64.0).#define _6
51b0: 34 65 31 35 20 28 5f 36 34 65 33 20 2a 20 5f 36  4e15 (_64e3 * _6
51c0: 34 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36  4e4 * _64e4 * _6
51d0: 34 65 34 29 0a 23 64 65 66 69 6e 65 20 5f 36 34  4e4).#define _64
51e0: 65 31 36 20 28 5f 36 34 65 34 20 2a 20 5f 36 34  e16 (_64e4 * _64
51f0: 65 34 20 2a 20 5f 36 34 65 34 20 2a 20 5f 36 34  e4 * _64e4 * _64
5200: 65 34 29 0a 23 64 65 66 69 6e 65 20 5f 36 34 65  e4).#define _64e
5210: 36 33 20 28 5f 36 34 65 31 35 20 2a 20 5f 36 34  63 (_64e15 * _64
5220: 65 31 36 20 2a 20 5f 36 34 65 31 36 20 2a 20 5f  e16 * _64e16 * _
5230: 36 34 65 31 36 29 0a 23 64 65 66 69 6e 65 20 5f  64e16).#define _
5240: 36 34 65 36 34 20 28 5f 36 34 65 31 36 20 2a 20  64e64 (_64e16 * 
5250: 5f 36 34 65 31 36 20 2a 20 5f 36 34 65 31 36 20  _64e16 * _64e16 
5260: 2a 20 5f 36 34 65 31 36 29 0a 0a 2f 2a 0a 2a 2a  * _64e16)../*.**
5270: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
5280: 72 6f 63 65 64 75 72 65 20 63 6f 6e 76 65 72 74  rocedure convert
5290: 73 20 61 20 64 6f 75 62 6c 65 2d 70 72 65 63 69  s a double-preci
52a0: 73 69 6f 6e 20 66 6c 6f 61 74 69 6e 67 20 70 6f  sion floating po
52b0: 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 6e  int.** number in
52c0: 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  to a string.  Th
52d0: 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69  e resulting stri
52e0: 6e 67 20 68 61 73 20 74 68 65 20 70 72 6f 70 65  ng has the prope
52f0: 72 74 79 20 74 68 61 74 0a 2a 2a 20 74 77 6f 20  rty that.** two 
5300: 73 75 63 68 20 73 74 72 69 6e 67 73 20 63 6f 6d  such strings com
5310: 70 61 72 69 65 64 20 75 73 69 6e 67 20 73 74 72  paried using str
5320: 63 6d 70 28 29 20 6f 72 20 6d 65 6d 63 6d 70 28  cmp() or memcmp(
5330: 29 20 77 69 6c 6c 20 67 69 76 65 20 74 68 65 0a  ) will give the.
5340: 2a 2a 20 73 61 6d 65 20 72 65 73 75 6c 74 73 20  ** same results 
5350: 61 73 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d  as a numeric com
5360: 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 6f  parison of the o
5370: 72 69 67 69 6e 61 6c 20 66 6c 6f 61 74 69 6e 67  riginal floating
5380: 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72   point.** number
5390: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
53a0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
53b0: 20 67 65 6e 65 72 61 74 65 20 64 61 74 61 62 61   generate databa
53c0: 73 65 20 6b 65 79 73 20 66 72 6f 6d 20 66 6c 6f  se keys from flo
53d0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e  ating point.** n
53e0: 75 6d 62 65 72 73 20 73 75 63 68 20 74 68 61 74  umbers such that
53f0: 20 74 68 65 20 6b 65 79 73 20 73 6f 72 74 20 69   the keys sort i
5400: 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
5410: 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
5420: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
5430: 6e 74 20 6e 75 6d 62 65 72 73 20 65 76 65 6e 20  nt numbers even 
5440: 74 68 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20  though the keys 
5450: 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69  are compared usi
5460: 6e 67 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 2e 0a  ng.** memcmp()..
5470: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
5480: 67 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  g function shoul
5490: 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
54a0: 20 61 74 20 6c 65 61 73 74 20 31 34 20 63 68 61   at least 14 cha
54b0: 72 61 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 70  racters.** of sp
54c0: 61 63 65 20 66 6f 72 20 74 68 65 20 62 75 66 66  ace for the buff
54d0: 65 72 20 7a 5b 5d 2e 0a 2a 2f 0a 76 6f 69 64 20  er z[]..*/.void 
54e0: 73 71 6c 69 74 65 52 65 61 6c 54 6f 53 6f 72 74  sqliteRealToSort
54f0: 61 62 6c 65 28 64 6f 75 62 6c 65 20 72 2c 20 63  able(double r, c
5500: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
5510: 65 67 3b 0a 20 20 69 6e 74 20 65 78 70 3b 0a 20  eg;.  int exp;. 
5520: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
5530: 20 2f 2a 20 54 68 69 73 20 61 72 72 61 79 20 6d   /* This array m
5540: 61 70 73 20 69 6e 74 65 67 65 72 73 20 62 65 74  aps integers bet
5550: 77 65 65 6e 20 30 20 61 6e 64 20 36 33 20 69 6e  ween 0 and 63 in
5560: 74 6f 20 62 61 73 65 2d 36 34 20 64 69 67 69 74  to base-64 digit
5570: 73 2e 0a 20 20 2a 2a 20 54 68 65 20 64 69 67 69  s..  ** The digi
5580: 74 73 20 6d 75 73 74 20 62 65 20 63 68 6f 73 65  ts must be chose
5590: 6e 20 73 75 63 68 20 61 74 20 74 68 65 69 72 20  n such at their 
55a0: 41 53 43 49 49 20 63 6f 64 65 73 20 61 72 65 20  ASCII codes are 
55b0: 69 6e 63 72 65 61 73 69 6e 67 2e 0a 20 20 2a 2a  increasing..  **
55c0: 20 54 68 69 73 20 6d 65 61 6e 73 20 77 65 20 63   This means we c
55d0: 61 6e 20 6e 6f 74 20 75 73 65 20 74 68 65 20 74  an not use the t
55e0: 72 61 64 69 74 69 6f 6e 61 6c 20 62 61 73 65 2d  raditional base-
55f0: 36 34 20 64 69 67 69 74 20 73 65 74 2e 20 2a 2f  64 digit set. */
5600: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5610: 63 68 61 72 20 7a 44 69 67 69 74 5b 5d 20 3d 20  char zDigit[] = 
5620: 0a 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38  .     "012345678
5630: 39 22 0a 20 20 20 20 20 22 41 42 43 44 45 46 47  9".     "ABCDEFG
5640: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
5650: 58 59 5a 22 0a 20 20 20 20 20 22 61 62 63 64 65  XYZ".     "abcde
5660: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
5670: 76 77 78 79 7a 22 0a 20 20 20 20 20 22 7c 7e 22  vwxyz".     "|~"
5680: 3b 0a 20 20 69 66 28 20 72 3c 30 2e 30 20 29 7b  ;.  if( r<0.0 ){
5690: 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20  .    neg = 1;.  
56a0: 20 20 72 20 3d 20 2d 72 3b 0a 20 20 20 20 2a 7a    r = -r;.    *z
56b0: 2b 2b 20 3d 20 27 2d 27 3b 0a 20 20 7d 20 65 6c  ++ = '-';.  } el
56c0: 73 65 20 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30  se {.    neg = 0
56d0: 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 27 30 27  ;.    *z++ = '0'
56e0: 3b 0a 20 20 7d 0a 20 20 65 78 70 20 3d 20 30 3b  ;.  }.  exp = 0;
56f0: 0a 0a 20 20 69 66 28 20 72 3d 3d 30 2e 30 20 29  ..  if( r==0.0 )
5700: 7b 0a 20 20 20 20 65 78 70 20 3d 20 2d 31 30 32  {.    exp = -102
5710: 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  4;.  }else if( r
5720: 3c 28 30 2e 35 2f 36 34 2e 30 29 20 29 7b 0a 20  <(0.5/64.0) ){. 
5730: 20 20 20 77 68 69 6c 65 28 20 72 20 3c 20 30 2e     while( r < 0.
5740: 35 2f 5f 36 34 65 36 34 20 26 26 20 65 78 70 20  5/_64e64 && exp 
5750: 3e 20 2d 39 36 31 20 20 29 7b 20 72 20 2a 3d 20  > -961  ){ r *= 
5760: 5f 36 34 65 36 34 3b 20 20 65 78 70 20 2d 3d 20  _64e64;  exp -= 
5770: 36 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  64; }.    while(
5780: 20 72 20 3c 20 30 2e 35 2f 5f 36 34 65 31 36 20   r < 0.5/_64e16 
5790: 26 26 20 65 78 70 20 3e 20 2d 31 30 30 39 20 29  && exp > -1009 )
57a0: 7b 20 72 20 2a 3d 20 5f 36 34 65 31 36 3b 20 20  { r *= _64e16;  
57b0: 65 78 70 20 2d 3d 20 31 36 3b 20 7d 0a 20 20 20  exp -= 16; }.   
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 34 20 20 26 26 20 65 78 70 20 3e 20  _64e4  && exp > 
57e0: 2d 31 30 32 31 20 29 7b 20 72 20 2a 3d 20 5f 36  -1021 ){ r *= _6
57f0: 34 65 34 3b 20 20 20 65 78 70 20 2d 3d 20 34 3b  4e4;   exp -= 4;
5800: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20   }.    while( r 
5810: 3c 20 30 2e 35 2f 36 34 2e 30 20 20 20 26 26 20  < 0.5/64.0   && 
5820: 65 78 70 20 3e 20 2d 31 30 32 34 20 29 7b 20 72  exp > -1024 ){ r
5830: 20 2a 3d 20 36 34 2e 30 3b 20 20 20 20 65 78 70   *= 64.0;    exp
5840: 20 2d 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65   -= 1; }.  }else
5850: 20 69 66 28 20 72 3e 3d 30 2e 35 20 29 7b 0a 20   if( r>=0.5 ){. 
5860: 20 20 20 77 68 69 6c 65 28 20 72 20 3e 3d 20 30     while( r >= 0
5870: 2e 35 2a 5f 36 34 65 36 33 20 26 26 20 65 78 70  .5*_64e63 && exp
5880: 20 3c 20 39 36 30 20 20 29 7b 20 72 20 2a 3d 20   < 960  ){ r *= 
5890: 31 2e 30 2f 5f 36 34 65 36 34 3b 20 65 78 70 20  1.0/_64e64; exp 
58a0: 2b 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68 69  += 64; }.    whi
58b0: 6c 65 28 20 72 20 3e 3d 20 30 2e 35 2a 5f 36 34  le( r >= 0.5*_64
58c0: 65 31 35 20 26 26 20 65 78 70 20 3c 20 31 30 30  e15 && exp < 100
58d0: 38 20 29 7b 20 72 20 2a 3d 20 31 2e 30 2f 5f 36  8 ){ r *= 1.0/_6
58e0: 34 65 31 36 3b 20 65 78 70 20 2b 3d 20 31 36 3b  4e16; exp += 16;
58f0: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 72 20   }.    while( r 
5900: 3e 3d 20 30 2e 35 2a 5f 36 34 65 33 20 20 26 26  >= 0.5*_64e3  &&
5910: 20 65 78 70 20 3c 20 31 30 32 30 20 29 7b 20 72   exp < 1020 ){ r
5920: 20 2a 3d 20 31 2e 30 2f 5f 36 34 65 34 3b 20 20   *= 1.0/_64e4;  
5930: 65 78 70 20 2b 3d 20 34 3b 20 7d 0a 20 20 20 20  exp += 4; }.    
5940: 77 68 69 6c 65 28 20 72 20 3e 3d 20 30 2e 35 20  while( r >= 0.5 
5950: 20 20 20 20 20 20 20 26 26 20 65 78 70 20 3c 20         && exp < 
5960: 31 30 32 33 20 29 7b 20 72 20 2a 3d 20 31 2e 30  1023 ){ r *= 1.0
5970: 2f 36 34 2e 30 3b 20 20 20 65 78 70 20 2b 3d 20  /64.0;   exp += 
5980: 31 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e  1; }.  }.  if( n
5990: 65 67 20 29 7b 0a 20 20 20 20 65 78 70 20 3d 20  eg ){.    exp = 
59a0: 2d 65 78 70 3b 0a 20 20 20 20 72 20 3d 20 2d 72  -exp;.    r = -r
59b0: 3b 0a 20 20 7d 0a 20 20 65 78 70 20 2b 3d 20 31  ;.  }.  exp += 1
59c0: 30 32 34 3b 0a 20 20 72 20 2b 3d 20 30 2e 35 3b  024;.  r += 0.5;
59d0: 0a 20 20 69 66 28 20 65 78 70 3c 30 20 29 20 72  .  if( exp<0 ) r
59e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 65 78 70  eturn;.  if( exp
59f0: 3e 3d 32 30 34 38 20 7c 7c 20 72 3e 3d 31 2e 30  >=2048 || r>=1.0
5a00: 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
5a10: 2c 20 22 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 22  , "~~~~~~~~~~~~"
5a20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5a30: 20 7d 0a 20 20 2a 7a 2b 2b 20 3d 20 7a 44 69 67   }.  *z++ = zDig
5a40: 69 74 5b 28 65 78 70 3e 3e 36 29 26 30 78 33 66  it[(exp>>6)&0x3f
5a50: 5d 3b 0a 20 20 2a 7a 2b 2b 20 3d 20 7a 44 69 67  ];.  *z++ = zDig
5a60: 69 74 5b 65 78 70 20 26 20 30 78 33 66 5d 3b 0a  it[exp & 0x3f];.
5a70: 20 20 77 68 69 6c 65 28 20 72 3e 30 2e 30 20 26    while( r>0.0 &
5a80: 26 20 63 6e 74 3c 31 30 20 29 7b 0a 20 20 20 20  & cnt<10 ){.    
5a90: 69 6e 74 20 64 69 67 69 74 3b 0a 20 20 20 20 72  int digit;.    r
5aa0: 20 2a 3d 20 36 34 2e 30 3b 0a 20 20 20 20 64 69   *= 64.0;.    di
5ab0: 67 69 74 20 3d 20 28 69 6e 74 29 72 3b 0a 20 20  git = (int)r;.  
5ac0: 20 20 61 73 73 65 72 74 28 20 64 69 67 69 74 3e    assert( digit>
5ad0: 3d 30 20 26 26 20 64 69 67 69 74 3c 36 34 20 29  =0 && digit<64 )
5ae0: 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 7a 44 69  ;.    *z++ = zDi
5af0: 67 69 74 5b 64 69 67 69 74 20 26 20 30 78 33 66  git[digit & 0x3f
5b00: 5d 3b 0a 20 20 20 20 72 20 2d 3d 20 64 69 67 69  ];.    r -= digi
5b10: 74 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  t;.    cnt++;.  
5b20: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 23  }.  *z = 0;.}..#
5b30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 54 46  ifdef SQLITE_UTF
5b40: 38 0a 2f 2a 0a 2a 2a 20 58 20 69 73 20 61 20 70  8./*.** X is a p
5b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
5b60: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 55 54  rst byte of a UT
5b70: 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20  F-8 character.  
5b80: 49 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 58 20 73  Increment.** X s
5b90: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
5ba0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61   to the next cha
5bb0: 72 61 63 74 65 72 2e 20 20 54 68 69 73 20 6f 6e  racter.  This on
5bc0: 6c 79 20 77 6f 72 6b 73 20 72 69 67 68 74 0a 2a  ly works right.*
5bd0: 2a 20 69 66 20 58 20 70 6f 69 6e 74 73 20 74 6f  * if X points to
5be0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 55   a well-formed U
5bf0: 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  TF-8 string..*/.
5c00: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 4e 65  #define sqliteNe
5c10: 78 74 43 68 61 72 28 58 29 20 20 77 68 69 6c 65  xtChar(X)  while
5c20: 28 20 28 30 78 63 30 26 2a 2b 2b 28 58 29 29 3d  ( (0xc0&*++(X))=
5c30: 3d 30 78 38 30 20 29 7b 7d 0a 23 64 65 66 69 6e  =0x80 ){}.#defin
5c40: 65 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28  e sqliteCharVal(
5c50: 58 29 20 20 20 73 71 6c 69 74 65 5f 75 74 66 38  X)   sqlite_utf8
5c60: 5f 74 6f 5f 69 6e 74 28 58 29 0a 0a 23 65 6c 73  _to_int(X)..#els
5c70: 65 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  e /* !defined(SQ
5c80: 4c 49 54 45 5f 55 54 46 38 29 20 2a 2f 0a 2f 2a  LITE_UTF8) */./*
5c90: 0a 2a 2a 20 46 6f 72 20 69 73 6f 38 38 35 39 20  .** For iso8859 
5ca0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 6e 65  encoding, the ne
5cb0: 78 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20  xt character is 
5cc0: 6a 75 73 74 20 74 68 65 20 6e 65 78 74 20 62 79  just the next by
5cd0: 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73  te..*/.#define s
5ce0: 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 58 29  qliteNextChar(X)
5cf0: 20 20 28 2b 2b 28 58 29 29 3b 0a 23 64 65 66 69    (++(X));.#defi
5d00: 6e 65 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c  ne sqliteCharVal
5d10: 28 58 29 20 20 20 28 28 69 6e 74 29 2a 28 58 29  (X)   ((int)*(X)
5d20: 29 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  )..#endif /* def
5d30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38  ined(SQLITE_UTF8
5d40: 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51  ) */...#ifdef SQ
5d50: 4c 49 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20  LITE_UTF8./*.** 
5d60: 43 6f 6e 76 65 72 74 20 74 68 65 20 55 54 46 2d  Convert the UTF-
5d70: 38 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 77  8 character to w
5d80: 68 69 63 68 20 7a 20 70 6f 69 6e 74 73 20 69 6e  hich z points in
5d90: 74 6f 20 61 20 33 31 2d 62 69 74 0a 2a 2a 20 55  to a 31-bit.** U
5da0: 43 53 20 63 68 61 72 61 63 74 65 72 2e 20 20 54  CS character.  T
5db0: 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72  his only works r
5dc0: 69 67 68 74 20 69 66 20 7a 20 70 6f 69 6e 74 73  ight if z points
5dd0: 20 74 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   to a well-forme
5de0: 64 0a 2a 2a 20 55 54 46 2d 38 20 73 74 72 69 6e  d.** UTF-8 strin
5df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5e00: 20 73 71 6c 69 74 65 5f 75 74 66 38 5f 74 6f 5f   sqlite_utf8_to_
5e10: 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  int(const unsign
5e20: 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  ed char *z){.  i
5e30: 6e 74 20 63 3b 0a 20 20 73 74 61 74 69 63 20 63  nt c;.  static c
5e40: 6f 6e 73 74 20 69 6e 74 20 69 6e 69 74 56 61 6c  onst int initVal
5e50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 20  [] = {.      0, 
5e60: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20    1,   2,   3,  
5e70: 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20   4,   5,   6,   
5e80: 37 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30  7,   8,   9,  10
5e90: 2c 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c  ,  11,  12,  13,
5ea0: 20 20 31 34 2c 0a 20 20 20 20 20 31 35 2c 20 20    14,.     15,  
5eb0: 31 36 2c 20 20 31 37 2c 20 20 31 38 2c 20 20 31  16,  17,  18,  1
5ec0: 39 2c 20 20 32 30 2c 20 20 32 31 2c 20 20 32 32  9,  20,  21,  22
5ed0: 2c 20 20 32 33 2c 20 20 32 34 2c 20 20 32 35 2c  ,  23,  24,  25,
5ee0: 20 20 32 36 2c 20 20 32 37 2c 20 20 32 38 2c 20    26,  27,  28, 
5ef0: 20 32 39 2c 0a 20 20 20 20 20 33 30 2c 20 20 33   29,.     30,  3
5f00: 31 2c 20 20 33 32 2c 20 20 33 33 2c 20 20 33 34  1,  32,  33,  34
5f10: 2c 20 20 33 35 2c 20 20 33 36 2c 20 20 33 37 2c  ,  35,  36,  37,
5f20: 20 20 33 38 2c 20 20 33 39 2c 20 20 34 30 2c 20    38,  39,  40, 
5f30: 20 34 31 2c 20 20 34 32 2c 20 20 34 33 2c 20 20   41,  42,  43,  
5f40: 34 34 2c 0a 20 20 20 20 20 34 35 2c 20 20 34 36  44,.     45,  46
5f50: 2c 20 20 34 37 2c 20 20 34 38 2c 20 20 34 39 2c  ,  47,  48,  49,
5f60: 20 20 35 30 2c 20 20 35 31 2c 20 20 35 32 2c 20    50,  51,  52, 
5f70: 20 35 33 2c 20 20 35 34 2c 20 20 35 35 2c 20 20   53,  54,  55,  
5f80: 35 36 2c 20 20 35 37 2c 20 20 35 38 2c 20 20 35  56,  57,  58,  5
5f90: 39 2c 0a 20 20 20 20 20 36 30 2c 20 20 36 31 2c  9,.     60,  61,
5fa0: 20 20 36 32 2c 20 20 36 33 2c 20 20 36 34 2c 20    62,  63,  64, 
5fb0: 20 36 35 2c 20 20 36 36 2c 20 20 36 37 2c 20 20   65,  66,  67,  
5fc0: 36 38 2c 20 20 36 39 2c 20 20 37 30 2c 20 20 37  68,  69,  70,  7
5fd0: 31 2c 20 20 37 32 2c 20 20 37 33 2c 20 20 37 34  1,  72,  73,  74
5fe0: 2c 0a 20 20 20 20 20 37 35 2c 20 20 37 36 2c 20  ,.     75,  76, 
5ff0: 20 37 37 2c 20 20 37 38 2c 20 20 37 39 2c 20 20   77,  78,  79,  
6000: 38 30 2c 20 20 38 31 2c 20 20 38 32 2c 20 20 38  80,  81,  82,  8
6010: 33 2c 20 20 38 34 2c 20 20 38 35 2c 20 20 38 36  3,  84,  85,  86
6020: 2c 20 20 38 37 2c 20 20 38 38 2c 20 20 38 39 2c  ,  87,  88,  89,
6030: 0a 20 20 20 20 20 39 30 2c 20 20 39 31 2c 20 20  .     90,  91,  
6040: 39 32 2c 20 20 39 33 2c 20 20 39 34 2c 20 20 39  92,  93,  94,  9
6050: 35 2c 20 20 39 36 2c 20 20 39 37 2c 20 20 39 38  5,  96,  97,  98
6060: 2c 20 20 39 39 2c 20 31 30 30 2c 20 31 30 31 2c  ,  99, 100, 101,
6070: 20 31 30 32 2c 20 31 30 33 2c 20 31 30 34 2c 0a   102, 103, 104,.
6080: 20 20 20 20 31 30 35 2c 20 31 30 36 2c 20 31 30      105, 106, 10
6090: 37 2c 20 31 30 38 2c 20 31 30 39 2c 20 31 31 30  7, 108, 109, 110
60a0: 2c 20 31 31 31 2c 20 31 31 32 2c 20 31 31 33 2c  , 111, 112, 113,
60b0: 20 31 31 34 2c 20 31 31 35 2c 20 31 31 36 2c 20   114, 115, 116, 
60c0: 31 31 37 2c 20 31 31 38 2c 20 31 31 39 2c 0a 20  117, 118, 119,. 
60d0: 20 20 20 31 32 30 2c 20 31 32 31 2c 20 31 32 32     120, 121, 122
60e0: 2c 20 31 32 33 2c 20 31 32 34 2c 20 31 32 35 2c  , 123, 124, 125,
60f0: 20 31 32 36 2c 20 31 32 37 2c 20 31 32 38 2c 20   126, 127, 128, 
6100: 31 32 39 2c 20 31 33 30 2c 20 31 33 31 2c 20 31  129, 130, 131, 1
6110: 33 32 2c 20 31 33 33 2c 20 31 33 34 2c 0a 20 20  32, 133, 134,.  
6120: 20 20 31 33 35 2c 20 31 33 36 2c 20 31 33 37 2c    135, 136, 137,
6130: 20 31 33 38 2c 20 31 33 39 2c 20 31 34 30 2c 20   138, 139, 140, 
6140: 31 34 31 2c 20 31 34 32 2c 20 31 34 33 2c 20 31  141, 142, 143, 1
6150: 34 34 2c 20 31 34 35 2c 20 31 34 36 2c 20 31 34  44, 145, 146, 14
6160: 37 2c 20 31 34 38 2c 20 31 34 39 2c 0a 20 20 20  7, 148, 149,.   
6170: 20 31 35 30 2c 20 31 35 31 2c 20 31 35 32 2c 20   150, 151, 152, 
6180: 31 35 33 2c 20 31 35 34 2c 20 31 35 35 2c 20 31  153, 154, 155, 1
6190: 35 36 2c 20 31 35 37 2c 20 31 35 38 2c 20 31 35  56, 157, 158, 15
61a0: 39 2c 20 31 36 30 2c 20 31 36 31 2c 20 31 36 32  9, 160, 161, 162
61b0: 2c 20 31 36 33 2c 20 31 36 34 2c 0a 20 20 20 20  , 163, 164,.    
61c0: 31 36 35 2c 20 31 36 36 2c 20 31 36 37 2c 20 31  165, 166, 167, 1
61d0: 36 38 2c 20 31 36 39 2c 20 31 37 30 2c 20 31 37  68, 169, 170, 17
61e0: 31 2c 20 31 37 32 2c 20 31 37 33 2c 20 31 37 34  1, 172, 173, 174
61f0: 2c 20 31 37 35 2c 20 31 37 36 2c 20 31 37 37 2c  , 175, 176, 177,
6200: 20 31 37 38 2c 20 31 37 39 2c 0a 20 20 20 20 31   178, 179,.    1
6210: 38 30 2c 20 31 38 31 2c 20 31 38 32 2c 20 31 38  80, 181, 182, 18
6220: 33 2c 20 31 38 34 2c 20 31 38 35 2c 20 31 38 36  3, 184, 185, 186
6230: 2c 20 31 38 37 2c 20 31 38 38 2c 20 31 38 39 2c  , 187, 188, 189,
6240: 20 31 39 30 2c 20 31 39 31 2c 20 20 20 30 2c 20   190, 191,   0, 
6250: 20 20 31 2c 20 20 20 32 2c 0a 20 20 20 20 20 20    1,   2,.      
6260: 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36  3,   4,   5,   6
6270: 2c 20 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c  ,   7,   8,   9,
6280: 20 20 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20    10,  11,  12, 
6290: 20 31 33 2c 20 20 31 34 2c 20 20 31 35 2c 20 20   13,  14,  15,  
62a0: 31 36 2c 20 20 31 37 2c 0a 20 20 20 20 20 31 38  16,  17,.     18
62b0: 2c 20 20 31 39 2c 20 20 32 30 2c 20 20 32 31 2c  ,  19,  20,  21,
62c0: 20 20 32 32 2c 20 20 32 33 2c 20 20 32 34 2c 20    22,  23,  24, 
62d0: 20 32 35 2c 20 20 32 36 2c 20 20 32 37 2c 20 20   25,  26,  27,  
62e0: 32 38 2c 20 20 32 39 2c 20 20 33 30 2c 20 20 33  28,  29,  30,  3
62f0: 31 2c 20 20 20 30 2c 0a 20 20 20 20 20 20 31 2c  1,   0,.      1,
6300: 20 20 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20     2,   3,   4, 
6310: 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20    5,   6,   7,  
6320: 20 38 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31   8,   9,  10,  1
6330: 31 2c 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34  1,  12,  13,  14
6340: 2c 20 20 31 35 2c 0a 20 20 20 20 20 20 30 2c 20  ,  15,.      0, 
6350: 20 20 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20    1,   2,   3,  
6360: 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20   4,   5,   6,   
6370: 37 2c 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32  7,   0,   1,   2
6380: 2c 20 20 20 33 2c 20 20 20 30 2c 20 20 20 31 2c  ,   3,   0,   1,
6390: 20 32 35 34 2c 0a 20 20 20 20 32 35 35 2c 0a 20   254,.    255,. 
63a0: 20 7d 3b 0a 20 20 63 20 3d 20 69 6e 69 74 56 61   };.  c = initVa
63b0: 6c 5b 2a 28 7a 2b 2b 29 5d 3b 0a 20 20 77 68 69  l[*(z++)];.  whi
63c0: 6c 65 28 20 28 30 78 63 30 26 2a 7a 29 3d 3d 30  le( (0xc0&*z)==0
63d0: 78 38 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 28  x80 ){.    c = (
63e0: 63 3c 3c 36 29 20 7c 20 28 30 78 33 66 26 2a 28  c<<6) | (0x3f&*(
63f0: 7a 2b 2b 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  z++));.  }.  ret
6400: 75 72 6e 20 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn c;.}.#endif.
6410: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
6420: 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  wo UTF-8 strings
6430: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68   for equality wh
6440: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74  ere the first st
6450: 72 69 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74 65  ring can.** pote
6460: 6e 74 69 61 6c 6c 79 20 62 65 20 61 20 22 67 6c  ntially be a "gl
6470: 6f 62 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ob" expression. 
6480: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 31 29   Return true (1)
6490: 20 69 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20   if they.** are 
64a0: 74 68 65 20 73 61 6d 65 20 61 6e 64 20 66 61 6c  the same and fal
64b0: 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20 61  se (0) if they a
64c0: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2a  re different..**
64d0: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
64e0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
64f0: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
6500: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
6510: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
6520: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
6530: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
6540: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
6550: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
6560: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
6570: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
6580: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
6590: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
65a0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
65b0: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
65c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
65d0: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
65e0: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
65f0: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
6600: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  list..**.** With
6610: 20 74 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b   the [...] and [
6620: 5e 2e 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20  ^...] matching, 
6630: 61 20 27 5d 27 20 63 68 61 72 61 63 74 65 72 20  a ']' character 
6640: 63 61 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a  can be included.
6650: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62  ** in the list b
6660: 79 20 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20  y making it the 
6670: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
6680: 61 66 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27  after '[' or '^'
6690: 2e 20 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  .  A.** range of
66a0: 20 63 68 61 72 61 63 74 65 72 73 20 63 61 6e 20   characters can 
66b0: 62 65 20 73 70 65 63 69 66 69 65 64 20 75 73 69  be specified usi
66c0: 6e 67 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65  ng '-'.  Example
66d0: 3a 0a 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74  :.** "[a-z]" mat
66e0: 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20  ches any single 
66f0: 6c 6f 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65  lower-case lette
6700: 72 2e 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27  r.  To match a '
6710: 2d 27 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74  -', make.** it t
6720: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
6730: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  r in the list..*
6740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6750: 65 20 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69  e is usually qui
6760: 63 6b 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e  ck, but can be N
6770: 2a 2a 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74  **2 in the worst
6780: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e   case..**.** Hin
6790: 74 73 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a 27  ts: to match '*'
67a0: 20 6f 72 20 27 3f 27 2c 20 70 75 74 20 74 68 65   or '?', put the
67b0: 6d 20 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b 65  m in "[]".  Like
67c0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
67d0: 20 20 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20 20       abc[*]xyz  
67e0: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 22 61        Matches "a
67f0: 62 63 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a  bc*xyz" only.*/.
6800: 69 6e 74 20 0a 73 71 6c 69 74 65 47 6c 6f 62 43  int .sqliteGlobC
6810: 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 75 6e 73  ompare(const uns
6820: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74  igned char *zPat
6830: 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73 69  tern, const unsi
6840: 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 69  gned char *zStri
6850: 6e 67 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20  ng){.  register 
6860: 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 6e 76  int c;.  int inv
6870: 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b  ert;.  int seen;
6880: 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77 68  .  int c2;..  wh
6890: 69 6c 65 28 20 28 63 20 3d 20 2a 7a 50 61 74 74  ile( (c = *zPatt
68a0: 65 72 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ern)!=0 ){.    s
68b0: 77 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20  witch( c ){.    
68c0: 20 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20 20    case '*':.    
68d0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 50      while( (c=zP
68e0: 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27 2a  attern[1]) == '*
68f0: 27 20 7c 7c 20 63 20 3d 3d 20 27 3f 27 20 29 7b  ' || c == '?' ){
6900: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
6910: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='?' ){.       
6920: 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e       if( *zStrin
6930: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
6940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6950: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
6960: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
6970: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61 74  }.          zPat
6980: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tern++;.        
6990: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
69a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
69b0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5b         if( c=='[
69c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  ' ){.          w
69d0: 68 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26  hile( *zString &
69e0: 26 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70  & sqliteGlobComp
69f0: 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d  are(&zPattern[1]
6a00: 2c 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  ,zString)==0 ){.
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6a20: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
6a30: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ng);.          }
6a40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6a50: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
6a60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6a70: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
6a80: 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d  c2 = *zString)!=
6a90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6aa0: 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20   while( c2 != 0 
6ab0: 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32  && c2 != c ){ c2
6ac0: 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d   = *++zString; }
6ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6ae0: 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
6af0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
6b00: 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d  f( sqliteGlobCom
6b10: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
6b20: 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65 74  ],zString) ) ret
6b30: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
6b40: 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61     sqliteNextCha
6b50: 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20  r(zString);.    
6b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
6b90: 20 27 3f 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '?': {.        
6ba0: 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  if( *zString==0 
6bb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6bc0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
6bd0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6be0: 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b 3b       zPattern++;
6bf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6c10: 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20 20  se '[': {.      
6c20: 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
6c30: 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 20  0;.        seen 
6c40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 76  = 0;.        inv
6c50: 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ert = 0;.       
6c60: 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72 56   c = sqliteCharV
6c70: 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  al(zString);.   
6c80: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
6c90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6ca0: 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65    c2 = *++zPatte
6cb0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rn;.        if( 
6cc0: 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65 72  c2=='^' ){ inver
6cd0: 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b 7a  t = 1; c2 = *++z
6ce0: 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20 20  Pattern; }.     
6cf0: 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
6d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6d10: 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20  c==']' ) seen = 
6d20: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  1;.          c2 
6d30: 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20  = *++zPattern;. 
6d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d50: 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73 71   while( (c2 = sq
6d60: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
6d70: 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32 21  tern))!=0 && c2!
6d80: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
6d90: 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26    if( c2=='-' &&
6da0: 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d   zPattern[1]!=']
6db0: 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d  ' && zPattern[1]
6dc0: 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
6dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6de0: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
6df0: 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71 6c          c2 = sql
6e00: 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74 74  iteCharVal(zPatt
6e10: 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ern);.          
6e20: 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63    if( c>=prior_c
6e30: 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e   && c<=c2 ) seen
6e40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6e50: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
6e60: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
6e70: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
6e80: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
6e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
6ea0: 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
6eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ec0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
6ed0: 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 20   = c2;.         
6ee0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
6ef0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61 74  iteNextChar(zPat
6f00: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tern);.        }
6f10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
6f20: 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
6f30: 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
6f40: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 0;.        sql
6f50: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
6f60: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ing);.        zP
6f70: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20  attern++;.      
6f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6f90: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6fa0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  {.        if( c 
6fb0: 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65  != *zString ) re
6fc0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6fd0: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
6fe0: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
6ff0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7000: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7010: 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e    return *zStrin
7020: 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  g==0;.}../*.** C
7030: 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d 38  ompare two UTF-8
7040: 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75   strings for equ
7050: 61 6c 69 74 79 20 75 73 69 6e 67 20 74 68 65 20  ality using the 
7060: 22 4c 49 4b 45 22 20 6f 70 65 72 61 74 6f 72 20  "LIKE" operator 
7070: 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20 54 68 65 20  of.** SQL.  The 
7080: 27 25 27 20 63 68 61 72 61 63 74 65 72 20 6d 61  '%' character ma
7090: 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
70a0: 63 65 20 6f 66 20 30 20 6f 72 20 6d 6f 72 65 0a  ce of 0 or more.
70b0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 6e  ** characters an
70c0: 64 20 27 5f 27 20 6d 61 74 63 68 65 73 20 61 6e  d '_' matches an
70d0: 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  y single charact
70e0: 65 72 2e 20 20 43 61 73 65 20 69 73 0a 2a 2a 20  er.  Case is.** 
70f0: 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74 2e  not significant.
7100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7110: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 6e 20 61  ine is just an a
7120: 64 61 70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  daptation of the
7130: 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61   sqliteGlobCompa
7140: 72 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  re().** routine 
7150: 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20 0a 73  above..*/.int .s
7160: 71 6c 69 74 65 4c 69 6b 65 43 6f 6d 70 61 72 65  qliteLikeCompare
7170: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
7180: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 2c 20  char *zPattern, 
7190: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
71a0: 68 61 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20  har *zString){. 
71b0: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 63 3b   register int c;
71c0: 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77 68  .  int c2;..  wh
71d0: 69 6c 65 28 20 28 63 20 3d 20 55 70 70 65 72 54  ile( (c = UpperT
71e0: 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74 74 65 72 6e  oLower[*zPattern
71f0: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77 69  ])!=0 ){.    swi
7200: 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20  tch( c ){.      
7210: 63 61 73 65 20 27 25 27 3a 20 7b 0a 20 20 20 20  case '%': {.    
7220: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 50      while( (c=zP
7230: 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27 25  attern[1]) == '%
7240: 27 20 7c 7c 20 63 20 3d 3d 20 27 5f 27 20 29 7b  ' || c == '_' ){
7250: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
7260: 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='_' ){.       
7270: 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e       if( *zStrin
7280: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
7290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
72a0: 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72  iteNextChar(zStr
72b0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ing);.          
72c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61 74  }.          zPat
72d0: 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tern++;.        
72e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
72f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7300: 20 20 20 20 20 20 20 63 20 3d 20 55 70 70 65 72         c = Upper
7310: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20  ToLower[c];.    
7320: 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 3d 55      while( (c2=U
7330: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53 74  pperToLower[*zSt
7340: 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20 20  ring])!=0 ){.   
7350: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
7360: 20 21 3d 20 30 20 26 26 20 63 32 20 21 3d 20 63   != 0 && c2 != c
7370: 20 29 7b 20 63 32 20 3d 20 55 70 70 65 72 54 6f   ){ c2 = UpperTo
7380: 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72 69 6e 67  Lower[*++zString
7390: 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69  ]; }.          i
73a0: 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72  f( c2==0 ) retur
73b0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n 0;.          i
73c0: 66 28 20 73 71 6c 69 74 65 4c 69 6b 65 43 6f 6d  f( sqliteLikeCom
73d0: 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31  pare(&zPattern[1
73e0: 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65 74  ],zString) ) ret
73f0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
7400: 20 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28   sqliteNextChar(
7410: 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20  zString);.      
7420: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
7430: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
7440: 20 20 20 20 63 61 73 65 20 27 5f 27 3a 20 7b 0a      case '_': {.
7450: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
7460: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
7470: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
7480: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
7490: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 61  ng);.        zPa
74a0: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
74b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
74c0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
74d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21  .        if( c !
74e0: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  = UpperToLower[*
74f0: 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72  zString] ) retur
7500: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 50 61  n 0;.        zPa
7510: 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ttern++;.       
7520: 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 20 20   zString++;.    
7530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7540: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7550: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
7560: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0;.}../*.** Chan
7570: 67 65 20 74 68 65 20 73 71 6c 69 74 65 2e 6d 61  ge the sqlite.ma
7580: 67 69 63 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  gic from SQLITE_
7590: 4d 41 47 49 43 5f 4f 50 45 4e 20 74 6f 20 53 51  MAGIC_OPEN to SQ
75a0: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 2e  LITE_MAGIC_BUSY.
75b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
75c0: 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  ror (non-zero) i
75d0: 66 20 74 68 65 20 6d 61 67 69 63 20 77 61 73 20  f the magic was 
75e0: 6e 6f 74 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  not SQLITE_MAGIC
75f0: 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65 6e 20 74 68  _OPEN.** when th
7600: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7610: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
7620: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 61 74   routine is a at
7630: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 63 74 20  tempt to detect 
7640: 69 66 20 74 77 6f 20 74 68 72 65 61 64 73 20 75  if two threads u
7650: 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 73  se the.** same s
7660: 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 20 61  qlite* pointer a
7670: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
7680: 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63    There is a rac
7690: 65 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 20  e .** condition 
76a0: 73 6f 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  so it is possibl
76b0: 65 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  e that the error
76c0: 20 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65 64   is not detected
76d0: 2e 0a 2a 2a 20 42 75 74 20 75 73 75 61 6c 6c 79  ..** But usually
76e0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 69 6c   the problem wil
76f0: 6c 20 62 65 20 73 65 65 6e 2e 20 20 54 68 65 20  l be seen.  The 
7700: 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 61  result will be a
7710: 6e 0a 2a 2a 20 65 72 72 6f 72 20 77 68 69 63 68  n.** error which
7720: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
7730: 64 65 62 75 67 20 74 68 65 20 61 70 70 6c 69 63  debug the applic
7740: 61 74 69 6f 6e 20 74 68 61 74 20 69 73 0a 2a 2a  ation that is.**
7750: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 69 6e   using SQLite in
7760: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
7770: 20 54 69 63 6b 65 74 20 23 32 30 32 3a 20 20 49   Ticket #202:  I
7780: 66 20 64 62 2d 3e 6d 61 67 69 63 20 69 73 20 6e  f db->magic is n
7790: 6f 74 20 61 20 76 61 6c 69 64 20 6f 70 65 6e 20  ot a valid open 
77a0: 76 61 6c 75 65 2c 20 74 61 6b 65 20 63 61 72 65  value, take care
77b0: 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66   not.** to modif
77c0: 79 20 74 68 65 20 64 62 20 73 74 72 75 63 74 75  y the db structu
77d0: 72 65 20 61 74 20 61 6c 6c 2e 20 20 49 74 20 63  re at all.  It c
77e0: 6f 75 6c 64 20 62 65 20 74 68 61 74 20 64 62 20  ould be that db 
77f0: 69 73 20 61 20 73 74 61 6c 65 0a 2a 2a 20 70 6f  is a stale.** po
7800: 69 6e 74 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  inter.  In other
7810: 20 77 6f 72 64 73 2c 20 69 74 20 63 6f 75 6c 64   words, it could
7820: 20 62 65 20 74 68 61 74 20 74 68 65 72 65 20 68   be that there h
7830: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 0a  as been a prior.
7840: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
7850: 65 5f 63 6c 6f 73 65 28 64 62 29 20 61 6e 64 20  e_close(db) and 
7860: 64 62 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  db has been deal
7870: 6c 6f 63 61 74 65 64 2e 20 20 41 6e 64 20 77 65  located.  And we
7880: 20 64 6f 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20   do.** not want 
7890: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 64 65  to write into de
78a0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
78b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53  ..*/.int sqliteS
78c0: 61 66 65 74 79 4f 6e 28 73 71 6c 69 74 65 20 2a  afetyOn(sqlite *
78d0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  db){.  if( db->m
78e0: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
78f0: 49 43 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 64  IC_OPEN ){.    d
7900: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
7910: 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
7920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
7930: 6c 73 65 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  lse if( db->magi
7940: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
7950: 42 55 53 59 20 7c 7c 20 64 62 2d 3e 6d 61 67 69  BUSY || db->magi
7960: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
7970: 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20  ERROR.          
7980: 20 20 20 7c 7c 20 64 62 2d 3e 77 61 6e 74 5f 74     || db->want_t
7990: 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20 20 20 20 64  o_close ){.    d
79a0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
79b0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
79c0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
79d0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75 70 74  SQLITE_Interrupt
79e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
79f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
7a00: 65 20 74 68 65 20 6d 61 67 69 63 20 66 72 6f 6d  e the magic from
7a10: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
7a20: 53 59 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  SY to SQLITE_MAG
7a30: 49 43 5f 4f 50 45 4e 2e 0a 2a 2a 20 52 65 74 75  IC_OPEN..** Retu
7a40: 72 6e 20 61 6e 20 65 72 72 6f 72 20 28 6e 6f 6e  rn an error (non
7a50: 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 6d 61  -zero) if the ma
7a60: 67 69 63 20 77 61 73 20 6e 6f 74 20 53 51 4c 49  gic was not SQLI
7a70: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 0a 2a 2a  TE_MAGIC_BUSY.**
7a80: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
7a90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
7aa0: 0a 69 6e 74 20 73 71 6c 69 74 65 53 61 66 65 74  .int sqliteSafet
7ab0: 79 4f 66 66 28 73 71 6c 69 74 65 20 2a 64 62 29  yOff(sqlite *db)
7ac0: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  {.  if( db->magi
7ad0: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
7ae0: 42 55 53 59 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BUSY ){.    db->
7af0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
7b00: 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 20 20 72  AGIC_OPEN;.    r
7b10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
7b20: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d   if( db->magic==
7b30: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
7b40: 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  N || db->magic==
7b50: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
7b60: 4f 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OR.             
7b70: 7c 7c 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f 63  || db->want_to_c
7b80: 6c 6f 73 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  lose ){.    db->
7b90: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
7ba0: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 20 20  AGIC_ERROR;.    
7bb0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7bc0: 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20  ITE_Interrupt;. 
7bd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7be0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
7bf0: 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 61 72   make sure we ar
7c00: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
7c10: 65 78 65 63 75 74 69 6e 67 20 61 6e 20 73 71 6c  executing an sql
7c20: 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2a 20 49  ite_exec()..** I
7c30: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
7c40: 6c 79 20 69 6e 20 61 6e 20 73 71 6c 69 74 65 5f  ly in an sqlite_
7c50: 65 78 65 63 28 29 2c 20 72 65 74 75 72 6e 20 74  exec(), return t
7c60: 72 75 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 73  rue and set.** s
7c70: 71 6c 69 74 65 2e 6d 61 67 69 63 20 74 6f 20 53  qlite.magic to S
7c80: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
7c90: 52 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  R.  This will ca
7ca0: 75 73 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a 2a  use a complete.*
7cb0: 2a 20 73 68 75 74 64 6f 77 6e 20 6f 66 20 74 68  * shutdown of th
7cc0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
7cd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7ce0: 73 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f  s used to try to
7cf0: 20 64 65 74 65 63 74 20 77 68 65 6e 20 41 50 49   detect when API
7d00: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
7d10: 6c 6c 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 77  lled.** at the w
7d20: 72 6f 6e 67 20 74 69 6d 65 20 6f 72 20 69 6e 20  rong time or in 
7d30: 74 68 65 20 77 72 6f 6e 67 20 73 65 71 75 65 6e  the wrong sequen
7d40: 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
7d50: 65 53 61 66 65 74 79 43 68 65 63 6b 28 73 71 6c  eSafetyCheck(sql
7d60: 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  ite *db){.  if( 
7d70: 64 62 2d 3e 70 56 64 62 65 21 3d 30 20 29 7b 0a  db->pVdbe!=0 ){.
7d80: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
7d90: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
7da0: 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  OR;.    return 1
7db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7dc0: 3b 0a 7d 0a                                      ;.}.