/ Hex Artifact Content
Login

Artifact b72f775a6c3fa404d70250382f63d708e17bc332:


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 38  Id: util.c,v 1.8
0220: 35 20 32 30 30 34 2f 30 35 2f 31 39 20 31 30 3a  5 2004/05/19 10:
0230: 33 34 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37  34:57 danielk197
0240: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0250: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0260: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  ".#include <stda
0270: 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rg.h>.#include <
0280: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0290: 49 66 20 6d 61 6c 6c 6f 63 28 29 20 65 76 65 72  If malloc() ever
02a0: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 67 6c 6f   fails, this glo
02b0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 67 65 74  bal variable get
02c0: 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2a 20 54  s set to 1..** T
02d0: 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 6c  his causes the l
02e0: 69 62 72 61 72 79 20 74 6f 20 61 62 6f 72 74 20  ibrary to abort 
02f0: 61 6e 64 20 6e 65 76 65 72 20 61 67 61 69 6e 20  and never again 
0300: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
0310: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
0320: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a  failed = 0;../*.
0330: 2a 2a 20 49 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ** If MEMORY_DEB
0340: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  UG is defined, t
0350: 68 65 6e 20 75 73 65 20 76 65 72 73 69 6f 6e 73  hen use versions
0360: 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64   of malloc() and
0370: 0a 2a 2a 20 66 72 65 65 28 29 20 74 68 61 74 20  .** free() that 
0380: 74 72 61 63 6b 20 6d 65 6d 6f 72 79 20 75 73 61  track memory usa
0390: 67 65 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ge and check for
03a0: 20 62 75 66 66 65 72 20 6f 76 65 72 72 75 6e 73   buffer overruns
03b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 4d 45 4d 4f  ..*/.#ifdef MEMO
03c0: 52 59 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20  RY_DEBUG../*.** 
03d0: 46 6f 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63  For keeping trac
03e0: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
03f0: 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64 20 66  of mallocs and f
0400: 72 65 65 73 2e 20 20 20 54 68 69 73 0a 2a 2a 20  rees.   This.** 
0410: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
0420: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c 65 61 6b   for memory leak
0430: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
0440: 33 5f 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20  3_nMalloc;      
0450: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0460: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63  sqliteMalloc() c
0470: 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  alls */.int sqli
0480: 74 65 33 5f 6e 46 72 65 65 3b 20 20 20 20 20 20  te3_nFree;      
0490: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
04a0: 66 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 63  f sqliteFree() c
04b0: 61 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  alls */.int sqli
04c0: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b  te3_iMallocFail;
04d0: 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 73 71 6c       /* Fail sql
04e0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 66 74 65  iteMalloc() afte
04f0: 72 20 74 68 69 73 20 6d 61 6e 79 20 63 61 6c 6c  r this many call
0500: 73 20 2a 2f 0a 23 69 66 20 4d 45 4d 4f 52 59 5f  s */.#if MEMORY_
0510: 44 45 42 55 47 3e 31 0a 73 74 61 74 69 63 20 69  DEBUG>1.static i
0520: 6e 74 20 6d 65 6d 63 6e 74 20 3d 20 30 3b 0a 23  nt memcnt = 0;.#
0530: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  endif../*.** Num
0540: 62 65 72 20 6f 66 20 33 32 2d 62 69 74 20 67 75  ber of 32-bit gu
0550: 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a 23 64 65  ard words.*/.#de
0560: 66 69 6e 65 20 4e 5f 47 55 41 52 44 20 31 0a 0a  fine N_GUARD 1..
0570: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
0580: 65 77 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73 65  ew memory and se
0590: 74 20 69 74 20 74 6f 20 7a 65 72 6f 2e 20 20 52  t it to zero.  R
05a0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
05b0: 20 6e 6f 20 6d 65 6d 6f 72 79 20 69 73 20 61 76   no memory is av
05c0: 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ailable..*/.void
05d0: 20 2a 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5f   *sqlite3Malloc_
05e0: 28 69 6e 74 20 6e 2c 20 69 6e 74 20 62 5a 65 72  (int n, int bZer
05f0: 6f 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  o, char *zFile, 
0600: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 76 6f 69  int line){.  voi
0610: 64 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 70 69 3b  d *p;.  int *pi;
0620: 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20 69  .  int i, k;.  i
0630: 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c  f( sqlite3_iMall
0640: 6f 63 46 61 69 6c 3e 3d 30 20 29 7b 0a 20 20 20  ocFail>=0 ){.   
0650: 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
0660: 46 61 69 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Fail--;.    if( 
0670: 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
0680: 61 69 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ail==0 ){.      
0690: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
06a0: 61 69 6c 65 64 2b 2b 3b 0a 23 69 66 20 4d 45 4d  ailed++;.#if MEM
06b0: 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 20 20  ORY_DEBUG>1.    
06c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
06d0: 2c 22 2a 2a 2a 2a 20 66 61 69 6c 65 64 20 74 6f  ,"**** failed to
06e0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74   allocate %d byt
06f0: 65 73 20 61 74 20 25 73 3a 25 64 5c 6e 22 2c 0a  es at %s:%d\n",.
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2c                n,
0710: 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65   zFile,line);.#e
0720: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
0730: 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d  e3_iMallocFail--
0740: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
0750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
0760: 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( n==0 ) return 
0770: 30 3b 0a 20 20 6b 20 3d 20 28 6e 2b 73 69 7a 65  0;.  k = (n+size
0780: 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65 6f  of(int)-1)/sizeo
0790: 66 28 69 6e 74 29 3b 0a 20 20 70 69 20 3d 20 6d  f(int);.  pi = m
07a0: 61 6c 6c 6f 63 28 20 28 4e 5f 47 55 41 52 44 2a  alloc( (N_GUARD*
07b0: 32 2b 31 2b 6b 29 2a 73 69 7a 65 6f 66 28 69 6e  2+1+k)*sizeof(in
07c0: 74 29 29 3b 0a 20 20 69 66 28 20 70 69 3d 3d 30  t));.  if( pi==0
07d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
07e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b  malloc_failed++;
07f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
0800: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6e 4d 61   }.  sqlite3_nMa
0810: 6c 6c 6f 63 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  lloc++;.  for(i=
0820: 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b  0; i<N_GUARD; i+
0830: 2b 29 20 70 69 5b 69 5d 20 3d 20 30 78 64 65 61  +) pi[i] = 0xdea
0840: 64 31 31 32 32 3b 0a 20 20 70 69 5b 4e 5f 47 55  d1122;.  pi[N_GU
0850: 41 52 44 5d 20 3d 20 6e 3b 0a 20 20 66 6f 72 28  ARD] = n;.  for(
0860: 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20  i=0; i<N_GUARD; 
0870: 69 2b 2b 29 20 70 69 5b 6b 2b 31 2b 4e 5f 47 55  i++) pi[k+1+N_GU
0880: 41 52 44 2b 69 5d 20 3d 20 30 78 64 65 61 64 33  ARD+i] = 0xdead3
0890: 33 34 34 3b 0a 20 20 70 20 3d 20 26 70 69 5b 4e  344;.  p = &pi[N
08a0: 5f 47 55 41 52 44 2b 31 5d 3b 0a 20 20 6d 65 6d  _GUARD+1];.  mem
08b0: 73 65 74 28 70 2c 20 62 5a 65 72 6f 3d 3d 30 2c  set(p, bZero==0,
08c0: 20 6e 29 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f   n);.#if MEMORY_
08d0: 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69 6e 74  DEBUG>1.  fprint
08e0: 66 28 73 74 64 65 72 72 2c 22 25 30 36 64 20 6d  f(stderr,"%06d m
08f0: 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 20 61  alloc %d bytes a
0900: 74 20 30 78 25 78 20 66 72 6f 6d 20 25 73 3a 25  t 0x%x from %s:%
0910: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 2b 2b 6d 65  d\n",.      ++me
0920: 6d 63 6e 74 2c 20 6e 2c 20 28 69 6e 74 29 70 2c  mcnt, n, (int)p,
0930: 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65   zFile,line);.#e
0940: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b  ndif.  return p;
0950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
0960: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
0970: 76 65 6e 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ven pointer was 
0980: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
0990: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  liteMalloc().** 
09a0: 61 6e 64 20 69 73 20 61 62 6c 65 20 74 6f 20 68  and is able to h
09b0: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 4e 20 62  old at least N b
09c0: 79 74 65 73 2e 20 20 52 61 69 73 65 20 61 6e 20  ytes.  Raise an 
09d0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
09e0: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
09f0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
0a00: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
0a10: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
0a20: 70 6f 73 65 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  poses only..*/.v
0a30: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 65 63 6b  oid sqlite3Check
0a40: 4d 65 6d 6f 72 79 28 76 6f 69 64 20 2a 70 2c 20  Memory(void *p, 
0a50: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 2a 70  int N){.  int *p
0a60: 69 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 2c 20  i = p;.  int n, 
0a70: 69 2c 20 6b 3b 0a 20 20 70 69 20 2d 3d 20 4e 5f  i, k;.  pi -= N_
0a80: 47 55 41 52 44 2b 31 3b 0a 20 20 66 6f 72 28 69  GUARD+1;.  for(i
0a90: 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69  =0; i<N_GUARD; i
0aa0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
0ab0: 20 70 69 5b 69 5d 3d 3d 30 78 64 65 61 64 31 31   pi[i]==0xdead11
0ac0: 32 32 20 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  22 );.  }.  n = 
0ad0: 70 69 5b 4e 5f 47 55 41 52 44 5d 3b 0a 20 20 61  pi[N_GUARD];.  a
0ae0: 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
0af0: 3c 6e 20 29 3b 0a 20 20 6b 20 3d 20 28 6e 2b 73  <n );.  k = (n+s
0b00: 69 7a 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69  izeof(int)-1)/si
0b10: 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 66 6f 72  zeof(int);.  for
0b20: 28 69 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b  (i=0; i<N_GUARD;
0b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
0b40: 74 28 20 70 69 5b 6b 2b 4e 5f 47 55 41 52 44 2b  t( pi[k+N_GUARD+
0b50: 31 2b 69 5d 3d 3d 30 78 64 65 61 64 33 33 34 34  1+i]==0xdead3344
0b60: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
0b70: 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 70 72 65   Free memory pre
0b80: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
0b90: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
0ba0: 6f 63 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc().*/.void sql
0bb0: 69 74 65 33 46 72 65 65 5f 28 76 6f 69 64 20 2a  ite3Free_(void *
0bc0: 70 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  p, char *zFile, 
0bd0: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 69 66 28  int line){.  if(
0be0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 2a 70   p ){.    int *p
0bf0: 69 2c 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 20 20  i, i, k, n;.    
0c00: 70 69 20 3d 20 70 3b 0a 20 20 20 20 70 69 20 2d  pi = p;.    pi -
0c10: 3d 20 4e 5f 47 55 41 52 44 2b 31 3b 0a 20 20 20  = N_GUARD+1;.   
0c20: 20 73 71 6c 69 74 65 33 5f 6e 46 72 65 65 2b 2b   sqlite3_nFree++
0c30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
0c40: 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a  <N_GUARD; i++){.
0c50: 20 20 20 20 20 20 69 66 28 20 70 69 5b 69 5d 21        if( pi[i]!
0c60: 3d 30 78 64 65 61 64 31 31 32 32 20 29 7b 0a 20  =0xdead1122 ){. 
0c70: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
0c80: 74 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d  tderr,"Low-end m
0c90: 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e  emory corruption
0ca0: 20 61 74 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e   at 0x%x\n", (in
0cb0: 74 29 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t)p);.        re
0cc0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
0cd0: 20 20 7d 0a 20 20 20 20 6e 20 3d 20 70 69 5b 4e    }.    n = pi[N
0ce0: 5f 47 55 41 52 44 5d 3b 0a 20 20 20 20 6b 20 3d  _GUARD];.    k =
0cf0: 20 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74 29 2d   (n+sizeof(int)-
0d00: 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a  1)/sizeof(int);.
0d10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
0d20: 5f 47 55 41 52 44 3b 20 69 2b 2b 29 7b 0a 20 20  _GUARD; i++){.  
0d30: 20 20 20 20 69 66 28 20 70 69 5b 6b 2b 4e 5f 47      if( pi[k+N_G
0d40: 55 41 52 44 2b 31 2b 69 5d 21 3d 30 78 64 65 61  UARD+1+i]!=0xdea
0d50: 64 33 33 34 34 20 29 7b 0a 20 20 20 20 20 20 20  d3344 ){.       
0d60: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0d70: 22 48 69 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79  "High-end memory
0d80: 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 30   corruption at 0
0d90: 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b  x%x\n", (int)p);
0da0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
0db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0dc0: 20 20 20 6d 65 6d 73 65 74 28 70 69 2c 20 30 78     memset(pi, 0x
0dd0: 66 66 2c 20 28 6b 2b 4e 5f 47 55 41 52 44 2a 32  ff, (k+N_GUARD*2
0de0: 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  +1)*sizeof(int))
0df0: 3b 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ;.#if MEMORY_DEB
0e00: 55 47 3e 31 0a 20 20 20 20 66 70 72 69 6e 74 66  UG>1.    fprintf
0e10: 28 73 74 64 65 72 72 2c 22 25 30 36 64 20 66 72  (stderr,"%06d fr
0e20: 65 65 20 25 64 20 62 79 74 65 73 20 61 74 20 30  ee %d bytes at 0
0e30: 78 25 78 20 66 72 6f 6d 20 25 73 3a 25 64 5c 6e  x%x from %s:%d\n
0e40: 22 2c 0a 20 20 20 20 20 20 20 20 20 2b 2b 6d 65  ",.         ++me
0e50: 6d 63 6e 74 2c 20 6e 2c 20 28 69 6e 74 29 70 2c  mcnt, n, (int)p,
0e60: 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65   zFile,line);.#e
0e70: 6e 64 69 66 0a 20 20 20 20 66 72 65 65 28 70 69  ndif.    free(pi
0e80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0e90: 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20 61  Resize a prior a
0ea0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 70  llocation.  If p
0eb0: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ==0, then this r
0ec0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20  outine.** works 
0ed0: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
0ee0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d  Malloc().  If n=
0ef0: 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  =0, then this ro
0f00: 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a  utine.** works j
0f10: 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 46  ust like sqliteF
0f20: 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ree()..*/.void *
0f30: 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 5f 28  sqlite3Realloc_(
0f40: 76 6f 69 64 20 2a 6f 6c 64 50 2c 20 69 6e 74 20  void *oldP, int 
0f50: 6e 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  n, char *zFile, 
0f60: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 69 6e 74  int line){.  int
0f70: 20 2a 6f 6c 64 50 69 2c 20 2a 70 69 2c 20 69 2c   *oldPi, *pi, i,
0f80: 20 6b 2c 20 6f 6c 64 4e 2c 20 6f 6c 64 4b 3b 0a   k, oldN, oldK;.
0f90: 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28    void *p;.  if(
0fa0: 20 6f 6c 64 50 3d 3d 30 20 29 7b 0a 20 20 20 20   oldP==0 ){.    
0fb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 61  return sqlite3Ma
0fc0: 6c 6c 6f 63 5f 28 6e 2c 31 2c 7a 46 69 6c 65 2c  lloc_(n,1,zFile,
0fd0: 6c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  line);.  }.  if(
0fe0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   n==0 ){.    sql
0ff0: 69 74 65 33 46 72 65 65 5f 28 6f 6c 64 50 2c 7a  ite3Free_(oldP,z
1000: 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 20 20 20 20  File,line);.    
1010: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1020: 6f 6c 64 50 69 20 3d 20 6f 6c 64 50 3b 0a 20 20  oldPi = oldP;.  
1030: 6f 6c 64 50 69 20 2d 3d 20 4e 5f 47 55 41 52 44  oldPi -= N_GUARD
1040: 2b 31 3b 0a 20 20 69 66 28 20 6f 6c 64 50 69 5b  +1;.  if( oldPi[
1050: 30 5d 21 3d 30 78 64 65 61 64 31 31 32 32 20 29  0]!=0xdead1122 )
1060: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1070: 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d 65  derr,"Low-end me
1080: 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 20  mory corruption 
1090: 69 6e 20 72 65 61 6c 6c 6f 63 20 61 74 20 30 78  in realloc at 0x
10a0: 25 78 5c 6e 22 2c 20 28 69 6e 74 29 6f 6c 64 50  %x\n", (int)oldP
10b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
10c0: 0a 20 20 7d 0a 20 20 6f 6c 64 4e 20 3d 20 6f 6c  .  }.  oldN = ol
10d0: 64 50 69 5b 4e 5f 47 55 41 52 44 5d 3b 0a 20 20  dPi[N_GUARD];.  
10e0: 6f 6c 64 4b 20 3d 20 28 6f 6c 64 4e 2b 73 69 7a  oldK = (oldN+siz
10f0: 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65  eof(int)-1)/size
1100: 6f 66 28 69 6e 74 29 3b 0a 20 20 66 6f 72 28 69  of(int);.  for(i
1110: 3d 30 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69  =0; i<N_GUARD; i
1120: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6f 6c 64  ++){.    if( old
1130: 50 69 5b 6f 6c 64 4b 2b 4e 5f 47 55 41 52 44 2b  Pi[oldK+N_GUARD+
1140: 31 2b 69 5d 21 3d 30 78 64 65 61 64 33 33 34 34  1+i]!=0xdead3344
1150: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1160: 66 28 73 74 64 65 72 72 2c 22 48 69 67 68 2d 65  f(stderr,"High-e
1170: 6e 64 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70  nd memory corrup
1180: 74 69 6f 6e 20 69 6e 20 72 65 61 6c 6c 6f 63 20  tion in realloc 
1190: 61 74 20 30 78 25 78 5c 6e 22 2c 0a 20 20 20 20  at 0x%x\n",.    
11a0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
11b0: 6c 64 50 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ldP);.      retu
11c0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
11d0: 20 20 6b 20 3d 20 28 6e 20 2b 20 73 69 7a 65 6f    k = (n + sizeo
11e0: 66 28 69 6e 74 29 20 2d 20 31 29 2f 73 69 7a 65  f(int) - 1)/size
11f0: 6f 66 28 69 6e 74 29 3b 0a 20 20 70 69 20 3d 20  of(int);.  pi = 
1200: 6d 61 6c 6c 6f 63 28 20 28 6b 2b 4e 5f 47 55 41  malloc( (k+N_GUA
1210: 52 44 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 69  RD*2+1)*sizeof(i
1220: 6e 74 29 20 29 3b 0a 20 20 69 66 28 20 70 69 3d  nt) );.  if( pi=
1230: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1240: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b  3_malloc_failed+
1250: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
1260: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1270: 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b 29 20  i<N_GUARD; i++) 
1280: 70 69 5b 69 5d 20 3d 20 30 78 64 65 61 64 31 31  pi[i] = 0xdead11
1290: 32 32 3b 0a 20 20 70 69 5b 4e 5f 47 55 41 52 44  22;.  pi[N_GUARD
12a0: 5d 20 3d 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  ] = n;.  for(i=0
12b0: 3b 20 69 3c 4e 5f 47 55 41 52 44 3b 20 69 2b 2b  ; i<N_GUARD; i++
12c0: 29 20 70 69 5b 6b 2b 4e 5f 47 55 41 52 44 2b 31  ) pi[k+N_GUARD+1
12d0: 2b 69 5d 20 3d 20 30 78 64 65 61 64 33 33 34 34  +i] = 0xdead3344
12e0: 3b 0a 20 20 70 20 3d 20 26 70 69 5b 4e 5f 47 55  ;.  p = &pi[N_GU
12f0: 41 52 44 2b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  ARD+1];.  memcpy
1300: 28 70 2c 20 6f 6c 64 50 2c 20 6e 3e 6f 6c 64 4e  (p, oldP, n>oldN
1310: 20 3f 20 6f 6c 64 4e 20 3a 20 6e 29 3b 0a 20 20   ? oldN : n);.  
1320: 69 66 28 20 6e 3e 6f 6c 64 4e 20 29 7b 0a 20 20  if( n>oldN ){.  
1330: 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
1340: 2a 29 70 29 5b 6f 6c 64 4e 5d 2c 20 30 2c 20 6e  *)p)[oldN], 0, n
1350: 2d 6f 6c 64 4e 29 3b 0a 20 20 7d 0a 20 20 6d 65  -oldN);.  }.  me
1360: 6d 73 65 74 28 6f 6c 64 50 69 2c 20 30 78 61 62  mset(oldPi, 0xab
1370: 2c 20 28 6f 6c 64 4b 2b 4e 5f 47 55 41 52 44 2b  , (oldK+N_GUARD+
1380: 32 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  2)*sizeof(int));
1390: 0a 20 20 66 72 65 65 28 6f 6c 64 50 69 29 3b 0a  .  free(oldPi);.
13a0: 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47  #if MEMORY_DEBUG
13b0: 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  >1.  fprintf(std
13c0: 65 72 72 2c 22 25 30 36 64 20 72 65 61 6c 6c 6f  err,"%06d reallo
13d0: 63 20 25 64 20 74 6f 20 25 64 20 62 79 74 65 73  c %d to %d bytes
13e0: 20 61 74 20 30 78 25 78 20 74 6f 20 30 78 25 78   at 0x%x to 0x%x
13f0: 20 61 74 20 25 73 3a 25 64 5c 6e 22 2c 0a 20 20   at %s:%d\n",.  
1400: 20 20 2b 2b 6d 65 6d 63 6e 74 2c 20 6f 6c 64 4e    ++memcnt, oldN
1410: 2c 20 6e 2c 20 28 69 6e 74 29 6f 6c 64 50 2c 20  , n, (int)oldP, 
1420: 28 69 6e 74 29 70 2c 20 7a 46 69 6c 65 2c 20 6c  (int)p, zFile, l
1430: 69 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ine);.#endif.  r
1440: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1450: 2a 20 4d 61 6b 65 20 61 20 64 75 70 6c 69 63 61  * Make a duplica
1460: 74 65 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  te of a string i
1470: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1480: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
1490: 29 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6f 72  ).** Free the or
14a0: 69 67 69 6e 61 6c 20 73 74 72 69 6e 67 20 75 73  iginal string us
14b0: 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65 28 29  ing sqliteFree()
14c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
14e0: 6e 20 61 6c 6c 20 73 74 72 69 6e 67 73 20 74 68  n all strings th
14f0: 61 74 20 61 72 65 20 70 61 73 73 65 64 20 6f 75  at are passed ou
1500: 74 73 69 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  tside of.** the 
1510: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
1520: 20 54 68 61 74 20 77 61 79 20 63 6c 69 65 6e 74   That way client
1530: 73 20 63 61 6e 20 66 72 65 65 20 74 68 65 20 73  s can free the s
1540: 74 72 69 6e 67 20 75 73 69 6e 67 20 66 72 65 65  tring using free
1550: 28 29 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  ().** rather tha
1560: 6e 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c  n having to call
1570: 20 73 71 6c 69 74 65 46 72 65 65 28 29 2e 0a 2a   sqliteFree()..*
1580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
1590: 72 52 65 61 6c 6c 6f 63 28 63 68 61 72 20 2a 2a  rRealloc(char **
15a0: 70 7a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  pz){.  char *zNe
15b0: 77 3b 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 7c  w;.  if( pz==0 |
15c0: 7c 20 2a 70 7a 3d 3d 30 20 29 20 72 65 74 75 72  | *pz==0 ) retur
15d0: 6e 3b 0a 20 20 7a 4e 65 77 20 3d 20 6d 61 6c 6c  n;.  zNew = mall
15e0: 6f 63 28 20 73 74 72 6c 65 6e 28 2a 70 7a 29 20  oc( strlen(*pz) 
15f0: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 4e 65  + 1 );.  if( zNe
1600: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
1610: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
1620: 64 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  d++;.    sqliteF
1630: 72 65 65 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  ree(*pz);.    *p
1640: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 74 72  z = 0;.  }.  str
1650: 63 70 79 28 7a 4e 65 77 2c 20 2a 70 7a 29 3b 0a  cpy(zNew, *pz);.
1660: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
1670: 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 4e 65 77 3b  );.  *pz = zNew;
1680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1690: 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
16a0: 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  g in memory obta
16b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
16c0: 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72  Malloc().*/.char
16d0: 20 2a 73 71 6c 69 74 65 33 53 74 72 44 75 70 5f   *sqlite3StrDup_
16e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
16f0: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
1700: 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72 20 2a   line){.  char *
1710: 7a 4e 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  zNew;.  if( z==0
1720: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1730: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  New = sqlite3Mal
1740: 6c 6f 63 5f 28 73 74 72 6c 65 6e 28 7a 29 2b 31  loc_(strlen(z)+1
1750: 2c 20 30 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65  , 0, zFile, line
1760: 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20  );.  if( zNew ) 
1770: 73 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b  strcpy(zNew, z);
1780: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a  .  return zNew;.
1790: 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 53  }.char *sqlite3S
17a0: 74 72 4e 44 75 70 5f 28 63 6f 6e 73 74 20 63 68  trNDup_(const ch
17b0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 68  ar *z, int n, ch
17c0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c  ar *zFile, int l
17d0: 69 6e 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ine){.  char *zN
17e0: 65 77 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ew;.  if( z==0 )
17f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65   return 0;.  zNe
1800: 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  w = sqlite3Mallo
1810: 63 5f 28 6e 2b 31 2c 20 30 2c 20 7a 46 69 6c 65  c_(n+1, 0, zFile
1820: 2c 20 6c 69 6e 65 29 3b 0a 20 20 69 66 28 20 7a  , line);.  if( z
1830: 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  New ){.    memcp
1840: 79 28 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20  y(zNew, z, n);. 
1850: 20 20 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a     zNew[n] = 0;.
1860: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65    }.  return zNe
1870: 77 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4d  w;.}.#endif /* M
1880: 45 4d 4f 52 59 5f 44 45 42 55 47 20 2a 2f 0a 0a  EMORY_DEBUG */..
1890: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
18a0: 69 6e 67 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ing versions of 
18b0: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 66 72 65  malloc() and fre
18c0: 65 28 29 20 61 72 65 20 66 6f 72 20 75 73 65 20  e() are for use 
18d0: 69 6e 20 61 0a 2a 2a 20 6e 6f 72 6d 61 6c 20 62  in a.** normal b
18e0: 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  uild..*/.#if !de
18f0: 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42  fined(MEMORY_DEB
1900: 55 47 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  UG)../*.** Alloc
1910: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61  ate new memory a
1920: 6e 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72  nd set it to zer
1930: 6f 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  o.  Return NULL 
1940: 69 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20  if.** no memory 
1950: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53  is available.  S
1960: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 4d 61  ee also sqliteMa
1970: 6c 6c 6f 63 52 61 77 28 29 2e 0a 2a 2f 0a 76 6f  llocRaw()..*/.vo
1980: 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  id *sqliteMalloc
1990: 28 69 6e 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20  (int n){.  void 
19a0: 2a 70 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 6d  *p;.  if( (p = m
19b0: 61 6c 6c 6f 63 28 6e 29 29 3d 3d 30 20 29 7b 0a  alloc(n))==0 ){.
19c0: 20 20 20 20 69 66 28 20 6e 3e 30 20 29 20 73 71      if( n>0 ) sq
19d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
19e0: 6c 65 64 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  led++;.  }else{.
19f0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1a00: 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n);.  }.  retur
1a10: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n p;.}../*.** Al
1a20: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
1a30: 79 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 65 74  y but do not set
1a40: 20 69 74 20 74 6f 20 7a 65 72 6f 2e 20 20 52 65   it to zero.  Re
1a50: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
1a60: 6e 6f 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  no memory is ava
1a70: 69 6c 61 62 6c 65 2e 20 20 53 65 65 20 61 6c 73  ilable.  See als
1a80: 6f 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  o sqliteMalloc()
1a90: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1aa0: 65 4d 61 6c 6c 6f 63 52 61 77 28 69 6e 74 20 6e  eMallocRaw(int n
1ab0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
1ac0: 69 66 28 20 28 70 20 3d 20 6d 61 6c 6c 6f 63 28  if( (p = malloc(
1ad0: 6e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  n))==0 ){.    if
1ae0: 28 20 6e 3e 30 20 29 20 73 71 6c 69 74 65 33 5f  ( n>0 ) sqlite3_
1af0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b  malloc_failed++;
1b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
1b20: 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
1b30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1b40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f  qliteMalloc().*/
1b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 72 65 65  .void sqliteFree
1b60: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 66 28  (void *p){.  if(
1b70: 20 70 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70   p ){.    free(p
1b80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b90: 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20 61  Resize a prior a
1ba0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 70  llocation.  If p
1bb0: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ==0, then this r
1bc0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20  outine.** works 
1bd0: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
1be0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e 3d  Malloc().  If n=
1bf0: 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  =0, then this ro
1c00: 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20 6a  utine.** works j
1c10: 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 46  ust like sqliteF
1c20: 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ree()..*/.void *
1c30: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 76 6f  sqliteRealloc(vo
1c40: 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  id *p, int n){. 
1c50: 20 76 6f 69 64 20 2a 70 32 3b 0a 20 20 69 66 28   void *p2;.  if(
1c60: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   p==0 ){.    ret
1c70: 75 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  urn sqliteMalloc
1c80: 28 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  (n);.  }.  if( n
1c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1ca0: 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  eFree(p);.    re
1cb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 32  turn 0;.  }.  p2
1cc0: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2c 20 6e 29   = realloc(p, n)
1cd0: 3b 0a 20 20 69 66 28 20 70 32 3d 3d 30 20 29 7b  ;.  if( p2==0 ){
1ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c  .    sqlite3_mal
1cf0: 6c 6f 63 5f 66 61 69 6c 65 64 2b 2b 3b 0a 20 20  loc_failed++;.  
1d00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 32 3b 0a 7d  }.  return p2;.}
1d10: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
1d20: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 20  opy of a string 
1d30: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1d40: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
1d50: 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68 61 72 20 2a  lloc().*/.char *
1d60: 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6e  sqliteStrDup(con
1d70: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1d80: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28  har *zNew;.  if(
1d90: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   z==0 ) return 0
1da0: 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  zNew = sqlit
1db0: 65 4d 61 6c 6c 6f 63 52 61 77 28 73 74 72 6c 65  eMallocRaw(strle
1dc0: 6e 28 7a 29 2b 31 29 3b 0a 20 20 69 66 28 20 7a  n(z)+1);.  if( z
1dd0: 4e 65 77 20 29 20 73 74 72 63 70 79 28 7a 4e 65  New ) strcpy(zNe
1de0: 77 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, z);.  return 
1df0: 7a 4e 65 77 3b 0a 7d 0a 63 68 61 72 20 2a 73 71  zNew;.}.char *sq
1e00: 6c 69 74 65 53 74 72 4e 44 75 70 28 63 6f 6e 73  liteStrNDup(cons
1e10: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1e20: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  ){.  char *zNew;
1e30: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1e40: 74 75 72 6e 20 30 3b 0a 20 20 7a 4e 65 77 20 3d  turn 0;.  zNew =
1e50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1e60: 28 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a 4e 65  (n+1);.  if( zNe
1e70: 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  w ){.    memcpy(
1e80: 7a 4e 65 77 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  zNew, z, n);.   
1e90: 20 7a 4e 65 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zNew[n] = 0;.  
1ea0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b  }.  return zNew;
1eb0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1ec0: 66 69 6e 65 64 28 4d 45 4d 4f 52 59 5f 44 45 42  fined(MEMORY_DEB
1ed0: 55 47 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72  UG) */../*.** Cr
1ee0: 65 61 74 65 20 61 20 73 74 72 69 6e 67 20 66 72  eate a string fr
1ef0: 6f 6d 20 74 68 65 20 32 6e 64 20 61 6e 64 20 73  om the 2nd and s
1f00: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
1f10: 6e 74 73 20 28 75 70 20 74 6f 20 74 68 65 0a 2a  nts (up to the.*
1f20: 2a 20 66 69 72 73 74 20 4e 55 4c 4c 20 61 72 67  * first NULL arg
1f30: 75 6d 65 6e 74 29 2c 20 73 74 6f 72 65 20 74 68  ument), store th
1f40: 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d 6f  e string in memo
1f50: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f60: 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  .** sqliteMalloc
1f70: 28 29 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20  () and make the 
1f80: 70 6f 69 6e 74 65 72 20 69 6e 64 69 63 61 74 65  pointer indicate
1f90: 64 20 62 79 20 74 68 65 20 31 73 74 20 61 72 67  d by the 1st arg
1fa0: 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 20 74  ument.** point t
1fb0: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20  o that string.  
1fc0: 54 68 65 20 31 73 74 20 61 72 67 75 6d 65 6e 74  The 1st argument
1fd0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20   must either be 
1fe0: 4e 55 4c 4c 20 6f 72 20 0a 2a 2a 20 70 6f 69 6e  NULL or .** poin
1ff0: 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t to memory obta
2000: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2010: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69  Malloc()..*/.voi
2020: 64 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69  d sqlite3SetStri
2030: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 63 6f  ng(char **pz, co
2040: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74  nst char *zFirst
2050: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2060: 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74  t ap;.  int nByt
2070: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
2080: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  *z;.  char *zRes
2090: 75 6c 74 3b 0a 0a 20 20 69 66 28 20 70 7a 3d 3d  ult;..  if( pz==
20a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e 42  0 ) return;.  nB
20b0: 79 74 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  yte = strlen(zFi
20c0: 72 73 74 29 20 2b 20 31 3b 0a 20 20 76 61 5f 73  rst) + 1;.  va_s
20d0: 74 61 72 74 28 61 70 2c 20 7a 46 69 72 73 74 29  tart(ap, zFirst)
20e0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 20 3d 20  ;.  while( (z = 
20f0: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
2100: 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20   char*))!=0 ){. 
2110: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
2120: 65 6e 28 7a 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  en(z);.  }.  va_
2130: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
2140: 65 46 72 65 65 28 2a 70 7a 29 3b 0a 20 20 2a 70  eFree(*pz);.  *p
2150: 7a 20 3d 20 7a 52 65 73 75 6c 74 20 3d 20 73 71  z = zResult = sq
2160: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
2170: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 52  Byte );.  if( zR
2180: 65 73 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  esult==0 ){.    
2190: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 74  return;.  }.  st
21a0: 72 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 46  rcpy(zResult, zF
21b0: 69 72 73 74 29 3b 0a 20 20 7a 52 65 73 75 6c 74  irst);.  zResult
21c0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75   += strlen(zResu
21d0: 6c 74 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  lt);.  va_start(
21e0: 61 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 77  ap, zFirst);.  w
21f0: 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72  hile( (z = va_ar
2200: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
2210: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74  *))!=0 ){.    st
2220: 72 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 29  rcpy(zResult, z)
2230: 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d  ;.    zResult +=
2240: 20 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29   strlen(zResult)
2250: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2260: 70 29 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52  p);.#ifdef MEMOR
2270: 59 5f 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f  Y_DEBUG.#if MEMO
2280: 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72  RY_DEBUG>1.  fpr
2290: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 73 74 72  intf(stderr,"str
22a0: 69 6e 67 20 61 74 20 30 78 25 78 20 69 73 20 25  ing at 0x%x is %
22b0: 73 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20  s\n", (int)*pz, 
22c0: 2a 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  *pz);.#endif.#en
22d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72  dif.}../*.** Wor
22e0: 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 53  ks like sqlite3S
22f0: 65 74 53 74 72 69 6e 67 2c 20 62 75 74 20 65 61  etString, but ea
2300: 63 68 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 77  ch string is now
2310: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20   followed by.** 
2320: 61 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  a length integer
2330: 20 77 68 69 63 68 20 73 70 65 63 69 66 69 65 73   which specifies
2340: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
2350: 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 0a   source string .
2360: 2a 2a 20 74 6f 20 63 6f 70 79 20 28 69 6e 20 62  ** to copy (in b
2370: 79 74 65 73 29 2e 20 20 2d 31 20 6d 65 61 6e 73  ytes).  -1 means
2380: 20 75 73 65 20 74 68 65 20 77 68 6f 6c 65 20 73   use the whole s
2390: 74 72 69 6e 67 2e 20 20 54 68 65 20 31 73 74 20  tring.  The 1st 
23a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  .** argument mus
23b0: 74 20 65 69 74 68 65 72 20 62 65 20 4e 55 4c 4c  t either be NULL
23c0: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
23d0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
23e0: 6d 20 0a 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c  m .** sqliteMall
23f0: 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oc()..*/.void sq
2400: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
2410: 63 68 61 72 20 2a 2a 70 7a 2c 20 2e 2e 2e 29 7b  char **pz, ...){
2420: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2430: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 6f   int nByte;.  co
2440: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
2450: 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20  har *zResult;.  
2460: 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 70 7a  int n;..  if( pz
2470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2480: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 76 61 5f  nByte = 0;.  va_
2490: 73 74 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20  start(ap, pz);. 
24a0: 20 77 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f   while( (z = va_
24b0: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
24c0: 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ar*))!=0 ){.    
24d0: 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  n = va_arg(ap, i
24e0: 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d  nt);.    if( n<=
24f0: 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  0 ) n = strlen(z
2500: 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  );.    nByte += 
2510: 6e 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  n;.  }.  va_end(
2520: 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ap);.  sqliteFre
2530: 65 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20  e(*pz);.  *pz = 
2540: 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  zResult = sqlite
2550: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65  MallocRaw( nByte
2560: 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 52   + 1 );.  if( zR
2570: 65 73 75 6c 74 3d 3d 30 20 29 20 72 65 74 75 72  esult==0 ) retur
2580: 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  n;.  va_start(ap
2590: 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20  , pz);.  while( 
25a0: 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  (z = va_arg(ap, 
25b0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30  const char*))!=0
25c0: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61 5f 61   ){.    n = va_a
25d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
25e0: 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d 20   if( n<=0 ) n = 
25f0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 73  strlen(z);.    s
2600: 74 72 6e 63 70 79 28 7a 52 65 73 75 6c 74 2c 20  trncpy(zResult, 
2610: 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 52 65 73 75  z, n);.    zResu
2620: 6c 74 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20 2a  lt += n;.  }.  *
2630: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 69 66  zResult = 0;.#if
2640: 64 65 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55 47  def MEMORY_DEBUG
2650: 0a 23 69 66 20 4d 45 4d 4f 52 59 5f 44 45 42 55  .#if MEMORY_DEBU
2660: 47 3e 31 0a 20 20 66 70 72 69 6e 74 66 28 73 74  G>1.  fprintf(st
2670: 64 65 72 72 2c 22 73 74 72 69 6e 67 20 61 74 20  derr,"string at 
2680: 30 78 25 78 20 69 73 20 25 73 5c 6e 22 2c 20 28  0x%x is %s\n", (
2690: 69 6e 74 29 2a 70 7a 2c 20 2a 70 7a 29 3b 0a 23  int)*pz, *pz);.#
26a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 76  endif.#endif.  v
26b0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a  a_end(ap);.}../*
26c0: 0a 2a 2a 20 41 64 64 20 61 6e 20 65 72 72 6f 72  .** Add an error
26d0: 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72   message to pPar
26e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20  se->zErrMsg and 
26f0: 69 6e 63 72 65 6d 65 6e 74 20 70 50 61 72 73 65  increment pParse
2700: 2d 3e 6e 45 72 72 2e 0a 2a 2a 20 54 68 65 20 66  ->nErr..** The f
2710: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 74  ollowing formatt
2720: 69 6e 67 20 63 68 61 72 61 63 74 65 72 73 20 61  ing characters a
2730: 72 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  re allowed:.**.*
2740: 2a 20 20 20 20 20 20 25 73 20 20 20 20 20 20 49  *      %s      I
2750: 6e 73 65 72 74 20 61 20 73 74 72 69 6e 67 0a 2a  nsert a string.*
2760: 2a 20 20 20 20 20 20 25 7a 20 20 20 20 20 20 41  *      %z      A
2770: 20 73 74 72 69 6e 67 20 74 68 61 74 20 73 68 6f   string that sho
2780: 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 66 74  uld be freed aft
2790: 65 72 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 25  er use.**      %
27a0: 64 20 20 20 20 20 20 49 6e 73 65 72 74 20 61 6e  d      Insert an
27b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
27c0: 20 25 54 20 20 20 20 20 20 49 6e 73 65 72 74 20   %T      Insert 
27d0: 61 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 20  a token.**      
27e0: 25 53 20 20 20 20 20 20 49 6e 73 65 72 74 20 74  %S      Insert t
27f0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
2800: 20 6f 66 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   of a SrcList.*/
2810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 72 72  .void sqlite3Err
2820: 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61  orMsg(Parse *pPa
2830: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
2840: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2850: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2860: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2870: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
2880: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  rse->zErrMsg);. 
2890: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
28a0: 6f 72 6d 61 74 29 3b 0a 20 20 70 50 61 72 73 65  ormat);.  pParse
28b0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
28c0: 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72  te3VMPrintf(zFor
28d0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
28e0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
28f0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 53 51 4c 2d   Convert an SQL-
2900: 73 74 79 6c 65 20 71 75 6f 74 65 64 20 73 74 72  style quoted str
2910: 69 6e 67 20 69 6e 74 6f 20 61 20 6e 6f 72 6d 61  ing into a norma
2920: 6c 20 73 74 72 69 6e 67 20 62 79 20 72 65 6d 6f  l string by remo
2930: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 71 75 6f 74  ving.** the quot
2940: 65 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54  e characters.  T
2950: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  he conversion is
2960: 20 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65 2e 20   done in-place. 
2970: 20 49 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74   If the.** input
2980: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
2990: 77 69 74 68 20 61 20 71 75 6f 74 65 20 63 68 61  with a quote cha
29a0: 72 61 63 74 65 72 2c 20 74 68 65 6e 20 74 68 69  racter, then thi
29b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
29c0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 32  a no-op..**.** 2
29d0: 30 30 32 2d 46 65 62 2d 31 34 3a 20 54 68 69 73  002-Feb-14: This
29e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 65 78 74 65   routine is exte
29f0: 6e 64 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 4d  nded to remove M
2a00: 53 2d 41 63 63 65 73 73 20 73 74 79 6c 65 0a 2a  S-Access style.*
2a10: 2a 20 62 72 61 63 6b 65 74 73 20 66 72 6f 6d 20  * brackets from 
2a20: 61 72 6f 75 6e 64 20 69 64 65 6e 74 69 66 65 72  around identifer
2a30: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
2a40: 20 20 22 5b 61 2d 62 2d 63 5d 22 20 62 65 63 6f    "[a-b-c]" beco
2a50: 6d 65 73 0a 2a 2a 20 22 61 2d 62 2d 63 22 2e 0a  mes.** "a-b-c"..
2a60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
2a70: 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29 7b  equote(char *z){
2a80: 0a 20 20 69 6e 74 20 71 75 6f 74 65 3b 0a 20 20  .  int quote;.  
2a90: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
2aa0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
2ab0: 20 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20   quote = z[0];. 
2ac0: 20 73 77 69 74 63 68 28 20 71 75 6f 74 65 20 29   switch( quote )
2ad0: 7b 0a 20 20 20 20 63 61 73 65 20 27 5c 27 27 3a  {.    case '\'':
2ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2af0: 65 20 27 22 27 3a 20 20 20 62 72 65 61 6b 3b 0a  e '"':   break;.
2b00: 20 20 20 20 63 61 73 65 20 27 5b 27 3a 20 20 20      case '[':   
2b10: 71 75 6f 74 65 20 3d 20 27 5d 27 3b 20 20 62 72  quote = ']';  br
2b20: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
2b30: 3a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  :    return;.  }
2b40: 0a 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b  .  for(i=1, j=0;
2b50: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
2b60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 71 75 6f 74 65   if( z[i]==quote
2b70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
2b80: 69 2b 31 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20  i+1]==quote ){. 
2b90: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
2ba0: 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 69  quote;.        i
2bb0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
2bc0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
2bd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
2be0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 6a  }else{.      z[j
2c00: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
2c10: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 6e 20 61  }.  }.}../* An a
2c20: 72 72 61 79 20 74 6f 20 6d 61 70 20 61 6c 6c 20  rray to map all 
2c30: 75 70 70 65 72 2d 63 61 73 65 20 63 68 61 72 61  upper-case chara
2c40: 63 74 65 72 73 20 69 6e 74 6f 20 74 68 65 69 72  cters into their
2c50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2c60: 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 63 68 61  * lower-case cha
2c70: 72 61 63 74 65 72 2e 20 0a 2a 2f 0a 73 74 61 74  racter. .*/.stat
2c80: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
2c90: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 5d 20   UpperToLower[] 
2ca0: 3d 20 7b 0a 20 20 20 20 20 20 30 2c 20 20 31 2c  = {.      0,  1,
2cb0: 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c    2,  3,  4,  5,
2cc0: 20 20 36 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c    6,  7,  8,  9,
2cd0: 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c   10, 11, 12, 13,
2ce0: 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 31 37 2c   14, 15, 16, 17,
2cf0: 0a 20 20 20 20 20 31 38 2c 20 31 39 2c 20 32 30  .     18, 19, 20
2d00: 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34  , 21, 22, 23, 24
2d10: 2c 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38  , 25, 26, 27, 28
2d20: 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32  , 29, 30, 31, 32
2d30: 2c 20 33 33 2c 20 33 34 2c 20 33 35 2c 0a 20 20  , 33, 34, 35,.  
2d40: 20 20 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 33     36, 37, 38, 3
2d50: 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34  9, 40, 41, 42, 4
2d60: 33 2c 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34  3, 44, 45, 46, 4
2d70: 37 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35  7, 48, 49, 50, 5
2d80: 31 2c 20 35 32 2c 20 35 33 2c 0a 20 20 20 20 20  1, 52, 53,.     
2d90: 35 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20  54, 55, 56, 57, 
2da0: 35 38 2c 20 35 39 2c 20 36 30 2c 20 36 31 2c 20  58, 59, 60, 61, 
2db0: 36 32 2c 20 36 33 2c 20 36 34 2c 20 39 37 2c 20  62, 63, 64, 97, 
2dc0: 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31  98, 99,100,101,1
2dd0: 30 32 2c 31 30 33 2c 0a 20 20 20 20 31 30 34 2c  02,103,.    104,
2de0: 31 30 35 2c 31 30 36 2c 31 30 37 2c 31 30 38 2c  105,106,107,108,
2df0: 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c  109,110,111,112,
2e00: 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c  113,114,115,116,
2e10: 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c  117,118,119,120,
2e20: 31 32 31 2c 0a 20 20 20 20 31 32 32 2c 20 39 31  121,.    122, 91
2e30: 2c 20 39 32 2c 20 39 33 2c 20 39 34 2c 20 39 35  , 92, 93, 94, 95
2e40: 2c 20 39 36 2c 20 39 37 2c 20 39 38 2c 20 39 39  , 96, 97, 98, 99
2e50: 2c 31 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33  ,100,101,102,103
2e60: 2c 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37  ,104,105,106,107
2e70: 2c 0a 20 20 20 20 31 30 38 2c 31 30 39 2c 31 31  ,.    108,109,11
2e80: 30 2c 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31  0,111,112,113,11
2e90: 34 2c 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31  4,115,116,117,11
2ea0: 38 2c 31 31 39 2c 31 32 30 2c 31 32 31 2c 31 32  8,119,120,121,12
2eb0: 32 2c 31 32 33 2c 31 32 34 2c 31 32 35 2c 0a 20  2,123,124,125,. 
2ec0: 20 20 20 31 32 36 2c 31 32 37 2c 31 32 38 2c 31     126,127,128,1
2ed0: 32 39 2c 31 33 30 2c 31 33 31 2c 31 33 32 2c 31  29,130,131,132,1
2ee0: 33 33 2c 31 33 34 2c 31 33 35 2c 31 33 36 2c 31  33,134,135,136,1
2ef0: 33 37 2c 31 33 38 2c 31 33 39 2c 31 34 30 2c 31  37,138,139,140,1
2f00: 34 31 2c 31 34 32 2c 31 34 33 2c 0a 20 20 20 20  41,142,143,.    
2f10: 31 34 34 2c 31 34 35 2c 31 34 36 2c 31 34 37 2c  144,145,146,147,
2f20: 31 34 38 2c 31 34 39 2c 31 35 30 2c 31 35 31 2c  148,149,150,151,
2f30: 31 35 32 2c 31 35 33 2c 31 35 34 2c 31 35 35 2c  152,153,154,155,
2f40: 31 35 36 2c 31 35 37 2c 31 35 38 2c 31 35 39 2c  156,157,158,159,
2f50: 31 36 30 2c 31 36 31 2c 0a 20 20 20 20 31 36 32  160,161,.    162
2f60: 2c 31 36 33 2c 31 36 34 2c 31 36 35 2c 31 36 36  ,163,164,165,166
2f70: 2c 31 36 37 2c 31 36 38 2c 31 36 39 2c 31 37 30  ,167,168,169,170
2f80: 2c 31 37 31 2c 31 37 32 2c 31 37 33 2c 31 37 34  ,171,172,173,174
2f90: 2c 31 37 35 2c 31 37 36 2c 31 37 37 2c 31 37 38  ,175,176,177,178
2fa0: 2c 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 31 38  ,179,.    180,18
2fb0: 31 2c 31 38 32 2c 31 38 33 2c 31 38 34 2c 31 38  1,182,183,184,18
2fc0: 35 2c 31 38 36 2c 31 38 37 2c 31 38 38 2c 31 38  5,186,187,188,18
2fd0: 39 2c 31 39 30 2c 31 39 31 2c 31 39 32 2c 31 39  9,190,191,192,19
2fe0: 33 2c 31 39 34 2c 31 39 35 2c 31 39 36 2c 31 39  3,194,195,196,19
2ff0: 37 2c 0a 20 20 20 20 31 39 38 2c 31 39 39 2c 32  7,.    198,199,2
3000: 30 30 2c 32 30 31 2c 32 30 32 2c 32 30 33 2c 32  00,201,202,203,2
3010: 30 34 2c 32 30 35 2c 32 30 36 2c 32 30 37 2c 32  04,205,206,207,2
3020: 30 38 2c 32 30 39 2c 32 31 30 2c 32 31 31 2c 32  08,209,210,211,2
3030: 31 32 2c 32 31 33 2c 32 31 34 2c 32 31 35 2c 0a  12,213,214,215,.
3040: 20 20 20 20 32 31 36 2c 32 31 37 2c 32 31 38 2c      216,217,218,
3050: 32 31 39 2c 32 32 30 2c 32 32 31 2c 32 32 32 2c  219,220,221,222,
3060: 32 32 33 2c 32 32 34 2c 32 32 35 2c 32 32 36 2c  223,224,225,226,
3070: 32 32 37 2c 32 32 38 2c 32 32 39 2c 32 33 30 2c  227,228,229,230,
3080: 32 33 31 2c 32 33 32 2c 32 33 33 2c 0a 20 20 20  231,232,233,.   
3090: 20 32 33 34 2c 32 33 35 2c 32 33 36 2c 32 33 37   234,235,236,237
30a0: 2c 32 33 38 2c 32 33 39 2c 32 34 30 2c 32 34 31  ,238,239,240,241
30b0: 2c 32 34 32 2c 32 34 33 2c 32 34 34 2c 32 34 35  ,242,243,244,245
30c0: 2c 32 34 36 2c 32 34 37 2c 32 34 38 2c 32 34 39  ,246,247,248,249
30d0: 2c 32 35 30 2c 32 35 31 2c 0a 20 20 20 20 32 35  ,250,251,.    25
30e0: 32 2c 32 35 33 2c 32 35 34 2c 32 35 35 0a 7d 3b  2,253,254,255.};
30f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3100: 63 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73 20 61  ction computes a
3110: 20 68 61 73 68 20 6f 6e 20 74 68 65 20 6e 61 6d   hash on the nam
3120: 65 20 6f 66 20 61 20 6b 65 79 77 6f 72 64 2e 0a  e of a keyword..
3130: 2a 2a 20 43 61 73 65 20 69 73 20 6e 6f 74 20 73  ** Case is not s
3140: 69 67 6e 69 66 69 63 61 6e 74 2e 0a 2a 2f 0a 69  ignificant..*/.i
3150: 6e 74 20 73 71 6c 69 74 65 33 48 61 73 68 4e 6f  nt sqlite3HashNo
3160: 43 61 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Case(const char 
3170: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
3180: 74 20 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  t h = 0;.  if( n
3190: 3c 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e  <=0 ) n = strlen
31a0: 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 20  (z);.  while( n 
31b0: 3e 20 30 20 20 29 7b 0a 20 20 20 20 68 20 3d 20  > 0  ){.    h = 
31c0: 28 68 3c 3c 33 29 20 5e 20 68 20 5e 20 55 70 70  (h<<3) ^ h ^ Upp
31d0: 65 72 54 6f 4c 6f 77 65 72 5b 28 75 6e 73 69 67  erToLower[(unsig
31e0: 6e 65 64 20 63 68 61 72 29 2a 7a 2b 2b 5d 3b 0a  ned char)*z++];.
31f0: 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 72      n--;.  }.  r
3200: 65 74 75 72 6e 20 68 20 26 20 30 78 37 66 66 66  eturn h & 0x7fff
3210: 66 66 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ffff;.}../*.** S
3220: 6f 6d 65 20 73 79 73 74 65 6d 73 20 68 61 76 65  ome systems have
3230: 20 73 74 72 69 63 6d 70 28 29 2e 20 20 4f 74 68   stricmp().  Oth
3240: 65 72 73 20 68 61 76 65 20 73 74 72 63 61 73 65  ers have strcase
3250: 63 6d 70 28 29 2e 20 20 42 65 63 61 75 73 65 0a  cmp().  Because.
3260: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  ** there is no c
3270: 6f 6e 73 69 73 74 65 6e 63 79 2c 20 77 65 20 77  onsistency, we w
3280: 69 6c 6c 20 64 65 66 69 6e 65 20 6f 75 72 20 6f  ill define our o
3290: 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  wn..*/.int sqlit
32a0: 65 33 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20  e3StrICmp(const 
32b0: 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e  char *zLeft, con
32c0: 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74 29  st char *zRight)
32d0: 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e 73  {.  register uns
32e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a  igned char *a, *
32f0: 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e  b;.  a = (unsign
3300: 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b  ed char *)zLeft;
3310: 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  .  b = (unsigned
3320: 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a   char *)zRight;.
3330: 20 20 77 68 69 6c 65 28 20 2a 61 21 3d 30 20 26    while( *a!=0 &
3340: 26 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  & UpperToLower[*
3350: 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72  a]==UpperToLower
3360: 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b  [*b]){ a++; b++;
3370: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 61 20 2d   }.  return *a -
3380: 20 2a 62 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   *b;.}.int sqlit
3390: 65 33 53 74 72 4e 49 43 6d 70 28 63 6f 6e 73 74  e3StrNICmp(const
33a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 63 6f   char *zLeft, co
33b0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 69 67 68 74  nst char *zRight
33c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 67 69  , int N){.  regi
33d0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63 68  ster unsigned ch
33e0: 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20 3d  ar *a, *b;.  a =
33f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
3400: 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20 28  *)zLeft;.  b = (
3410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
3420: 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65 28  zRight;.  while(
3430: 20 4e 2d 2d 20 3e 20 30 20 26 26 20 2a 61 21 3d   N-- > 0 && *a!=
3440: 30 20 26 26 20 55 70 70 65 72 54 6f 4c 6f 77 65  0 && UpperToLowe
3450: 72 5b 2a 61 5d 3d 3d 55 70 70 65 72 54 6f 4c 6f  r[*a]==UpperToLo
3460: 77 65 72 5b 2a 62 5d 29 7b 20 61 2b 2b 3b 20 62  wer[*b]){ a++; b
3470: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 4e  ++; }.  return N
3480: 3c 30 20 3f 20 30 20 3a 20 2a 61 20 2d 20 2a 62  <0 ? 0 : *a - *b
3490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34a0: 6e 20 54 52 55 45 20 69 66 20 7a 20 69 73 20 61  n TRUE if z is a
34b0: 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20 73 74   pure numeric st
34c0: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 46 41  ring.  Return FA
34d0: 4c 53 45 20 69 66 20 74 68 65 0a 2a 2a 20 73 74  LSE if the.** st
34e0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ring contains an
34f0: 79 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  y character whic
3500: 68 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  h is not part of
3510: 20 61 20 6e 75 6d 62 65 72 2e 20 49 66 0a 2a 2a   a number. If.**
3520: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e   the string is n
3530: 75 6d 65 72 69 63 20 61 6e 64 20 63 6f 6e 74 61  umeric and conta
3540: 69 6e 73 20 74 68 65 20 27 2e 27 20 63 68 61 72  ins the '.' char
3550: 61 63 74 65 72 2c 20 73 65 74 20 2a 72 65 61 6c  acter, set *real
3560: 6e 75 6d 0a 2a 2a 20 74 6f 20 54 52 55 45 20 28  num.** to TRUE (
3570: 6f 74 68 65 72 77 69 73 65 20 46 41 4c 53 45 29  otherwise FALSE)
3580: 2e 0a 2a 2a 0a 2a 2a 20 41 6d 20 65 6d 70 74 79  ..**.** Am empty
3590: 20 73 74 72 69 6e 67 20 69 73 20 63 6f 6e 73 69   string is consi
35a0: 64 65 72 65 64 20 6e 6f 6e 2d 6e 75 6d 65 72 69  dered non-numeri
35b0: 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
35c0: 33 49 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20  3IsNumber(const 
35d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
35e0: 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a  alnum){.  if( *z
35f0: 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27  =='-' || *z=='+'
3600: 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 69   ) z++;.  if( !i
3610: 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20  sdigit(*z) ){.  
3620: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3630: 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61    z++;.  if( rea
3640: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
3650: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  = 0;.  while( is
3660: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
3670: 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e  ; }.  if( *z=='.
3680: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
3690: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
36a0: 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
36b0: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
36c0: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
36d0: 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20      if( realnum 
36e0: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a  ) *realnum = 1;.
36f0: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65    }.  if( *z=='e
3700: 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a  ' || *z=='E' ){.
3710: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3720: 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d   *z=='+' || *z==
3730: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '-' ) z++;.    i
3740: 66 28 20 21 69 73 64 69 67 69 74 28 2a 7a 29 20  f( !isdigit(*z) 
3750: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3760: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
3770: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
3780: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
3790: 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
37a0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
37b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
37c0: 72 69 6e 67 20 7a 5b 5d 20 69 73 20 61 6e 20 61  ring z[] is an a
37d0: 73 63 69 69 20 72 65 70 72 65 73 65 6e 74 61 74  scii representat
37e0: 69 6f 6e 20 6f 66 20 61 20 72 65 61 6c 20 6e 75  ion of a real nu
37f0: 6d 62 65 72 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74  mber..** Convert
3800: 20 74 68 69 73 20 73 74 72 69 6e 67 20 74 6f 20   this string to 
3810: 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  a double..**.** 
3820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
3830: 75 6d 65 73 20 74 68 61 74 20 7a 5b 5d 20 72 65  umes that z[] re
3840: 61 6c 6c 79 20 69 73 20 61 20 76 61 6c 69 64 20  ally is a valid 
3850: 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 0a 2a  number.  If it.*
3860: 2a 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 72 65  * is not, the re
3870: 73 75 6c 74 20 69 73 20 75 6e 64 65 66 69 6e 65  sult is undefine
3880: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
3890: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
38a0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c 69 62  stead of the lib
38b0: 72 61 72 79 20 61 74 6f 66 28 29 20 66 75 6e 63  rary atof() func
38c0: 74 69 6f 6e 20 62 65 63 61 75 73 65 0a 2a 2a 20  tion because.** 
38d0: 74 68 65 20 6c 69 62 72 61 72 79 20 61 74 6f 66  the library atof
38e0: 28 29 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f  () might want to
38f0: 20 75 73 65 20 22 2c 22 20 61 73 20 74 68 65 20   use "," as the 
3900: 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e  decimal point in
3910: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 22 2e 22 20  stead.** of "." 
3920: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77  depending on how
3930: 20 6c 6f 63 61 6c 65 20 69 73 20 73 65 74 2e 20   locale is set. 
3940: 20 42 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   But that would 
3950: 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 0a 2a  cause problems.*
3960: 2a 20 66 6f 72 20 53 51 4c 2e 20 20 53 6f 20 74  * for SQL.  So t
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
3980: 79 73 20 75 73 65 73 20 22 2e 22 20 72 65 67 61  ys uses "." rega
3990: 72 64 6c 65 73 73 20 6f 66 20 6c 6f 63 61 6c 65  rdless of locale
39a0: 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71 6c 69  ..*/.double sqli
39b0: 74 65 33 41 74 6f 46 28 63 6f 6e 73 74 20 63 68  te3AtoF(const ch
39c0: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
39d0: 72 20 2a 2a 70 7a 45 6e 64 29 7b 0a 20 20 69 6e  r **pzEnd){.  in
39e0: 74 20 73 69 67 6e 20 3d 20 31 3b 0a 20 20 4c 4f  t sign = 1;.  LO
39f0: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 76 31  NGDOUBLE_TYPE v1
3a00: 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28 20 2a 7a   = 0.0;.  if( *z
3a10: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73 69 67  =='-' ){.    sig
3a20: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 2b 2b 3b  n = -1;.    z++;
3a30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 7a 3d  .  }else if( *z=
3a40: 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  ='+' ){.    z++;
3a50: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 73  .  }.  while( is
3a60: 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20  digit(*z) ){.   
3a70: 20 76 31 20 3d 20 76 31 2a 31 30 2e 30 20 2b 20   v1 = v1*10.0 + 
3a80: 28 2a 7a 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  (*z - '0');.    
3a90: 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  z++;.  }.  if( *
3aa0: 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 4c 4f  z=='.' ){.    LO
3ab0: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 69  NGDOUBLE_TYPE di
3ac0: 76 69 73 6f 72 20 3d 20 31 2e 30 3b 0a 20 20 20  visor = 1.0;.   
3ad0: 20 7a 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28   z++;.    while(
3ae0: 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a   isdigit(*z) ){.
3af0: 20 20 20 20 20 20 76 31 20 3d 20 76 31 2a 31 30        v1 = v1*10
3b00: 2e 30 20 2b 20 28 2a 7a 20 2d 20 27 30 27 29 3b  .0 + (*z - '0');
3b10: 0a 20 20 20 20 20 20 64 69 76 69 73 6f 72 20 2a  .      divisor *
3b20: 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 7a 2b  = 10.0;.      z+
3b30: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 31 20  +;.    }.    v1 
3b40: 2f 3d 20 64 69 76 69 73 6f 72 3b 0a 20 20 7d 0a  /= divisor;.  }.
3b50: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3b60: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3b70: 69 6e 74 20 65 73 69 67 6e 20 3d 20 31 3b 0a 20  int esign = 1;. 
3b80: 20 20 20 69 6e 74 20 65 76 61 6c 20 3d 20 30 3b     int eval = 0;
3b90: 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
3ba0: 54 59 50 45 20 73 63 61 6c 65 20 3d 20 31 2e 30  TYPE scale = 1.0
3bb0: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69  ;.    z++;.    i
3bc0: 66 28 20 2a 7a 3d 3d 27 2d 27 20 29 7b 0a 20 20  f( *z=='-' ){.  
3bd0: 20 20 20 20 65 73 69 67 6e 20 3d 20 2d 31 3b 0a      esign = -1;.
3be0: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
3bf0: 65 6c 73 65 20 69 66 28 20 2a 7a 3d 3d 27 2b 27  else if( *z=='+'
3c00: 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   ){.      z++;. 
3c10: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
3c20: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20  isdigit(*z) ){. 
3c30: 20 20 20 20 20 65 76 61 6c 20 3d 20 65 76 61 6c       eval = eval
3c40: 2a 31 30 20 2b 20 2a 7a 20 2d 20 27 30 27 3b 0a  *10 + *z - '0';.
3c50: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
3c60: 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c  .    while( eval
3c70: 3e 3d 36 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d  >=64 ){ scale *=
3c80: 20 31 2e 30 65 2b 36 34 3b 20 65 76 61 6c 20 2d   1.0e+64; eval -
3c90: 3d 20 36 34 3b 20 7d 0a 20 20 20 20 77 68 69 6c  = 64; }.    whil
3ca0: 65 28 20 65 76 61 6c 3e 3d 31 36 20 29 7b 20 73  e( eval>=16 ){ s
3cb0: 63 61 6c 65 20 2a 3d 20 31 2e 30 65 2b 31 36 3b  cale *= 1.0e+16;
3cc0: 20 65 76 61 6c 20 2d 3d 20 31 36 3b 20 7d 0a 20   eval -= 16; }. 
3cd0: 20 20 20 77 68 69 6c 65 28 20 65 76 61 6c 3e 3d     while( eval>=
3ce0: 34 20 29 7b 20 73 63 61 6c 65 20 2a 3d 20 31 2e  4 ){ scale *= 1.
3cf0: 30 65 2b 34 3b 20 65 76 61 6c 20 2d 3d 20 34 3b  0e+4; eval -= 4;
3d00: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 65 76   }.    while( ev
3d10: 61 6c 3e 3d 31 20 29 7b 20 73 63 61 6c 65 20 2a  al>=1 ){ scale *
3d20: 3d 20 31 2e 30 65 2b 31 3b 20 65 76 61 6c 20 2d  = 1.0e+1; eval -
3d30: 3d 20 31 3b 20 7d 0a 20 20 20 20 69 66 28 20 65  = 1; }.    if( e
3d40: 73 69 67 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  sign<0 ){.      
3d50: 76 31 20 2f 3d 20 73 63 61 6c 65 3b 0a 20 20 20  v1 /= scale;.   
3d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 31   }else{.      v1
3d70: 20 2a 3d 20 73 63 61 6c 65 3b 0a 20 20 20 20 7d   *= scale;.    }
3d80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 7a 45 6e 64  .  }.  if( pzEnd
3d90: 20 29 20 2a 70 7a 45 6e 64 20 3d 20 7a 3b 0a 20   ) *pzEnd = z;. 
3da0: 20 72 65 74 75 72 6e 20 73 69 67 6e 3c 30 20 3f   return sign<0 ?
3db0: 20 2d 76 31 20 3a 20 76 31 3b 0a 7d 0a 0a 2f 2a   -v1 : v1;.}../*
3dc0: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 7a  .** The string z
3dd0: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 61  Num represents a
3de0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 72  n integer.  Ther
3df0: 65 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20  e might be some 
3e00: 6f 74 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61  other.** informa
3e10: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tion following t
3e20: 68 65 20 69 6e 74 65 67 65 72 20 74 6f 6f 2c 20  he integer too, 
3e30: 62 75 74 20 74 68 61 74 20 70 61 72 74 20 69 73  but that part is
3e40: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 49 66 20   ignored..** If 
3e50: 74 68 65 20 69 6e 74 65 67 65 72 20 74 68 61 74  the integer that
3e60: 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a   the prefix of z
3e70: 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20 77  Num represents w
3e80: 69 6c 6c 20 66 69 74 20 69 6e 20 61 0a 2a 2a 20  ill fit in a.** 
3e90: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
3ea0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 54 52  teger, return TR
3eb0: 55 45 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  UE.  Otherwise r
3ec0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2a 0a  eturn FALSE..**.
3ed0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ee0: 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 66 6f  returns FALSE fo
3ef0: 72 20 74 68 65 20 73 74 72 69 6e 67 20 2d 32 31  r the string -21
3f00: 34 37 34 38 33 36 34 38 20 65 76 65 6e 20 74 68  47483648 even th
3f10: 61 74 0a 2a 2a 20 74 68 61 74 20 6e 75 6d 62 65  at.** that numbe
3f20: 72 20 77 69 6c 6c 2c 20 69 6e 20 74 68 65 6f 72  r will, in theor
3f30: 79 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  y fit in a 32-bi
3f40: 74 20 69 6e 74 65 67 65 72 2e 20 20 42 75 74 20  t integer.  But 
3f50: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 32 31 34 37  positive.** 2147
3f60: 34 38 33 36 34 38 20 77 69 6c 6c 20 6e 6f 74 20  483648 will not 
3f70: 66 69 74 20 69 6e 20 33 32 20 62 69 74 73 2e 20  fit in 32 bits. 
3f80: 20 53 6f 20 69 74 20 73 65 65 6d 73 20 73 61 66   So it seems saf
3f90: 65 72 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a 20  er to return.** 
3fa0: 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
3fb0: 6c 69 74 65 33 46 69 74 73 49 6e 33 32 42 69 74  lite3FitsIn32Bit
3fc0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  s(const char *zN
3fd0: 75 6d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63 3b  um){.  int i, c;
3fe0: 0a 20 20 69 66 28 20 2a 7a 4e 75 6d 3d 3d 27 2d  .  if( *zNum=='-
3ff0: 27 20 7c 7c 20 2a 7a 4e 75 6d 3d 3d 27 2b 27 20  ' || *zNum=='+' 
4000: 29 20 7a 4e 75 6d 2b 2b 3b 0a 20 20 66 6f 72 28  ) zNum++;.  for(
4010: 69 3d 30 3b 20 28 63 3d 7a 4e 75 6d 5b 69 5d 29  i=0; (c=zNum[i])
4020: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 3b  >='0' && c<='9';
4030: 20 69 2b 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e   i++){}.  return
4040: 20 69 3c 31 30 20 7c 7c 20 28 69 3d 3d 31 30 20   i<10 || (i==10 
4050: 26 26 20 6d 65 6d 63 6d 70 28 7a 4e 75 6d 2c 22  && memcmp(zNum,"
4060: 32 31 34 37 34 38 33 36 34 37 22 2c 31 30 29 3c  2147483647",10)<
4070: 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  =0);.}../* This 
4080: 63 6f 6d 70 61 72 69 73 6f 6e 20 72 6f 75 74 69  comparison routi
4090: 6e 65 20 69 73 20 77 68 61 74 20 77 65 20 75 73  ne is what we us
40a0: 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  e for comparison
40b0: 20 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 62   operations.** b
40c0: 65 74 77 65 65 6e 20 6e 75 6d 65 72 69 63 20 76  etween numeric v
40d0: 61 6c 75 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  alues in an SQL 
40e0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 22 4e 75  expression.  "Nu
40f0: 6d 65 72 69 63 22 20 69 73 20 61 20 6c 69 74 74  meric" is a litt
4100: 6c 65 0a 2a 2a 20 62 69 74 20 6d 69 73 6c 65 61  le.** bit mislea
4110: 64 69 6e 67 20 68 65 72 65 2e 20 20 57 68 61 74  ding here.  What
4120: 20 77 65 20 6d 65 61 6e 20 69 73 20 74 68 61 74   we mean is that
4130: 20 74 68 65 20 73 74 72 69 6e 67 73 20 68 61 76   the strings hav
4140: 65 20 61 0a 2a 2a 20 74 79 70 65 20 6f 66 20 22  e a.** type of "
4150: 6e 75 6d 65 72 69 63 22 20 66 72 6f 6d 20 74 68  numeric" from th
4160: 65 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 20  e point of view 
4170: 6f 66 20 53 51 4c 2e 20 20 54 68 65 20 73 74 72  of SQL.  The str
4180: 69 6e 67 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  ings.** do not n
4190: 65 63 65 73 73 61 72 69 6c 79 20 63 6f 6e 74 61  ecessarily conta
41a0: 69 6e 20 6e 75 6d 62 65 72 73 2e 20 20 54 68 65  in numbers.  The
41b0: 79 20 63 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20  y could contain 
41c0: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  text..**.** If t
41d0: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 73  he input strings
41e0: 20 62 6f 74 68 20 6c 6f 6f 6b 20 6c 69 6b 65 20   both look like 
41f0: 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 73 20 74  actual numbers t
4200: 68 65 6e 20 74 68 65 79 0a 2a 2a 20 63 6f 6d 70  hen they.** comp
4210: 61 72 65 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c  are in numerical
4220: 20 6f 72 64 65 72 2e 20 20 4e 75 6d 65 72 69 63   order.  Numeric
4230: 61 6c 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  al strings are a
4240: 6c 77 61 79 73 20 6c 65 73 73 20 0a 2a 2a 20 74  lways less .** t
4250: 68 61 6e 20 6e 6f 6e 2d 6e 75 6d 65 72 69 63 20  han non-numeric 
4260: 73 74 72 69 6e 67 73 20 73 6f 20 69 66 20 6f 6e  strings so if on
4270: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 6c  e input string l
4280: 6f 6f 6b 73 20 6c 69 6b 65 20 61 0a 2a 2a 20 6e  ooks like a.** n
4290: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74  umber and the ot
42a0: 68 65 72 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68  her does not, th
42b0: 65 6e 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  en the one that 
42c0: 6c 6f 6f 6b 73 20 6c 69 6b 65 0a 2a 2a 20 61 20  looks like.** a 
42d0: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 73 6d  number is the sm
42e0: 61 6c 6c 65 72 2e 20 20 4e 6f 6e 2d 6e 75 6d 65  aller.  Non-nume
42f0: 72 69 63 20 73 74 72 69 6e 67 73 20 63 6f 6d 70  ric strings comp
4300: 61 72 65 20 69 6e 20 0a 2a 2a 20 6c 65 78 69 67  are in .** lexig
4310: 72 61 70 68 69 63 61 6c 20 6f 72 64 65 72 20 28  raphical order (
4320: 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
4330: 73 20 73 74 72 63 6d 70 28 29 29 2e 0a 2a 2f 0a  s strcmp())..*/.
4340: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  int sqlite3Compa
4350: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  re(const char *a
4360: 74 65 78 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  text, const char
4370: 20 2a 62 74 65 78 74 29 7b 0a 20 20 69 6e 74 20   *btext){.  int 
4380: 72 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 73  result;.  int is
4390: 4e 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a 20 20  NumA, isNumB;.  
43a0: 69 66 28 20 61 74 65 78 74 3d 3d 30 20 29 7b 0a  if( atext==0 ){.
43b0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
43c0: 20 7d 65 6c 73 65 20 69 66 28 20 62 74 65 78 74   }else if( btext
43d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
43e0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 73 4e 75 6d  n 1;.  }.  isNum
43f0: 41 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  A = sqlite3IsNum
4400: 62 65 72 28 61 74 65 78 74 2c 20 30 29 3b 0a 20  ber(atext, 0);. 
4410: 20 69 73 4e 75 6d 42 20 3d 20 73 71 6c 69 74 65   isNumB = sqlite
4420: 33 49 73 4e 75 6d 62 65 72 28 62 74 65 78 74 2c  3IsNumber(btext,
4430: 20 30 29 3b 0a 20 20 69 66 28 20 69 73 4e 75 6d   0);.  if( isNum
4440: 41 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  A ){.    if( !is
4450: 4e 75 6d 42 20 29 7b 0a 20 20 20 20 20 20 72 65  NumB ){.      re
4460: 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  sult = -1;.    }
4470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 75 62  else{.      doub
4480: 6c 65 20 72 41 2c 20 72 42 3b 0a 20 20 20 20 20  le rA, rB;.     
4490: 20 72 41 20 3d 20 73 71 6c 69 74 65 33 41 74 6f   rA = sqlite3Ato
44a0: 46 28 61 74 65 78 74 2c 20 30 29 3b 0a 20 20 20  F(atext, 0);.   
44b0: 20 20 20 72 42 20 3d 20 73 71 6c 69 74 65 33 41     rB = sqlite3A
44c0: 74 6f 46 28 62 74 65 78 74 2c 20 30 29 3b 0a 20  toF(btext, 0);. 
44d0: 20 20 20 20 20 69 66 28 20 72 41 3c 72 42 20 29       if( rA<rB )
44e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
44f0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
4500: 73 65 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a  se if( rA>rB ){.
4510: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
4520: 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
4530: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  {.        result
4540: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4550: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4560: 69 73 4e 75 6d 42 20 29 7b 0a 20 20 20 20 72 65  isNumB ){.    re
4570: 73 75 6c 74 20 3d 20 2b 31 3b 0a 20 20 7d 65 6c  sult = +1;.  }el
4580: 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 20  se {.    result 
4590: 3d 20 73 74 72 63 6d 70 28 61 74 65 78 74 2c 20  = strcmp(atext, 
45a0: 62 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 65  btext);.  }.  re
45b0: 74 75 72 6e 20 72 65 73 75 6c 74 3b 20 0a 7d 0a  turn result; .}.
45c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
45d0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
45e0: 73 6f 72 74 69 6e 67 2e 20 20 45 61 63 68 20 6b  sorting.  Each k
45f0: 65 79 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ey is a list of 
4600: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 6e  one or more.** n
4610: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 65  ull-terminated e
4620: 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 6c 69  lements.  The li
4630: 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  st is terminated
4640: 20 62 79 20 74 77 6f 20 6e 75 6c 6c 73 20 69 6e   by two nulls in
4650: 0a 2a 2a 20 61 20 72 6f 77 2e 20 20 46 6f 72 20  .** a row.  For 
4660: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 6f 6c  example, the fol
4670: 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20 61  lowing text is a
4680: 20 6b 65 79 20 77 69 74 68 20 74 68 72 65 65 20   key with three 
4690: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 20  elements.**.**  
46a0: 20 20 20 20 20 20 20 20 20 20 41 6f 6e 65 5c 30            Aone\0
46b0: 30 30 44 74 77 6f 5c 30 30 30 41 74 68 72 65 65  00Dtwo\000Athree
46c0: 5c 30 30 30 5c 30 30 30 0a 2a 2a 0a 2a 2a 20 41  \000\000.**.** A
46d0: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 62 65 67 69  ll elements begi
46e0: 6e 20 77 69 74 68 20 6f 6e 65 20 6f 66 20 74 68  n with one of th
46f0: 65 20 63 68 61 72 61 63 74 65 72 73 20 22 2b 2d  e characters "+-
4700: 41 44 22 20 61 6e 64 20 65 6e 64 20 77 69 74 68  AD" and end with
4710: 20 22 5c 30 30 30 22 0a 2a 2a 20 77 69 74 68 20   "\000".** with 
4720: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 65 78  zero or more tex
4730: 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 62 65  t elements in be
4740: 74 77 65 65 6e 2e 20 20 45 78 63 65 70 74 2c 20  tween.  Except, 
4750: 4e 55 4c 4c 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a  NULL elements.**
4760: 20 63 6f 6e 73 69 73 74 20 6f 66 20 74 68 65 20   consist of the 
4770: 73 70 65 63 69 61 6c 20 74 77 6f 2d 63 68 61 72  special two-char
4780: 61 63 74 65 72 20 73 65 71 75 65 6e 63 65 20 22  acter sequence "
4790: 4e 5c 30 30 30 22 2e 0a 2a 2a 0a 2a 2a 20 42 6f  N\000"..**.** Bo
47a0: 74 68 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c  th arguments wil
47b0: 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  l have the same 
47c0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
47d0: 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ts.  This routin
47e0: 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 6e 65 67  e.** returns neg
47f0: 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
4800: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
4810: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
4820: 73 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 2c 20  s less.** than, 
4830: 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
4840: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 66 69  ater than the fi
4850: 72 73 74 2e 20 20 28 52 65 73 75 6c 74 20 69 73  rst.  (Result is
4860: 20 61 2d 62 29 2e 0a 2a 2a 0a 2a 2a 20 45 61 63   a-b)..**.** Eac
4870: 68 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73  h element begins
4880: 20 77 69 74 68 20 6f 6e 65 20 6f 66 20 74 68 65   with one of the
4890: 20 63 68 61 72 61 63 74 65 72 73 20 22 2b 22 2c   characters "+",
48a0: 20 22 2d 22 2c 20 22 41 22 2c 20 22 44 22 2e 0a   "-", "A", "D"..
48b0: 2a 2a 20 54 68 69 73 20 63 68 61 72 61 63 74 65  ** This characte
48c0: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  r determines the
48d0: 20 73 6f 72 74 20 6f 72 64 65 72 20 61 6e 64 20   sort order and 
48e0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
48f0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ce:.**.**     + 
4900: 20 20 20 20 20 53 6f 72 74 20 6e 75 6d 65 72 69       Sort numeri
4910: 63 61 6c 6c 79 20 69 6e 20 61 73 63 65 6e 64 69  cally in ascendi
4920: 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 20  ng order.**     
4930: 2d 20 20 20 20 20 20 53 6f 72 74 20 6e 75 6d 65  -      Sort nume
4940: 72 69 63 61 6c 6c 79 20 69 6e 20 64 65 73 63 65  rically in desce
4950: 6e 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20 20  nding order.**  
4960: 20 20 20 41 20 20 20 20 20 20 53 6f 72 74 20 61     A      Sort a
4970: 73 20 73 74 72 69 6e 67 73 20 69 6e 20 61 73 63  s strings in asc
4980: 65 6e 64 69 6e 67 20 6f 72 64 65 72 0a 2a 2a 20  ending order.** 
4990: 20 20 20 20 44 20 20 20 20 20 20 53 6f 72 74 20      D      Sort 
49a0: 61 73 20 73 74 72 69 6e 67 73 20 69 6e 20 64 65  as strings in de
49b0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
49c0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 22 2b  **.** For the "+
49d0: 22 20 61 6e 64 20 22 2d 22 20 73 6f 72 74 69 6e  " and "-" sortin
49e0: 67 2c 20 70 75 72 65 20 6e 75 6d 65 72 69 63 20  g, pure numeric 
49f0: 73 74 72 69 6e 67 73 20 28 73 74 72 69 6e 67 73  strings (strings
4a00: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 0a 2a   for which the.*
4a10: 2a 20 69 73 4e 75 6d 28 29 20 66 75 6e 63 74 69  * isNum() functi
4a20: 6f 6e 20 61 62 6f 76 65 20 72 65 74 75 72 6e 73  on above returns
4a30: 20 54 52 55 45 29 20 61 6c 77 61 79 73 20 63 6f   TRUE) always co
4a40: 6d 70 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  mpare less than 
4a50: 73 74 72 69 6e 67 73 0a 2a 2a 20 74 68 61 74 20  strings.** that 
4a60: 61 72 65 20 6e 6f 74 20 70 75 72 65 20 6e 75 6d  are not pure num
4a70: 65 72 69 63 73 2e 20 20 4e 6f 6e 2d 6e 75 6d 65  erics.  Non-nume
4a80: 72 69 63 20 73 74 72 69 6e 67 73 20 63 6f 6d 70  ric strings comp
4a90: 61 72 65 20 69 6e 20 6d 65 6d 63 6d 70 28 29 0a  are in memcmp().
4aa0: 2a 2a 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ** order.  This 
4ab0: 69 73 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74  is the same sort
4ac0: 20 6f 72 64 65 72 20 61 73 20 74 68 65 20 73 71   order as the sq
4ad0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 28 29 20 66  lite3Compare() f
4ae0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 62 6f 76 65  unction.** above
4af0: 20 67 65 6e 65 72 61 74 65 73 2e 0a 2a 2a 0a 2a   generates..**.*
4b00: 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74  * The last point
4b10: 20 69 73 20 61 20 63 68 61 6e 67 65 20 66 72 6f   is a change fro
4b20: 6d 20 76 65 72 73 69 6f 6e 20 32 2e 36 2e 33 20  m version 2.6.3 
4b30: 74 6f 20 76 65 72 73 69 6f 6e 20 32 2e 37 2e 30  to version 2.7.0
4b40: 2e 20 20 49 6e 0a 2a 2a 20 76 65 72 73 69 6f 6e  .  In.** version
4b50: 20 32 2e 36 2e 33 20 61 6e 64 20 65 61 72 6c 69   2.6.3 and earli
4b60: 65 72 2c 20 73 75 62 73 74 72 69 6e 67 73 20 6f  er, substrings o
4b70: 66 20 64 69 67 69 74 73 20 63 6f 6d 70 61 72 65  f digits compare
4b80: 20 69 6e 20 6e 75 6d 65 72 69 63 61 6c 20 0a 2a   in numerical .*
4b90: 2a 20 61 6e 64 20 63 61 73 65 20 77 61 73 20 75  * and case was u
4ba0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 62 72 65 61  sed only to brea
4bb0: 6b 20 61 20 74 69 65 2e 0a 2a 2a 0a 2a 2a 20 45  k a tie..**.** E
4bc0: 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 67  lements that beg
4bd0: 69 6e 20 77 69 74 68 20 27 41 27 20 6f 72 20 27  in with 'A' or '
4be0: 44 27 20 63 6f 6d 70 61 72 65 20 69 6e 20 6d 65  D' compare in me
4bf0: 6d 63 6d 70 28 29 20 6f 72 64 65 72 20 72 65 67  mcmp() order reg
4c00: 61 72 64 6c 65 73 73 0a 2a 2a 20 6f 66 20 77 68  ardless.** of wh
4c10: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
4c20: 79 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 6e 75  y look like a nu
4c30: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mber..**.** Note
4c40: 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 20 6f   that the sort o
4c50: 72 64 65 72 20 69 6d 70 6f 73 65 64 20 62 79 20  rder imposed by 
4c60: 74 68 65 20 72 75 6c 65 73 20 61 62 6f 76 65 20  the rules above 
4c70: 69 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 66  is the same.** f
4c80: 72 6f 6d 20 74 68 65 20 6f 72 64 65 72 69 6e 67  rom the ordering
4c90: 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
4ca0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
4cb0: 61 6e 64 20 22 3e 3d 22 20 6f 70 65 72 61 74 6f  and ">=" operato
4cc0: 72 73 0a 2a 2a 20 6f 66 20 65 78 70 72 65 73 73  rs.** of express
4cd0: 69 6f 6e 73 20 61 6e 64 20 66 6f 72 20 69 6e 64  ions and for ind
4ce0: 69 63 65 73 2e 20 20 54 68 69 73 20 77 61 73 20  ices.  This was 
4cf0: 6e 6f 74 20 74 68 65 20 63 61 73 65 20 66 6f 72  not the case for
4d00: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 32 2e 36 2e   version.** 2.6.
4d10: 33 20 61 6e 64 20 65 61 72 6c 69 65 72 2e 0a 2a  3 and earlier..*
4d20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 6f 72  /.int sqlite3Sor
4d30: 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 63  tCompare(const c
4d40: 68 61 72 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68  har *a, const ch
4d50: 61 72 20 2a 62 29 7b 0a 20 20 69 6e 74 20 72 65  ar *b){.  int re
4d60: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 4e  s = 0;.  int isN
4d70: 75 6d 41 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69  umA, isNumB;.  i
4d80: 6e 74 20 64 69 72 20 3d 20 30 3b 0a 0a 20 20 77  nt dir = 0;..  w
4d90: 68 69 6c 65 28 20 72 65 73 3d 3d 30 20 26 26 20  hile( res==0 && 
4da0: 2a 61 20 26 26 20 2a 62 20 29 7b 0a 20 20 20 20  *a && *b ){.    
4db0: 69 66 28 20 61 5b 30 5d 3d 3d 27 4e 27 20 7c 7c  if( a[0]=='N' ||
4dc0: 20 62 5b 30 5d 3d 3d 27 4e 27 20 29 7b 0a 20 20   b[0]=='N' ){.  
4dd0: 20 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d 62 5b      if( a[0]==b[
4de0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 20  0] ){.        a 
4df0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 62 20  += 2;.        b 
4e00: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
4e10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
4e20: 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3d 3d        if( a[0]==
4e30: 27 4e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 64  'N' ){.        d
4e40: 69 72 20 3d 20 62 5b 30 5d 3b 0a 20 20 20 20 20  ir = b[0];.     
4e50: 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
4e60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4e70: 20 20 64 69 72 20 3d 20 61 5b 30 5d 3b 0a 20 20    dir = a[0];.  
4e80: 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a        res = +1;.
4e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4ea0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
4eb0: 73 73 65 72 74 28 20 61 5b 30 5d 3d 3d 62 5b 30  ssert( a[0]==b[0
4ec0: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 69  ] );.    if( (di
4ed0: 72 3d 61 5b 30 5d 29 3d 3d 27 41 27 20 7c 7c 20  r=a[0])=='A' || 
4ee0: 61 5b 30 5d 3d 3d 27 44 27 20 29 7b 0a 20 20 20  a[0]=='D' ){.   
4ef0: 20 20 20 72 65 73 20 3d 20 73 74 72 63 6d 70 28     res = strcmp(
4f00: 26 61 5b 31 5d 2c 26 62 5b 31 5d 29 3b 0a 20 20  &a[1],&b[1]);.  
4f10: 20 20 20 20 69 66 28 20 72 65 73 20 29 20 62 72      if( res ) br
4f20: 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
4f30: 20 20 20 20 20 20 69 73 4e 75 6d 41 20 3d 20 73        isNumA = s
4f40: 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72 28 26  qlite3IsNumber(&
4f50: 61 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  a[1], 0);.      
4f60: 69 73 4e 75 6d 42 20 3d 20 73 71 6c 69 74 65 33  isNumB = sqlite3
4f70: 49 73 4e 75 6d 62 65 72 28 26 62 5b 31 5d 2c 20  IsNumber(&b[1], 
4f80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  0);.      if( is
4f90: 4e 75 6d 41 20 29 7b 0a 20 20 20 20 20 20 20 20  NumA ){.        
4fa0: 64 6f 75 62 6c 65 20 72 41 2c 20 72 42 3b 0a 20  double rA, rB;. 
4fb0: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 4e 75         if( !isNu
4fc0: 6d 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mB ){.          
4fd0: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
4fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 41 20     }.        rA 
5000: 3d 20 73 71 6c 69 74 65 33 41 74 6f 46 28 26 61  = sqlite3AtoF(&a
5010: 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  [1], 0);.       
5020: 20 72 42 20 3d 20 73 71 6c 69 74 65 33 41 74 6f   rB = sqlite3Ato
5030: 46 28 26 62 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  F(&b[1], 0);.   
5040: 20 20 20 20 20 69 66 28 20 72 41 3c 72 42 20 29       if( rA<rB )
5050: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
5060: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
5070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3e  .        if( rA>
5090: 72 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rB ){.          
50a0: 72 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20  res = +1;.      
50b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
50c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
50d0: 20 69 66 28 20 69 73 4e 75 6d 42 20 29 7b 0a 20   if( isNumB ){. 
50e0: 20 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31 3b         res = +1;
50f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5100: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5110: 20 20 20 20 20 72 65 73 20 3d 20 73 74 72 63 6d       res = strcm
5120: 70 28 26 61 5b 31 5d 2c 26 62 5b 31 5d 29 3b 0a  p(&a[1],&b[1]);.
5130: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
5140: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
5150: 0a 20 20 20 20 7d 0a 20 20 20 20 61 20 2b 3d 20  .    }.    a += 
5160: 73 74 72 6c 65 6e 28 26 61 5b 31 5d 29 20 2b 20  strlen(&a[1]) + 
5170: 32 3b 0a 20 20 20 20 62 20 2b 3d 20 73 74 72 6c  2;.    b += strl
5180: 65 6e 28 26 62 5b 31 5d 29 20 2b 20 32 3b 0a 20  en(&b[1]) + 2;. 
5190: 20 7d 0a 20 20 69 66 28 20 64 69 72 3d 3d 27 2d   }.  if( dir=='-
51a0: 27 20 7c 7c 20 64 69 72 3d 3d 27 44 27 20 29 20  ' || dir=='D' ) 
51b0: 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20 72 65  res = -res;.  re
51c0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
51d0: 64 65 66 20 53 51 4c 49 54 45 5f 55 54 46 38 0a  def SQLITE_UTF8.
51e0: 2f 2a 0a 2a 2a 20 58 20 69 73 20 61 20 70 6f 69  /*.** X is a poi
51f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
5200: 74 20 62 79 74 65 20 6f 66 20 61 20 55 54 46 2d  t byte of a UTF-
5210: 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 49 6e  8 character.  In
5220: 63 72 65 6d 65 6e 74 0a 2a 2a 20 58 20 73 6f 20  crement.** X so 
5230: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
5240: 6f 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61  o the next chara
5250: 63 74 65 72 2e 20 20 54 68 69 73 20 6f 6e 6c 79  cter.  This only
5260: 20 77 6f 72 6b 73 20 72 69 67 68 74 0a 2a 2a 20   works right.** 
5270: 69 66 20 58 20 70 6f 69 6e 74 73 20 74 6f 20 61  if X points to a
5280: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 55 54 46   well-formed UTF
5290: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64  -8 string..*/.#d
52a0: 65 66 69 6e 65 20 73 71 6c 69 74 65 4e 65 78 74  efine sqliteNext
52b0: 43 68 61 72 28 58 29 20 20 77 68 69 6c 65 28 20  Char(X)  while( 
52c0: 28 30 78 63 30 26 2a 2b 2b 28 58 29 29 3d 3d 30  (0xc0&*++(X))==0
52d0: 78 38 30 20 29 7b 7d 0a 23 64 65 66 69 6e 65 20  x80 ){}.#define 
52e0: 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 58 29  sqliteCharVal(X)
52f0: 20 20 20 73 71 6c 69 74 65 5f 75 74 66 38 5f 74     sqlite_utf8_t
5300: 6f 5f 69 6e 74 28 58 29 0a 0a 23 65 6c 73 65 20  o_int(X)..#else 
5310: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
5320: 54 45 5f 55 54 46 38 29 20 2a 2f 0a 2f 2a 0a 2a  TE_UTF8) */./*.*
5330: 2a 20 46 6f 72 20 69 73 6f 38 38 35 39 20 65 6e  * For iso8859 en
5340: 63 6f 64 69 6e 67 2c 20 74 68 65 20 6e 65 78 74  coding, the next
5350: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6a 75   character is ju
5360: 73 74 20 74 68 65 20 6e 65 78 74 20 62 79 74 65  st the next byte
5370: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  ..*/.#define sql
5380: 69 74 65 4e 65 78 74 43 68 61 72 28 58 29 20 20  iteNextChar(X)  
5390: 28 2b 2b 28 58 29 29 3b 0a 23 64 65 66 69 6e 65  (++(X));.#define
53a0: 20 73 71 6c 69 74 65 43 68 61 72 56 61 6c 28 58   sqliteCharVal(X
53b0: 29 20 20 20 28 28 69 6e 74 29 2a 28 58 29 29 0a  )   ((int)*(X)).
53c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
53d0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 20  ed(SQLITE_UTF8) 
53e0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  */...#ifdef SQLI
53f0: 54 45 5f 55 54 46 38 0a 2f 2a 0a 2a 2a 20 43 6f  TE_UTF8./*.** Co
5400: 6e 76 65 72 74 20 74 68 65 20 55 54 46 2d 38 20  nvert the UTF-8 
5410: 63 68 61 72 61 63 74 65 72 20 74 6f 20 77 68 69  character to whi
5420: 63 68 20 7a 20 70 6f 69 6e 74 73 20 69 6e 74 6f  ch z points into
5430: 20 61 20 33 31 2d 62 69 74 0a 2a 2a 20 55 43 53   a 31-bit.** UCS
5440: 20 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 69   character.  Thi
5450: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 72 69 67  s only works rig
5460: 68 74 20 69 66 20 7a 20 70 6f 69 6e 74 73 20 74  ht if z points t
5470: 6f 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  o a well-formed.
5480: 2a 2a 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ** UTF-8 string.
5490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
54a0: 71 6c 69 74 65 5f 75 74 66 38 5f 74 6f 5f 69 6e  qlite_utf8_to_in
54b0: 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  t(const unsigned
54c0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
54d0: 20 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   c;.  static con
54e0: 73 74 20 69 6e 74 20 69 6e 69 74 56 61 6c 5b 5d  st int initVal[]
54f0: 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 20 20 20   = {.      0,   
5500: 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20 20 34  1,   2,   3,   4
5510: 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c  ,   5,   6,   7,
5520: 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30 2c 20     8,   9,  10, 
5530: 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c 20 20   11,  12,  13,  
5540: 31 34 2c 0a 20 20 20 20 20 31 35 2c 20 20 31 36  14,.     15,  16
5550: 2c 20 20 31 37 2c 20 20 31 38 2c 20 20 31 39 2c  ,  17,  18,  19,
5560: 20 20 32 30 2c 20 20 32 31 2c 20 20 32 32 2c 20    20,  21,  22, 
5570: 20 32 33 2c 20 20 32 34 2c 20 20 32 35 2c 20 20   23,  24,  25,  
5580: 32 36 2c 20 20 32 37 2c 20 20 32 38 2c 20 20 32  26,  27,  28,  2
5590: 39 2c 0a 20 20 20 20 20 33 30 2c 20 20 33 31 2c  9,.     30,  31,
55a0: 20 20 33 32 2c 20 20 33 33 2c 20 20 33 34 2c 20    32,  33,  34, 
55b0: 20 33 35 2c 20 20 33 36 2c 20 20 33 37 2c 20 20   35,  36,  37,  
55c0: 33 38 2c 20 20 33 39 2c 20 20 34 30 2c 20 20 34  38,  39,  40,  4
55d0: 31 2c 20 20 34 32 2c 20 20 34 33 2c 20 20 34 34  1,  42,  43,  44
55e0: 2c 0a 20 20 20 20 20 34 35 2c 20 20 34 36 2c 20  ,.     45,  46, 
55f0: 20 34 37 2c 20 20 34 38 2c 20 20 34 39 2c 20 20   47,  48,  49,  
5600: 35 30 2c 20 20 35 31 2c 20 20 35 32 2c 20 20 35  50,  51,  52,  5
5610: 33 2c 20 20 35 34 2c 20 20 35 35 2c 20 20 35 36  3,  54,  55,  56
5620: 2c 20 20 35 37 2c 20 20 35 38 2c 20 20 35 39 2c  ,  57,  58,  59,
5630: 0a 20 20 20 20 20 36 30 2c 20 20 36 31 2c 20 20  .     60,  61,  
5640: 36 32 2c 20 20 36 33 2c 20 20 36 34 2c 20 20 36  62,  63,  64,  6
5650: 35 2c 20 20 36 36 2c 20 20 36 37 2c 20 20 36 38  5,  66,  67,  68
5660: 2c 20 20 36 39 2c 20 20 37 30 2c 20 20 37 31 2c  ,  69,  70,  71,
5670: 20 20 37 32 2c 20 20 37 33 2c 20 20 37 34 2c 0a    72,  73,  74,.
5680: 20 20 20 20 20 37 35 2c 20 20 37 36 2c 20 20 37       75,  76,  7
5690: 37 2c 20 20 37 38 2c 20 20 37 39 2c 20 20 38 30  7,  78,  79,  80
56a0: 2c 20 20 38 31 2c 20 20 38 32 2c 20 20 38 33 2c  ,  81,  82,  83,
56b0: 20 20 38 34 2c 20 20 38 35 2c 20 20 38 36 2c 20    84,  85,  86, 
56c0: 20 38 37 2c 20 20 38 38 2c 20 20 38 39 2c 0a 20   87,  88,  89,. 
56d0: 20 20 20 20 39 30 2c 20 20 39 31 2c 20 20 39 32      90,  91,  92
56e0: 2c 20 20 39 33 2c 20 20 39 34 2c 20 20 39 35 2c  ,  93,  94,  95,
56f0: 20 20 39 36 2c 20 20 39 37 2c 20 20 39 38 2c 20    96,  97,  98, 
5700: 20 39 39 2c 20 31 30 30 2c 20 31 30 31 2c 20 31   99, 100, 101, 1
5710: 30 32 2c 20 31 30 33 2c 20 31 30 34 2c 0a 20 20  02, 103, 104,.  
5720: 20 20 31 30 35 2c 20 31 30 36 2c 20 31 30 37 2c    105, 106, 107,
5730: 20 31 30 38 2c 20 31 30 39 2c 20 31 31 30 2c 20   108, 109, 110, 
5740: 31 31 31 2c 20 31 31 32 2c 20 31 31 33 2c 20 31  111, 112, 113, 1
5750: 31 34 2c 20 31 31 35 2c 20 31 31 36 2c 20 31 31  14, 115, 116, 11
5760: 37 2c 20 31 31 38 2c 20 31 31 39 2c 0a 20 20 20  7, 118, 119,.   
5770: 20 31 32 30 2c 20 31 32 31 2c 20 31 32 32 2c 20   120, 121, 122, 
5780: 31 32 33 2c 20 31 32 34 2c 20 31 32 35 2c 20 31  123, 124, 125, 1
5790: 32 36 2c 20 31 32 37 2c 20 31 32 38 2c 20 31 32  26, 127, 128, 12
57a0: 39 2c 20 31 33 30 2c 20 31 33 31 2c 20 31 33 32  9, 130, 131, 132
57b0: 2c 20 31 33 33 2c 20 31 33 34 2c 0a 20 20 20 20  , 133, 134,.    
57c0: 31 33 35 2c 20 31 33 36 2c 20 31 33 37 2c 20 31  135, 136, 137, 1
57d0: 33 38 2c 20 31 33 39 2c 20 31 34 30 2c 20 31 34  38, 139, 140, 14
57e0: 31 2c 20 31 34 32 2c 20 31 34 33 2c 20 31 34 34  1, 142, 143, 144
57f0: 2c 20 31 34 35 2c 20 31 34 36 2c 20 31 34 37 2c  , 145, 146, 147,
5800: 20 31 34 38 2c 20 31 34 39 2c 0a 20 20 20 20 31   148, 149,.    1
5810: 35 30 2c 20 31 35 31 2c 20 31 35 32 2c 20 31 35  50, 151, 152, 15
5820: 33 2c 20 31 35 34 2c 20 31 35 35 2c 20 31 35 36  3, 154, 155, 156
5830: 2c 20 31 35 37 2c 20 31 35 38 2c 20 31 35 39 2c  , 157, 158, 159,
5840: 20 31 36 30 2c 20 31 36 31 2c 20 31 36 32 2c 20   160, 161, 162, 
5850: 31 36 33 2c 20 31 36 34 2c 0a 20 20 20 20 31 36  163, 164,.    16
5860: 35 2c 20 31 36 36 2c 20 31 36 37 2c 20 31 36 38  5, 166, 167, 168
5870: 2c 20 31 36 39 2c 20 31 37 30 2c 20 31 37 31 2c  , 169, 170, 171,
5880: 20 31 37 32 2c 20 31 37 33 2c 20 31 37 34 2c 20   172, 173, 174, 
5890: 31 37 35 2c 20 31 37 36 2c 20 31 37 37 2c 20 31  175, 176, 177, 1
58a0: 37 38 2c 20 31 37 39 2c 0a 20 20 20 20 31 38 30  78, 179,.    180
58b0: 2c 20 31 38 31 2c 20 31 38 32 2c 20 31 38 33 2c  , 181, 182, 183,
58c0: 20 31 38 34 2c 20 31 38 35 2c 20 31 38 36 2c 20   184, 185, 186, 
58d0: 31 38 37 2c 20 31 38 38 2c 20 31 38 39 2c 20 31  187, 188, 189, 1
58e0: 39 30 2c 20 31 39 31 2c 20 20 20 30 2c 20 20 20  90, 191,   0,   
58f0: 31 2c 20 20 20 32 2c 0a 20 20 20 20 20 20 33 2c  1,   2,.      3,
5900: 20 20 20 34 2c 20 20 20 35 2c 20 20 20 36 2c 20     4,   5,   6, 
5910: 20 20 37 2c 20 20 20 38 2c 20 20 20 39 2c 20 20    7,   8,   9,  
5920: 31 30 2c 20 20 31 31 2c 20 20 31 32 2c 20 20 31  10,  11,  12,  1
5930: 33 2c 20 20 31 34 2c 20 20 31 35 2c 20 20 31 36  3,  14,  15,  16
5940: 2c 20 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20  ,  17,.     18, 
5950: 20 31 39 2c 20 20 32 30 2c 20 20 32 31 2c 20 20   19,  20,  21,  
5960: 32 32 2c 20 20 32 33 2c 20 20 32 34 2c 20 20 32  22,  23,  24,  2
5970: 35 2c 20 20 32 36 2c 20 20 32 37 2c 20 20 32 38  5,  26,  27,  28
5980: 2c 20 20 32 39 2c 20 20 33 30 2c 20 20 33 31 2c  ,  29,  30,  31,
5990: 20 20 20 30 2c 0a 20 20 20 20 20 20 31 2c 20 20     0,.      1,  
59a0: 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20 20 20   2,   3,   4,   
59b0: 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20 38  5,   6,   7,   8
59c0: 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31 31 2c  ,   9,  10,  11,
59d0: 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34 2c 20    12,  13,  14, 
59e0: 20 31 35 2c 0a 20 20 20 20 20 20 30 2c 20 20 20   15,.      0,   
59f0: 31 2c 20 20 20 32 2c 20 20 20 33 2c 20 20 20 34  1,   2,   3,   4
5a00: 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37 2c  ,   5,   6,   7,
5a10: 20 20 20 30 2c 20 20 20 31 2c 20 20 20 32 2c 20     0,   1,   2, 
5a20: 20 20 33 2c 20 20 20 30 2c 20 20 20 31 2c 20 32    3,   0,   1, 2
5a30: 35 34 2c 0a 20 20 20 20 32 35 35 2c 0a 20 20 7d  54,.    255,.  }
5a40: 3b 0a 20 20 63 20 3d 20 69 6e 69 74 56 61 6c 5b  ;.  c = initVal[
5a50: 2a 28 7a 2b 2b 29 5d 3b 0a 20 20 77 68 69 6c 65  *(z++)];.  while
5a60: 28 20 28 30 78 63 30 26 2a 7a 29 3d 3d 30 78 38  ( (0xc0&*z)==0x8
5a70: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 28 63 3c  0 ){.    c = (c<
5a80: 3c 36 29 20 7c 20 28 30 78 33 66 26 2a 28 7a 2b  <6) | (0x3f&*(z+
5a90: 2b 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +));.  }.  retur
5aa0: 6e 20 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n c;.}.#endif../
5ab0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
5ac0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66   UTF-8 strings f
5ad0: 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68 65 72  or equality wher
5ae0: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69  e the first stri
5af0: 6e 67 20 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74  ng can.** potent
5b00: 69 61 6c 6c 79 20 62 65 20 61 20 22 67 6c 6f 62  ially be a "glob
5b10: 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 52  " expression.  R
5b20: 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20 69  eturn true (1) i
5b30: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 74 68  f they.** are th
5b40: 65 20 73 61 6d 65 20 61 6e 64 20 66 61 6c 73 65  e same and false
5b50: 20 28 30 29 20 69 66 20 74 68 65 79 20 61 72 65   (0) if they are
5b60: 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a   different..**.*
5b70: 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73  * Globbing rules
5b80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27  :.**.**      '*'
5b90: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
5ba0: 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a  ny sequence of z
5bb0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  ero or more char
5bc0: 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
5bd0: 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74     '?'       Mat
5be0: 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  ches exactly one
5bf0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a   character..**.*
5c00: 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20  *     [...]     
5c10: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
5c20: 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20  racter from the 
5c30: 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66  enclosed list of
5c40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5c50: 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a     characters..*
5c60: 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20  *.**     [^...] 
5c70: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
5c80: 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e  character not in
5c90: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
5ca0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  st..**.** With t
5cb0: 68 65 20 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e  he [...] and [^.
5cc0: 2e 2e 5d 20 6d 61 74 63 68 69 6e 67 2c 20 61 20  ..] matching, a 
5cd0: 27 5d 27 20 63 68 61 72 61 63 74 65 72 20 63 61  ']' character ca
5ce0: 6e 20 62 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a  n be included.**
5cf0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 62 79 20   in the list by 
5d00: 6d 61 6b 69 6e 67 20 69 74 20 74 68 65 20 66 69  making it the fi
5d10: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 61 66  rst character af
5d20: 74 65 72 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20  ter '[' or '^'. 
5d30: 20 41 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63   A.** range of c
5d40: 68 61 72 61 63 74 65 72 73 20 63 61 6e 20 62 65  haracters can be
5d50: 20 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67   specified using
5d60: 20 27 2d 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a   '-'.  Example:.
5d70: 2a 2a 20 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68  ** "[a-z]" match
5d80: 65 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f  es any single lo
5d90: 77 65 72 2d 63 61 73 65 20 6c 65 74 74 65 72 2e  wer-case letter.
5da0: 20 20 54 6f 20 6d 61 74 63 68 20 61 20 27 2d 27    To match a '-'
5db0: 2c 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65  , make.** it the
5dc0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
5dd0: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  in the list..**.
5de0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5df0: 69 73 20 75 73 75 61 6c 6c 79 20 71 75 69 63 6b  is usually quick
5e00: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a  , but can be N**
5e10: 32 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  2 in the worst c
5e20: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73  ase..**.** Hints
5e30: 3a 20 74 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f  : to match '*' o
5e40: 72 20 27 3f 27 2c 20 70 75 74 20 74 68 65 6d 20  r '?', put them 
5e50: 69 6e 20 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74  in "[]".  Like t
5e60: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
5e70: 20 20 20 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20     abc[*]xyz    
5e80: 20 20 20 20 4d 61 74 63 68 65 73 20 22 61 62 63      Matches "abc
5e90: 2a 78 79 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 69 6e  *xyz" only.*/.in
5ea0: 74 20 0a 73 71 6c 69 74 65 33 47 6c 6f 62 43 6f  t .sqlite3GlobCo
5eb0: 6d 70 61 72 65 28 63 6f 6e 73 74 20 75 6e 73 69  mpare(const unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74  gned char *zPatt
5ed0: 65 72 6e 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ern, const unsig
5ee0: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 72 69 6e  ned char *zStrin
5ef0: 67 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 69  g){.  register i
5f00: 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 6e 76 65  nt c;.  int inve
5f10: 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a  rt;.  int seen;.
5f20: 20 20 69 6e 74 20 63 32 3b 0a 0a 20 20 77 68 69    int c2;..  whi
5f30: 6c 65 28 20 28 63 20 3d 20 2a 7a 50 61 74 74 65  le( (c = *zPatte
5f40: 72 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 77  rn)!=0 ){.    sw
5f50: 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20  itch( c ){.     
5f60: 20 63 61 73 65 20 27 2a 27 3a 0a 20 20 20 20 20   case '*':.     
5f70: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 50 61     while( (c=zPa
5f80: 74 74 65 72 6e 5b 31 5d 29 20 3d 3d 20 27 2a 27  ttern[1]) == '*'
5f90: 20 7c 7c 20 63 20 3d 3d 20 27 3f 27 20 29 7b 0a   || c == '?' ){.
5fa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
5fb0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='?' ){.        
5fc0: 20 20 20 20 69 66 28 20 2a 7a 53 74 72 69 6e 67      if( *zString
5fd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5ff0: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
6000: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ng);.          }
6010: 0a 20 20 20 20 20 20 20 20 20 20 7a 50 61 74 74  .          zPatt
6020: 65 72 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ern++;.        }
6030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
6040: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6050: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5b 27        if( c=='['
6060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
6070: 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26 26  ile( *zString &&
6080: 20 73 71 6c 69 74 65 33 47 6c 6f 62 43 6f 6d 70   sqlite3GlobComp
6090: 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d  are(&zPattern[1]
60a0: 2c 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a  ,zString)==0 ){.
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
60c0: 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74 72 69  teNextChar(zStri
60d0: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ng);.          }
60e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
60f0: 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a 20  n *zString!=0;. 
6100: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6110: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
6120: 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21 3d  c2 = *zString)!=
6130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6140: 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30 20   while( c2 != 0 
6150: 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63 32  && c2 != c ){ c2
6160: 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20 7d   = *++zString; }
6170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6180: 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
6190: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
61a0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 43 6f  f( sqlite3GlobCo
61b0: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
61c0: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
61d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
61e0: 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43 68      sqliteNextCh
61f0: 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20 20  ar(zString);.   
6200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6210: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
6230: 65 20 27 3f 27 3a 20 7b 0a 20 20 20 20 20 20 20  e '?': {.       
6240: 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30   if( *zString==0
6250: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
6260: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
6270: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
6280: 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b 2b        zPattern++
6290: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
62a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
62b0: 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20  ase '[': {.     
62c0: 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
62d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   0;.        seen
62e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
62f0: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
6300: 20 20 63 20 3d 20 73 71 6c 69 74 65 43 68 61 72    c = sqliteChar
6310: 56 61 6c 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  Val(zString);.  
6320: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
6330: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6340: 20 20 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74     c2 = *++zPatt
6350: 65 72 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ern;.        if(
6360: 20 63 32 3d 3d 27 5e 27 20 29 7b 20 69 6e 76 65   c2=='^' ){ inve
6370: 72 74 20 3d 20 31 3b 20 63 32 20 3d 20 2a 2b 2b  rt = 1; c2 = *++
6380: 7a 50 61 74 74 65 72 6e 3b 20 7d 0a 20 20 20 20  zPattern; }.    
6390: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
63a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
63b0: 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
63c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 32   1;.          c2
63d0: 20 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a   = *++zPattern;.
63e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
63f0: 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 73    while( (c2 = s
6400: 71 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61  qliteCharVal(zPa
6410: 74 74 65 72 6e 29 29 21 3d 30 20 26 26 20 63 32  ttern))!=0 && c2
6420: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
6430: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
6440: 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 27  & zPattern[1]!='
6450: 5d 27 20 26 26 20 7a 50 61 74 74 65 72 6e 5b 31  ]' && zPattern[1
6460: 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
6470: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6480: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6490: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 73 71           c2 = sq
64a0: 6c 69 74 65 43 68 61 72 56 61 6c 28 7a 50 61 74  liteCharVal(zPat
64b0: 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tern);.         
64c0: 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f     if( c>=prior_
64d0: 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65  c && c<=c2 ) see
64e0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
64f0: 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a     prior_c = 0;.
6500: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
6510: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
6520: 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
6530: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
6540: 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
6550: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6560: 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
6570: 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
6580: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
6590: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 50 61  liteNextChar(zPa
65a0: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
65b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  }.        if( c2
65c0: 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
65d0: 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
65e0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71  rn 0;.        sq
65f0: 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a 53 74  liteNextChar(zSt
6600: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  ring);.        z
6610: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20  Pattern++;.     
6620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6630: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
6640: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   {.        if( c
6650: 20 21 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72   != *zString ) r
6660: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
6670: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6680: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
6690: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
66a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
66b0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
66c0: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
66d0: 43 6f 6d 70 61 72 65 20 74 77 6f 20 55 54 46 2d  Compare two UTF-
66e0: 38 20 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71  8 strings for eq
66f0: 75 61 6c 69 74 79 20 75 73 69 6e 67 20 74 68 65  uality using the
6700: 20 22 4c 49 4b 45 22 20 6f 70 65 72 61 74 6f 72   "LIKE" operator
6710: 20 6f 66 0a 2a 2a 20 53 51 4c 2e 20 20 54 68 65   of.** SQL.  The
6720: 20 27 25 27 20 63 68 61 72 61 63 74 65 72 20 6d   '%' character m
6730: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
6740: 6e 63 65 20 6f 66 20 30 20 6f 72 20 6d 6f 72 65  nce of 0 or more
6750: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 61  .** characters a
6760: 6e 64 20 27 5f 27 20 6d 61 74 63 68 65 73 20 61  nd '_' matches a
6770: 6e 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63  ny single charac
6780: 74 65 72 2e 20 20 43 61 73 65 20 69 73 0a 2a 2a  ter.  Case is.**
6790: 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74   not significant
67a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
67b0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 6e 20  tine is just an 
67c0: 61 64 61 70 74 61 74 69 6f 6e 20 6f 66 20 74 68  adaptation of th
67d0: 65 20 73 71 6c 69 74 65 33 47 6c 6f 62 43 6f 6d  e sqlite3GlobCom
67e0: 70 61 72 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  pare().** routin
67f0: 65 20 61 62 6f 76 65 2e 0a 2a 2f 0a 69 6e 74 20  e above..*/.int 
6800: 0a 73 71 6c 69 74 65 33 4c 69 6b 65 43 6f 6d 70  .sqlite3LikeComp
6810: 61 72 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  are(const unsign
6820: 65 64 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  ed char *zPatter
6830: 6e 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  n, const unsigne
6840: 64 20 63 68 61 72 20 2a 7a 53 74 72 69 6e 67 29  d char *zString)
6850: 7b 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e 74  {.  register int
6860: 20 63 3b 0a 20 20 69 6e 74 20 63 32 3b 0a 0a 20   c;.  int c2;.. 
6870: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 55 70 70   while( (c = Upp
6880: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 50 61 74 74  erToLower[*zPatt
6890: 65 72 6e 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  ern])!=0 ){.    
68a0: 73 77 69 74 63 68 28 20 63 20 29 7b 0a 20 20 20  switch( c ){.   
68b0: 20 20 20 63 61 73 65 20 27 25 27 3a 20 7b 0a 20     case '%': {. 
68c0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
68d0: 3d 7a 50 61 74 74 65 72 6e 5b 31 5d 29 20 3d 3d  =zPattern[1]) ==
68e0: 20 27 25 27 20 7c 7c 20 63 20 3d 3d 20 27 5f 27   '%' || c == '_'
68f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6900: 28 20 63 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20  ( c=='_' ){.    
6910: 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74          if( *zSt
6920: 72 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  ring==0 ) return
6930: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6940: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
6950: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
6960: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
6970: 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 20  Pattern++;.     
6980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6990: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   c==0 ) return 1
69a0: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 55 70  ;.        c = Up
69b0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
69c0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
69d0: 32 3d 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  2=UpperToLower[*
69e0: 7a 53 74 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a  zString])!=0 ){.
69f0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
6a00: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
6a10: 3d 20 63 20 29 7b 20 63 32 20 3d 20 55 70 70 65  = c ){ c2 = Uppe
6a20: 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72  rToLower[*++zStr
6a30: 69 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20  ing]; }.        
6a40: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
6a50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6a60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 69 6b    if( sqlite3Lik
6a70: 65 43 6f 6d 70 61 72 65 28 26 7a 50 61 74 74 65  eCompare(&zPatte
6a80: 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29  rn[1],zString) )
6a90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6aa0: 20 20 20 20 20 73 71 6c 69 74 65 4e 65 78 74 43       sqliteNextC
6ab0: 68 61 72 28 7a 53 74 72 69 6e 67 29 3b 0a 20 20  har(zString);.  
6ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ad0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6ae0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 5f 27  }.      case '_'
6af0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
6b00: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
6b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6b20: 73 71 6c 69 74 65 4e 65 78 74 43 68 61 72 28 7a  sqliteNextChar(z
6b30: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20  String);.       
6b40: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b60: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
6b70: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t: {.        if(
6b80: 20 63 20 21 3d 20 55 70 70 65 72 54 6f 4c 6f 77   c != UpperToLow
6b90: 65 72 5b 2a 7a 53 74 72 69 6e 67 5d 20 29 20 72  er[*zString] ) r
6ba0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
6bb0: 20 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20   zPattern++;.   
6bc0: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
6bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6be0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6bf0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69  .  return *zStri
6c00: 6e 67 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ng==0;.}../*.** 
6c10: 43 68 61 6e 67 65 20 74 68 65 20 73 71 6c 69 74  Change the sqlit
6c20: 65 2e 6d 61 67 69 63 20 66 72 6f 6d 20 53 51 4c  e.magic from SQL
6c30: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 74  ITE_MAGIC_OPEN t
6c40: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  o SQLITE_MAGIC_B
6c50: 55 53 59 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  USY..** Return a
6c60: 6e 20 65 72 72 6f 72 20 28 6e 6f 6e 2d 7a 65 72  n error (non-zer
6c70: 6f 29 20 69 66 20 74 68 65 20 6d 61 67 69 63 20  o) if the magic 
6c80: 77 61 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4d  was not SQLITE_M
6c90: 41 47 49 43 5f 4f 50 45 4e 0a 2a 2a 20 77 68 65  AGIC_OPEN.** whe
6ca0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6cb0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
6cc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6cd0: 61 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  a attempt to det
6ce0: 65 63 74 20 69 66 20 74 77 6f 20 74 68 72 65 61  ect if two threa
6cf0: 64 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  ds use the.** sa
6d00: 6d 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  me sqlite* point
6d10: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
6d20: 69 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ime.  There is a
6d30: 20 72 61 63 65 20 0a 2a 2a 20 63 6f 6e 64 69 74   race .** condit
6d40: 69 6f 6e 20 73 6f 20 69 74 20 69 73 20 70 6f 73  ion so it is pos
6d50: 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 65  sible that the e
6d60: 72 72 6f 72 20 69 73 20 6e 6f 74 20 64 65 74 65  rror is not dete
6d70: 63 74 65 64 2e 0a 2a 2a 20 42 75 74 20 75 73 75  cted..** But usu
6d80: 61 6c 6c 79 20 74 68 65 20 70 72 6f 62 6c 65 6d  ally the problem
6d90: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 2e 20 20   will be seen.  
6da0: 54 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20  The result will 
6db0: 62 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 77  be an.** error w
6dc0: 68 69 63 68 20 63 61 6e 20 62 65 20 75 73 65 64  hich can be used
6dd0: 20 74 6f 20 64 65 62 75 67 20 74 68 65 20 61 70   to debug the ap
6de0: 70 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 69  plication that i
6df0: 73 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 69 74  s.** using SQLit
6e00: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  e incorrectly..*
6e10: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32 30 32  *.** Ticket #202
6e20: 3a 20 20 49 66 20 64 62 2d 3e 6d 61 67 69 63 20  :  If db->magic 
6e30: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f  is not a valid o
6e40: 70 65 6e 20 76 61 6c 75 65 2c 20 74 61 6b 65 20  pen value, take 
6e50: 63 61 72 65 20 6e 6f 74 0a 2a 2a 20 74 6f 20 6d  care not.** to m
6e60: 6f 64 69 66 79 20 74 68 65 20 64 62 20 73 74 72  odify the db str
6e70: 75 63 74 75 72 65 20 61 74 20 61 6c 6c 2e 20 20  ucture at all.  
6e80: 49 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  It could be that
6e90: 20 64 62 20 69 73 20 61 20 73 74 61 6c 65 0a 2a   db is a stale.*
6ea0: 2a 20 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 6f  * pointer.  In o
6eb0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 63  ther words, it c
6ec0: 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
6ed0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  re has been a pr
6ee0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
6ef0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
6f00: 20 61 6e 64 20 64 62 20 68 61 73 20 62 65 65 6e   and db has been
6f10: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 41   deallocated.  A
6f20: 6e 64 20 77 65 20 64 6f 0a 2a 2a 20 6e 6f 74 20  nd we do.** not 
6f30: 77 61 6e 74 20 74 6f 20 77 72 69 74 65 20 69 6e  want to write in
6f40: 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 6d  to deallocated m
6f50: 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  emory..*/.int sq
6f60: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 73 71  lite3SafetyOn(sq
6f70: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
6f80: 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49   db->magic==SQLI
6f90: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20 29 7b  TE_MAGIC_OPEN ){
6fa0: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
6fb0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
6fc0: 53 59 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SY;.    return 0
6fd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
6fe0: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
6ff0: 4d 41 47 49 43 5f 42 55 53 59 20 7c 7c 20 64 62  MAGIC_BUSY || db
7000: 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f  ->magic==SQLITE_
7010: 4d 41 47 49 43 5f 45 52 52 4f 52 0a 20 20 20 20  MAGIC_ERROR.    
7020: 20 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e           || db->
7030: 77 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29 7b  want_to_close ){
7040: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
7050: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
7060: 52 4f 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ROR;.    db->fla
7070: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
7080: 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65  errupt;.  }.  re
7090: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
70a0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 67 69   Change the magi
70b0: 63 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 4d 41  c from SQLITE_MA
70c0: 47 49 43 5f 42 55 53 59 20 74 6f 20 53 51 4c 49  GIC_BUSY to SQLI
70d0: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 2e 0a 2a  TE_MAGIC_OPEN..*
70e0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
70f0: 72 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  r (non-zero) if 
7100: 74 68 65 20 6d 61 67 69 63 20 77 61 73 20 6e 6f  the magic was no
7110: 74 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  t SQLITE_MAGIC_B
7120: 55 53 59 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  USY.** when this
7130: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7140: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7150: 65 33 53 61 66 65 74 79 4f 66 66 28 73 71 6c 69  e3SafetyOff(sqli
7160: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
7170: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
7180: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 7b 0a 20  _MAGIC_BUSY ){. 
7190: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
71a0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
71b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
71c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
71d0: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
71e0: 47 49 43 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e  GIC_OPEN || db->
71f0: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
7200: 47 49 43 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  GIC_ERROR.      
7210: 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 77 61         || db->wa
7220: 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 29 7b 0a 20  nt_to_close ){. 
7230: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
7240: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
7250: 52 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  R;.    db->flags
7260: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
7270: 72 75 70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rupt;.  }.  retu
7280: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
7290: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
72a0: 65 20 77 65 20 61 72 65 20 6e 6f 74 20 63 75 72  e we are not cur
72b0: 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
72c0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63   an sqlite3_exec
72d0: 28 29 2e 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ()..** If we are
72e0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 6e   currently in an
72f0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c   sqlite3_exec(),
7300: 20 72 65 74 75 72 6e 20 74 72 75 65 20 61 6e 64   return true and
7310: 20 73 65 74 0a 2a 2a 20 73 71 6c 69 74 65 2e 6d   set.** sqlite.m
7320: 61 67 69 63 20 74 6f 20 53 51 4c 49 54 45 5f 4d  agic to SQLITE_M
7330: 41 47 49 43 5f 45 52 52 4f 52 2e 20 20 54 68 69  AGIC_ERROR.  Thi
7340: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 61 20 63  s will cause a c
7350: 6f 6d 70 6c 65 74 65 0a 2a 2a 20 73 68 75 74 64  omplete.** shutd
7360: 6f 77 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  own of the datab
7370: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
7380: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
7390: 74 6f 20 74 72 79 20 74 6f 20 64 65 74 65 63 74  to try to detect
73a0: 20 77 68 65 6e 20 41 50 49 20 72 6f 75 74 69 6e   when API routin
73b0: 65 73 20 61 72 65 20 63 61 6c 6c 65 64 0a 2a 2a  es are called.**
73c0: 20 61 74 20 74 68 65 20 77 72 6f 6e 67 20 74 69   at the wrong ti
73d0: 6d 65 20 6f 72 20 69 6e 20 74 68 65 20 77 72 6f  me or in the wro
73e0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
73f0: 69 6e 74 20 73 71 6c 69 74 65 33 53 61 66 65 74  int sqlite3Safet
7400: 79 43 68 65 63 6b 28 73 71 6c 69 74 65 20 2a 64  yCheck(sqlite *d
7410: 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  b){.  if( db->pV
7420: 64 62 65 21 3d 30 20 29 7b 0a 20 20 20 20 64 62  dbe!=0 ){.    db
7430: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7440: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
7450: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
7460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7470: 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 61 62 6c  *.** The variabl
7480: 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e-length integer
7490: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 61 73 20   encoding is as 
74a0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 4b  follows:.**.** K
74b0: 45 59 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  EY:.**         A
74c0: 20 3d 20 30 78 78 78 78 78 78 78 20 20 20 20 37   = 0xxxxxxx    7
74d0: 20 62 69 74 73 20 6f 66 20 64 61 74 61 20 61 6e   bits of data an
74e0: 64 20 6f 6e 65 20 66 6c 61 67 20 62 69 74 0a 2a  d one flag bit.*
74f0: 2a 20 20 20 20 20 20 20 20 20 42 20 3d 20 31 78  *         B = 1x
7500: 78 78 78 78 78 78 20 20 20 20 37 20 62 69 74 73  xxxxxx    7 bits
7510: 20 6f 66 20 64 61 74 61 20 61 6e 64 20 6f 6e 65   of data and one
7520: 20 66 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20 20   flag bit.**    
7530: 20 20 20 20 20 43 20 3d 20 78 78 78 78 78 78 78       C = xxxxxxx
7540: 78 20 20 20 20 38 20 62 69 74 73 20 6f 66 20 64  x    8 bits of d
7550: 61 74 61 0a 2a 2a 0a 2a 2a 20 20 37 20 62 69 74  ata.**.**  7 bit
7560: 73 20 2d 20 41 0a 2a 2a 20 31 34 20 62 69 74 73  s - A.** 14 bits
7570: 20 2d 20 42 41 0a 2a 2a 20 32 31 20 62 69 74 73   - BA.** 21 bits
7580: 20 2d 20 42 42 41 0a 2a 2a 20 32 38 20 62 69 74   - BBA.** 28 bit
7590: 73 20 2d 20 42 42 42 41 0a 2a 2a 20 33 35 20 62  s - BBBA.** 35 b
75a0: 69 74 73 20 2d 20 42 42 42 42 41 0a 2a 2a 20 34  its - BBBBA.** 4
75b0: 32 20 62 69 74 73 20 2d 20 42 42 42 42 42 41 0a  2 bits - BBBBBA.
75c0: 2a 2a 20 34 39 20 62 69 74 73 20 2d 20 42 42 42  ** 49 bits - BBB
75d0: 42 42 42 41 0a 2a 2a 20 35 36 20 62 69 74 73 20  BBBA.** 56 bits 
75e0: 2d 20 42 42 42 42 42 42 42 41 0a 2a 2a 20 36 34  - BBBBBBBA.** 64
75f0: 20 62 69 74 73 20 2d 20 42 42 42 42 42 42 42 42   bits - BBBBBBBB
7600: 43 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  C.*/../*.** Writ
7610: 65 20 61 20 36 34 2d 62 69 74 20 76 61 72 69 61  e a 64-bit varia
7620: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
7630: 65 72 20 74 6f 20 6d 65 6d 6f 72 79 20 73 74 61  er to memory sta
7640: 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a  rting at p[0]..*
7650: 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  * The length of 
7660: 64 61 74 61 20 77 72 69 74 65 20 77 69 6c 6c 20  data write will 
7670: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
7680: 20 39 20 62 79 74 65 73 2e 20 20 54 68 65 20 6e   9 bytes.  The n
7690: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
76a0: 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 65 74  s written is ret
76b0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76  urned..**.** A v
76c0: 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69  ariable-length i
76d0: 6e 74 65 67 65 72 20 63 6f 6e 73 69 73 74 73 20  nteger consists 
76e0: 6f 66 20 74 68 65 20 6c 6f 77 65 72 20 37 20 62  of the lower 7 b
76f0: 69 74 73 20 6f 66 20 65 61 63 68 20 62 79 74 65  its of each byte
7700: 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  .** for all byte
7710: 73 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  s that have the 
7720: 38 74 68 20 62 69 74 20 73 65 74 20 61 6e 64 20  8th bit set and 
7730: 6f 6e 65 20 62 79 74 65 20 77 69 74 68 20 74 68  one byte with th
7740: 65 20 38 74 68 0a 2a 2a 20 62 69 74 20 63 6c 65  e 8th.** bit cle
7750: 61 72 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ar.  Except, if 
7760: 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 39 74  we get to the 9t
7770: 68 20 62 79 74 65 2c 20 69 74 20 73 74 6f 72 65  h byte, it store
7780: 73 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 38 20  s the full.** 8 
7790: 62 69 74 73 20 61 6e 64 20 69 73 20 74 68 65 20  bits and is the 
77a0: 6c 61 73 74 20 62 79 74 65 2e 0a 2a 2f 0a 69 6e  last byte..*/.in
77b0: 74 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69  t sqlite3PutVari
77c0: 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
77d0: 20 2a 70 2c 20 75 36 34 20 76 29 7b 0a 20 20 69   *p, u64 v){.  i
77e0: 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38  nt i, j, n;.  u8
77f0: 20 62 75 66 5b 31 30 5d 3b 0a 20 20 69 66 28 20   buf[10];.  if( 
7800: 76 20 26 20 30 78 66 66 30 30 30 30 30 30 30 30  v & 0xff00000000
7810: 30 30 30 30 30 30 20 29 7b 0a 20 20 20 20 70 5b  000000 ){.    p[
7820: 38 5d 20 3d 20 76 3b 0a 20 20 20 20 76 20 3e 3e  8] = v;.    v >>
7830: 3d 20 38 3b 0a 20 20 20 20 66 6f 72 28 69 3d 37  = 8;.    for(i=7
7840: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
7850: 20 20 20 20 70 5b 69 5d 20 3d 20 28 76 20 26 20      p[i] = (v & 
7860: 30 78 37 66 29 20 7c 20 30 78 38 30 3b 0a 20 20  0x7f) | 0x80;.  
7870: 20 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 20      v >>= 7;.   
7880: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 39 3b   }.    return 9;
7890: 0a 20 20 7d 20 20 20 20 0a 20 20 6e 20 3d 20 30  .  }    .  n = 0
78a0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 62 75 66 5b  ;.  do{.    buf[
78b0: 6e 2b 2b 5d 20 3d 20 28 76 20 26 20 30 78 37 66  n++] = (v & 0x7f
78c0: 29 20 7c 20 30 78 38 30 3b 0a 20 20 20 20 76 20  ) | 0x80;.    v 
78d0: 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28  >>= 7;.  }while(
78e0: 20 76 21 3d 30 20 29 3b 0a 20 20 62 75 66 5b 30   v!=0 );.  buf[0
78f0: 5d 20 26 3d 20 30 78 37 66 3b 0a 20 20 61 73 73  ] &= 0x7f;.  ass
7900: 65 72 74 28 20 6e 3c 3d 39 20 29 3b 0a 20 20 66  ert( n<=9 );.  f
7910: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 2d 31 3b 20 6a  or(i=0, j=n-1; j
7920: 3e 3d 30 3b 20 6a 2d 2d 2c 20 69 2b 2b 29 7b 0a  >=0; j--, i++){.
7930: 20 20 20 20 70 5b 69 5d 20 3d 20 62 75 66 5b 6a      p[i] = buf[j
7940: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
7950: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  n;.}../*.** Read
7960: 20 61 20 36 34 2d 62 69 74 20 76 61 72 69 61 62   a 64-bit variab
7970: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
7980: 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73 74  r from memory st
7990: 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a  arting at p[0]..
79a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
79b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
79c0: 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ad.  The value i
79d0: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a  s stored in *v..
79e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
79f0: 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e  tVarint(const un
7a00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
7a10: 75 36 34 20 2a 76 29 7b 0a 20 20 75 33 32 20 78  u64 *v){.  u32 x
7a20: 3b 0a 20 20 75 36 34 20 78 36 34 3b 0a 20 20 69  ;.  u64 x64;.  i
7a30: 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt n;.  unsigned
7a40: 20 63 68 61 72 20 63 3b 0a 20 20 63 20 3d 20 70   char c;.  c = p
7a50: 5b 30 5d 3b 0a 20 20 69 66 28 20 28 63 20 26 20  [0];.  if( (c & 
7a60: 30 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0x80)==0 ){.    
7a70: 2a 76 20 3d 20 63 3b 0a 20 20 20 20 72 65 74 75  *v = c;.    retu
7a80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  rn 1;.  }.  x = 
7a90: 63 20 26 20 30 78 37 66 3b 0a 20 20 63 20 3d 20  c & 0x7f;.  c = 
7aa0: 70 5b 31 5d 3b 0a 20 20 69 66 28 20 28 63 20 26  p[1];.  if( (c &
7ab0: 20 30 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0x80)==0 ){.   
7ac0: 20 2a 76 20 3d 20 28 78 3c 3c 37 29 20 7c 20 63   *v = (x<<7) | c
7ad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
7ae0: 20 20 7d 0a 20 20 78 20 3d 20 28 78 3c 3c 37 29    }.  x = (x<<7)
7af0: 20 7c 20 28 63 26 30 78 37 66 29 3b 0a 20 20 63   | (c&0x7f);.  c
7b00: 20 3d 20 70 5b 32 5d 3b 0a 20 20 69 66 28 20 28   = p[2];.  if( (
7b10: 63 20 26 20 30 78 38 30 29 3d 3d 30 20 29 7b 0a  c & 0x80)==0 ){.
7b20: 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c 37 29 20      *v = (x<<7) 
7b30: 7c 20 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  | c;.    return 
7b40: 33 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 28 78 3c  3;.  }.  x = (x<
7b50: 3c 37 29 20 7c 20 28 63 26 30 78 37 66 29 3b 0a  <7) | (c&0x7f);.
7b60: 20 20 63 20 3d 20 70 5b 33 5d 3b 0a 20 20 69 66    c = p[3];.  if
7b70: 28 20 28 63 20 26 20 30 78 38 30 29 3d 3d 30 20  ( (c & 0x80)==0 
7b80: 29 7b 0a 20 20 20 20 2a 76 20 3d 20 28 78 3c 3c  ){.    *v = (x<<
7b90: 37 29 20 7c 20 63 3b 0a 20 20 20 20 72 65 74 75  7) | c;.    retu
7ba0: 72 6e 20 34 3b 0a 20 20 7d 0a 20 20 78 36 34 20  rn 4;.  }.  x64 
7bb0: 3d 20 28 78 3c 3c 37 29 20 7c 20 28 63 26 30 78  = (x<<7) | (c&0x
7bc0: 37 66 29 3b 0a 20 20 6e 20 3d 20 34 3b 0a 20 20  7f);.  n = 4;.  
7bd0: 64 6f 7b 0a 20 20 20 20 63 20 3d 20 70 5b 6e 2b  do{.    c = p[n+
7be0: 2b 5d 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 39  +];.    if( n==9
7bf0: 20 29 7b 0a 20 20 20 20 20 20 78 36 34 20 3d 20   ){.      x64 = 
7c00: 28 78 36 34 3c 3c 38 29 20 7c 20 63 3b 0a 20 20  (x64<<8) | c;.  
7c10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7c20: 0a 20 20 20 20 78 36 34 20 3d 20 28 78 36 34 3c  .    x64 = (x64<
7c30: 3c 37 29 20 7c 20 28 63 26 30 78 37 66 29 3b 0a  <7) | (c&0x7f);.
7c40: 20 20 7d 77 68 69 6c 65 28 20 28 63 20 26 20 30    }while( (c & 0
7c50: 78 38 30 29 21 3d 30 20 29 3b 0a 20 20 2a 76 20  x80)!=0 );.  *v 
7c60: 3d 20 78 36 34 3b 0a 20 20 72 65 74 75 72 6e 20  = x64;.  return 
7c70: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  n;.}../*.** Read
7c80: 20 61 20 33 32 2d 62 69 74 20 76 61 72 69 61 62   a 32-bit variab
7c90: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
7ca0: 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 73 74  r from memory st
7cb0: 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a  arting at p[0]..
7cc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7cd0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
7ce0: 61 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ad.  The value i
7cf0: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a  s stored in *v..
7d00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
7d10: 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20  tVarint32(const 
7d20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
7d30: 2c 20 75 33 32 20 2a 76 29 7b 0a 20 20 69 6e 74  , u32 *v){.  int
7d40: 20 6e 20 3d 20 31 3b 0a 20 20 75 6e 73 69 67 6e   n = 1;.  unsign
7d50: 65 64 20 63 68 61 72 20 63 20 3d 20 70 5b 30 5d  ed char c = p[0]
7d60: 3b 0a 20 20 75 33 32 20 78 20 3d 20 63 20 26 20  ;.  u32 x = c & 
7d70: 30 78 37 66 3b 0a 20 20 77 68 69 6c 65 28 20 28  0x7f;.  while( (
7d80: 63 20 26 20 30 78 38 30 29 21 3d 30 20 26 26 20  c & 0x80)!=0 && 
7d90: 6e 3c 39 20 29 7b 0a 20 20 20 20 63 20 3d 20 70  n<9 ){.    c = p
7da0: 5b 6e 2b 2b 5d 3b 0a 20 20 20 20 78 20 3d 20 28  [n++];.    x = (
7db0: 78 3c 3c 37 29 20 7c 20 28 63 20 26 20 30 78 37  x<<7) | (c & 0x7
7dc0: 66 29 3b 0a 20 20 7d 0a 20 20 2a 76 20 3d 20 78  f);.  }.  *v = x
7dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
7de0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7df0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7e00: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6e  s that will be n
7e10: 65 65 64 65 64 20 74 6f 20 73 74 6f 72 65 20 74  eeded to store t
7e20: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 36 34 2d 62  he given.** 64-b
7e30: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  it integer..*/.i
7e40: 6e 74 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  nt sqlite3Varint
7e50: 4c 65 6e 28 75 36 34 20 76 29 7b 0a 20 20 69 6e  Len(u64 v){.  in
7e60: 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f 7b 0a 20  t i = 0;.  do{. 
7e70: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76 20 3e 3e     i++;.    v >>
7e80: 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76  = 7;.  }while( v
7e90: 21 3d 30 20 26 26 20 69 3c 39 20 29 3b 0a 20 20  !=0 && i<9 );.  
7ea0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a           return i;.}..