/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 30 32 2d 32 38  /*.** 2013-02-28
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f  file contains co
0190: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
01a0: 74 68 65 20 6e 65 78 74 5f 63 68 61 72 28 41 2c  the next_char(A,
01b0: 54 2c 46 2c 57 2c 43 29 20 53 51 4c 20 66 75 6e  T,F,W,C) SQL fun
01c0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
01d0: 20 6e 65 78 74 5f 63 68 61 72 28 41 2c 54 2c 46   next_char(A,T,F
01e0: 2c 57 2c 43 29 20 66 75 6e 63 74 69 6f 6e 20 66  ,W,C) function f
01f0: 69 6e 64 73 20 61 6c 6c 20 76 61 6c 69 64 20 22  inds all valid "
0200: 6e 65 78 74 22 20 63 68 61 72 61 63 74 65 72 73  next" characters
0210: 20 66 6f 72 0a 2a 2a 20 73 74 72 69 6e 67 20 41   for.** string A
0220: 20 67 69 76 65 6e 20 74 68 65 20 76 6f 63 61 62   given the vocab
0230: 75 6c 61 72 79 20 69 6e 20 54 2e 46 2e 20 20 49  ulary in T.F.  I
0240: 66 20 74 68 65 20 57 20 76 61 6c 75 65 20 65 78  f the W value ex
0250: 69 73 74 73 20 61 6e 64 20 69 73 20 61 0a 2a 2a  ists and is a.**
0260: 20 6e 6f 6e 2d 65 6d 70 74 79 20 73 74 72 69 6e   non-empty strin
0270: 67 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e  g, then it is an
0280: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 20   SQL expression 
0290: 74 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20  that limits the 
02a0: 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 54 2e  entries.** in T.
02b0: 46 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  F that will be c
02c0: 6f 6e 73 69 64 65 72 65 64 2e 20 20 49 66 20 43  onsidered.  If C
02d0: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 61   exists and is a
02e0: 20 6e 6f 6e 2d 65 6d 70 74 79 20 73 74 72 69 6e   non-empty strin
02f0: 67 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  g,.** then it is
0300: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0310: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0320: 6e 63 65 20 74 6f 20 75 73 65 20 66 6f 72 20 63  nce to use for c
0330: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 0a 2a  omparison.  If.*
0340: 2a 20 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  * .** Only the f
0350: 69 72 73 74 20 74 68 72 65 65 20 61 72 67 75 6d  irst three argum
0360: 65 6e 74 73 20 61 72 65 20 72 65 71 75 69 72 65  ents are require
0370: 64 2e 20 20 49 66 20 74 68 65 20 43 20 70 61 72  d.  If the C par
0380: 61 6d 65 74 65 72 20 69 73 20 0a 2a 2a 20 6f 6d  ameter is .** om
0390: 69 74 74 65 64 20 6f 72 20 69 73 20 4e 55 4c 4c  itted or is NULL
03a0: 20 6f 72 20 69 73 20 61 6e 20 65 6d 70 74 79 20   or is an empty 
03b0: 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  string, then the
03c0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
03d0: 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ng .** sequence 
03e0: 6f 66 20 54 2e 46 20 69 73 20 75 73 65 64 20 66  of T.F is used f
03f0: 6f 72 20 63 6f 6d 70 61 72 69 73 69 6f 6e 2e 20  or comparision. 
0400: 20 49 66 20 74 68 65 20 57 20 70 61 72 61 6d 65   If the W parame
0410: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a  ter is omitted.*
0420: 2a 20 6f 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  * or is NULL or 
0430: 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
0440: 6e 67 2c 20 74 68 65 6e 20 6e 6f 20 66 69 6c 74  ng, then no filt
0450: 65 72 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ering of the out
0460: 70 75 74 20 69 73 0a 2a 2a 20 64 6f 6e 65 2e 0a  put is.** done..
0470: 2a 2a 0a 2a 2a 20 54 68 65 20 54 2e 46 20 63 6f  **.** The T.F co
0480: 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 62 65 20 69  lumn should be i
0490: 6e 64 65 78 65 64 20 75 73 69 6e 67 20 63 6f 6c  ndexed using col
04a0: 6c 61 74 69 6f 6e 20 43 20 6f 72 20 65 6c 73 65  lation C or else
04b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
04c0: 20 77 69 6c 6c 20 62 65 20 71 75 69 74 65 20 73   will be quite s
04d0: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  low..**.** For e
04e0: 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
04f0: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  an application h
0500: 61 73 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20  as a dictionary 
0510: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
0520: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0530: 64 69 63 74 69 6f 6e 61 72 79 28 77 6f 72 64 20  dictionary(word 
0540: 54 45 58 54 20 55 4e 49 51 55 45 29 3b 0a 2a 2a  TEXT UNIQUE);.**
0550: 0a 2a 2a 20 46 75 72 74 68 65 72 20 73 75 70 70  .** Further supp
0560: 6f 73 65 20 74 68 61 74 20 66 6f 72 20 75 73 65  ose that for use
0570: 72 20 6b 65 79 70 61 64 20 65 6e 74 72 79 2c 20  r keypad entry, 
0580: 69 74 20 69 73 20 64 65 73 69 72 65 64 20 74 6f  it is desired to
0590: 20 64 69 73 61 62 6c 65 0a 2a 2a 20 28 67 72 61   disable.** (gra
05a0: 79 20 6f 75 74 29 20 6b 65 79 73 20 74 68 61 74  y out) keys that
05b0: 20 61 72 65 20 6e 6f 74 20 76 61 6c 69 64 20 61   are not valid a
05c0: 73 20 74 68 65 20 6e 65 78 74 20 63 68 61 72 61  s the next chara
05d0: 63 74 65 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a  cter.  If the.**
05e0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 70 72   the user has pr
05f0: 65 76 69 6f 75 73 6c 79 20 65 6e 74 65 72 65 64  eviously entered
0600: 20 28 73 61 79 29 20 27 63 68 61 27 20 74 68 65   (say) 'cha' the
0610: 6e 20 74 6f 20 66 69 6e 64 20 61 6c 6c 20 61 6c  n to find all al
0620: 6c 6f 77 65 64 0a 2a 2a 20 6e 65 78 74 20 63 68  lowed.** next ch
0630: 61 72 61 63 74 65 72 73 20 28 61 6e 64 20 74 68  aracters (and th
0640: 65 72 65 62 79 20 64 65 74 65 72 6d 69 6e 65 20  ereby determine 
0650: 77 68 65 6e 20 6b 65 79 73 20 73 68 6f 75 6c 64  when keys should
0660: 20 6e 6f 74 20 62 65 20 67 72 61 79 65 64 0a 2a   not be grayed.*
0670: 2a 20 6f 75 74 29 20 72 75 6e 20 74 68 65 20 66  * out) run the f
0680: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 79 3a 0a  ollowing query:.
0690: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6e  **.**   SELECT n
06a0: 65 78 74 5f 63 68 61 72 28 27 63 68 61 27 2c 27  ext_char('cha','
06b0: 64 69 63 74 69 6f 6e 61 72 79 27 2c 27 77 6f 72  dictionary','wor
06c0: 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  d');.**.** IMPLE
06d0: 4d 45 4e 54 41 54 49 4f 4e 20 4e 4f 54 45 53 3a  MENTATION NOTES:
06e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 5f  .**.** The next_
06f0: 63 68 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  char function is
0700: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
0710: 6e 67 20 72 65 63 75 72 73 69 76 65 20 53 51 4c  ng recursive SQL
0720: 20 74 68 61 74 20 6d 61 6b 65 73 0a 2a 2a 20 75   that makes.** u
0730: 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
0740: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
0750: 6e 61 6d 65 20 61 73 20 70 61 72 74 20 6f 66 20  name as part of 
0760: 61 20 71 75 65 72 79 2e 20 20 49 66 20 65 69 74  a query.  If eit
0770: 68 65 72 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  her.** the table
0780: 20 6e 61 6d 65 20 6f 72 20 63 6f 6c 75 6d 6e 20   name or column 
0790: 6e 61 6d 65 20 61 72 65 20 6b 65 79 77 6f 72 64  name are keyword
07a0: 73 20 6f 72 20 63 6f 6e 74 61 69 6e 20 73 70 65  s or contain spe
07b0: 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 73 2c  cial characters,
07c0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 79 20 73 68  .** then they sh
07d0: 6f 75 6c 64 20 62 65 20 65 73 63 61 70 65 64 2e  ould be escaped.
07e0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
07f0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6e 65  *.**   SELECT ne
0800: 78 74 5f 63 68 61 72 28 27 63 68 61 27 2c 27 5b  xt_char('cha','[
0810: 64 69 63 74 69 6f 6e 61 72 79 5d 27 2c 27 5b 77  dictionary]','[w
0820: 6f 72 64 5d 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ord]');.**.** Th
0830: 69 73 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74 68  is also means th
0840: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  at the table nam
0850: 65 20 63 61 6e 20 62 65 20 61 20 73 75 62 71 75  e can be a subqu
0860: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
0870: 45 43 54 20 6e 65 78 74 5f 63 68 61 72 28 27 63  ECT next_char('c
0880: 68 61 27 2c 27 28 53 45 4c 45 43 54 20 77 6f 72  ha','(SELECT wor
0890: 64 20 41 53 20 77 20 46 52 4f 4d 20 64 69 63 74  d AS w FROM dict
08a0: 69 6f 6e 61 72 79 29 27 2c 27 77 27 29 3b 0a 2a  ionary)','w');.*
08b0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
08c0: 74 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45  te3ext.h".SQLITE
08d0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
08e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
08f0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  g.h>../*.** A st
0900: 72 75 63 74 75 72 65 20 74 6f 20 68 6f 6c 64 20  ructure to hold 
0910: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 6e  context of the n
0920: 65 78 74 5f 63 68 61 72 28 29 20 63 6f 6d 70 75  ext_char() compu
0930: 74 61 74 69 6f 6e 20 61 63 72 6f 73 73 0a 2a 2a  tation across.**
0940: 20 6e 65 73 74 65 64 20 66 75 6e 63 74 69 6f 6e   nested function
0950: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 74 79 70 65 64   calls..*/.typed
0960: 65 66 20 73 74 72 75 63 74 20 6e 65 78 74 43 68  ef struct nextCh
0970: 61 72 43 6f 6e 74 65 78 74 20 6e 65 78 74 43 68  arContext nextCh
0980: 61 72 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  arContext;.struc
0990: 74 20 6e 65 78 74 43 68 61 72 43 6f 6e 74 65 78  t nextCharContex
09a0: 74 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t {.  sqlite3 *d
09b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
09c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
09d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
09e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
09f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
0a00: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
0a10: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  d statement used
0a20: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
0a30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
0a40: 61 72 20 2a 7a 50 72 65 66 69 78 3b 20 20 20 20  ar *zPrefix;    
0a50: 20 2f 2a 20 50 72 65 66 69 78 20 74 6f 20 73 63   /* Prefix to sc
0a60: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  an */.  int nPre
0a70: 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
0a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
0a90: 65 20 6f 66 20 7a 50 72 65 66 69 78 20 69 6e 20  e of zPrefix in 
0aa0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
0ab0: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ad0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
0ae0: 74 6f 20 61 52 65 73 75 6c 74 20 2a 2f 0a 20 20  to aResult */.  
0af0: 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 20 20 20  int nUsed;      
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20    /* Space used 
0b20: 69 6e 20 61 52 65 73 75 6c 74 20 2a 2f 0a 20 20  in aResult */.  
0b30: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 61 52  unsigned int *aR
0b40: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
0b50: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e 65    /* Array of ne
0b60: 78 74 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  xt characters */
0b70: 0a 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 46 61 69  .  int mallocFai
0b80: 6c 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  led;            
0b90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0ba0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
0bb0: 20 20 69 6e 74 20 6f 74 68 65 72 45 72 72 6f 72    int otherError
0bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0bd0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0be0: 61 6e 79 20 6f 74 68 65 72 20 66 61 69 6c 75 72  any other failur
0bf0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
0c00: 70 70 65 6e 64 20 61 20 72 65 73 75 6c 74 20 63  ppend a result c
0c10: 68 61 72 61 63 74 65 72 20 69 66 20 74 68 65 20  haracter if the 
0c20: 63 68 61 72 61 63 74 65 72 20 69 73 20 6e 6f 74  character is not
0c30: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 0a   already in the.
0c40: 2a 2a 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ** result..*/.st
0c50: 61 74 69 63 20 76 6f 69 64 20 6e 65 78 74 43 68  atic void nextCh
0c60: 61 72 41 70 70 65 6e 64 28 6e 65 78 74 43 68 61  arAppend(nextCha
0c70: 72 43 6f 6e 74 65 78 74 20 2a 70 2c 20 75 6e 73  rContext *p, uns
0c80: 69 67 6e 65 64 20 63 29 7b 0a 20 20 69 6e 74 20  igned c){.  int 
0c90: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0ca0: 70 2d 3e 6e 55 73 65 64 3b 20 69 2b 2b 29 7b 0a  p->nUsed; i++){.
0cb0: 20 20 20 20 69 66 28 20 70 2d 3e 61 52 65 73 75      if( p->aResu
0cc0: 6c 74 5b 69 5d 3d 3d 63 20 29 20 72 65 74 75 72  lt[i]==c ) retur
0cd0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  n;.  }.  if( p->
0ce0: 6e 55 73 65 64 2b 31 20 3e 20 70 2d 3e 6e 41 6c  nUsed+1 > p->nAl
0cf0: 6c 6f 63 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  loc ){.    unsig
0d00: 6e 65 64 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20  ned int *aNew;. 
0d10: 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 41     int n = p->nA
0d20: 6c 6c 6f 63 2a 32 20 2b 20 33 30 3b 0a 20 20 20  lloc*2 + 30;.   
0d30: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
0d40: 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 52 65  realloc64(p->aRe
0d50: 73 75 6c 74 2c 20 6e 2a 73 69 7a 65 6f 66 28 75  sult, n*sizeof(u
0d60: 6e 73 69 67 6e 65 64 20 69 6e 74 29 29 3b 0a 20  nsigned int));. 
0d70: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
0d80: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 61 6c 6c 6f  {.      p->mallo
0d90: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
0da0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0db0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 61  else{.      p->a
0dc0: 52 65 73 75 6c 74 20 3d 20 61 4e 65 77 3b 0a 20  Result = aNew;. 
0dd0: 20 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d       p->nAlloc =
0de0: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
0df0: 70 2d 3e 61 52 65 73 75 6c 74 5b 70 2d 3e 6e 55  p->aResult[p->nU
0e00: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f  sed++] = c;.}../
0e10: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61  *.** Write a cha
0e20: 72 61 63 74 65 72 20 69 6e 74 6f 20 7a 5b 5d 20  racter into z[] 
0e30: 61 73 20 55 54 46 38 2e 20 20 52 65 74 75 72 6e  as UTF8.  Return
0e40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e50: 79 74 65 73 20 6e 65 65 64 65 64 0a 2a 2a 20 74  ytes needed.** t
0e60: 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 72 61  o hold the chara
0e70: 63 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cter.*/.static i
0e80: 6e 74 20 77 72 69 74 65 55 74 66 38 28 75 6e 73  nt writeUtf8(uns
0e90: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 75  igned char *z, u
0ea0: 6e 73 69 67 6e 65 64 20 63 29 7b 0a 20 20 69 66  nsigned c){.  if
0eb0: 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b 0a 20  ( c<0x00080 ){. 
0ec0: 20 20 20 7a 5b 30 5d 20 3d 20 28 75 6e 73 69 67     z[0] = (unsig
0ed0: 6e 65 64 20 63 68 61 72 29 28 63 26 30 78 66 66  ned char)(c&0xff
0ee0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
0ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 3c 30 78 30  .  }.  if( c<0x0
0f00: 30 38 30 30 20 29 7b 0a 20 20 20 20 7a 5b 30 5d  0800 ){.    z[0]
0f10: 20 3d 20 30 78 43 30 20 2b 20 28 75 6e 73 69 67   = 0xC0 + (unsig
0f20: 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 36 29  ned char)((c>>6)
0f30: 26 30 78 31 46 29 3b 0a 20 20 20 20 7a 5b 31 5d  &0x1F);.    z[1]
0f40: 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67   = 0x80 + (unsig
0f50: 6e 65 64 20 63 68 61 72 29 28 63 20 26 20 30 78  ned char)(c & 0x
0f60: 33 46 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  3F);.    return 
0f70: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3c 30  2;.  }.  if( c<0
0f80: 78 31 30 30 30 30 20 29 7b 0a 20 20 20 20 7a 5b  x10000 ){.    z[
0f90: 30 5d 20 3d 20 30 78 45 30 20 2b 20 28 75 6e 73  0] = 0xE0 + (uns
0fa0: 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e  igned char)((c>>
0fb0: 31 32 29 26 30 78 30 46 29 3b 0a 20 20 20 20 7a  12)&0x0F);.    z
0fc0: 5b 31 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  [1] = 0x80 + (un
0fd0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e  signed char)((c>
0fe0: 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20  >6) & 0x3F);.   
0ff0: 20 7a 5b 32 5d 20 3d 20 30 78 38 30 20 2b 20 28   z[2] = 0x80 + (
1000: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 63  unsigned char)(c
1010: 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 72 65   & 0x3F);.    re
1020: 74 75 72 6e 20 33 3b 0a 20 20 7d 0a 20 20 7a 5b  turn 3;.  }.  z[
1030: 30 5d 20 3d 20 30 78 46 30 20 2b 20 28 75 6e 73  0] = 0xF0 + (uns
1040: 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e  igned char)((c>>
1050: 31 38 29 20 26 20 30 78 30 37 29 3b 0a 20 20 7a  18) & 0x07);.  z
1060: 5b 31 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  [1] = 0x80 + (un
1070: 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e  signed char)((c>
1080: 3e 31 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >12) & 0x3F);.  
1090: 7a 5b 32 5d 20 3d 20 30 78 38 30 20 2b 20 28 75  z[2] = 0x80 + (u
10a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63  nsigned char)((c
10b0: 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20  >>6) & 0x3F);.  
10c0: 7a 5b 33 5d 20 3d 20 30 78 38 30 20 2b 20 28 75  z[3] = 0x80 + (u
10d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 63 20  nsigned char)(c 
10e0: 26 20 30 78 33 46 29 3b 0a 20 20 72 65 74 75 72  & 0x3F);.  retur
10f0: 6e 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 4;.}../*.** Re
1100: 61 64 20 61 20 55 54 46 38 20 63 68 61 72 61 63  ad a UTF8 charac
1110: 74 65 72 20 6f 75 74 20 6f 66 20 7a 5b 5d 20 61  ter out of z[] a
1120: 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f  nd write it into
1130: 20 2a 70 4f 75 74 2e 20 20 52 65 74 75 72 6e 0a   *pOut.  Return.
1140: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1150: 20 62 79 74 65 73 20 69 6e 20 7a 5b 5d 20 74 68   bytes in z[] th
1160: 61 74 20 77 65 72 65 20 75 73 65 64 20 74 6f 20  at were used to 
1170: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 68  construct the ch
1180: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
1190: 69 63 20 69 6e 74 20 72 65 61 64 55 74 66 38 28  ic int readUtf8(
11a0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11b0: 68 61 72 20 2a 7a 2c 20 75 6e 73 69 67 6e 65 64  har *z, unsigned
11c0: 20 2a 70 4f 75 74 29 7b 0a 20 20 73 74 61 74 69   *pOut){.  stati
11d0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
11e0: 20 63 68 61 72 20 76 61 6c 69 64 42 69 74 73 5b   char validBits[
11f0: 5d 20 3d 20 7b 0a 20 20 20 20 30 78 30 30 2c 20  ] = {.    0x00, 
1200: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
1210: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
1220: 30 36 2c 20 30 78 30 37 2c 0a 20 20 20 20 30 78  06, 0x07,.    0x
1230: 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20  08, 0x09, 0x0a, 
1240: 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64  0x0b, 0x0c, 0x0d
1250: 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20  , 0x0e, 0x0f,.  
1260: 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78    0x10, 0x11, 0x
1270: 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20  12, 0x13, 0x14, 
1280: 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37  0x15, 0x16, 0x17
1290: 2c 0a 20 20 20 20 30 78 31 38 2c 20 30 78 31 39  ,.    0x18, 0x19
12a0: 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78  , 0x1a, 0x1b, 0x
12b0: 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20  1c, 0x1d, 0x1e, 
12c0: 30 78 31 66 2c 0a 20 20 20 20 30 78 30 30 2c 20  0x1f,.    0x00, 
12d0: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
12e0: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
12f0: 30 36 2c 20 30 78 30 37 2c 0a 20 20 20 20 30 78  06, 0x07,.    0x
1300: 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20  08, 0x09, 0x0a, 
1310: 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64  0x0b, 0x0c, 0x0d
1320: 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20  , 0x0e, 0x0f,.  
1330: 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78    0x00, 0x01, 0x
1340: 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20  02, 0x03, 0x04, 
1350: 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37  0x05, 0x06, 0x07
1360: 2c 0a 20 20 20 20 30 78 30 30 2c 20 30 78 30 31  ,.    0x00, 0x01
1370: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
1380: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20  00, 0x01, 0x00, 
1390: 30 78 30 30 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  0x00,.  };.  uns
13a0: 69 67 6e 65 64 20 63 20 3d 20 7a 5b 30 5d 3b 0a  igned c = z[0];.
13b0: 20 20 69 66 28 20 63 3c 30 78 63 30 20 29 7b 0a    if( c<0xc0 ){.
13c0: 20 20 20 20 2a 70 4f 75 74 20 3d 20 63 3b 0a 20      *pOut = c;. 
13d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
13e0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20  else{.    int n 
13f0: 3d 20 31 3b 0a 20 20 20 20 63 20 3d 20 76 61 6c  = 1;.    c = val
1400: 69 64 42 69 74 73 5b 63 2d 30 78 63 30 5d 3b 0a  idBits[c-0xc0];.
1410: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 5b 6e 5d      while( (z[n]
1420: 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
1430: 7b 0a 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c  {.      c = (c<<
1440: 36 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 6e  6) + (0x3f & z[n
1450: 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ++]);.    }.    
1460: 69 66 28 20 63 3c 30 78 38 30 20 7c 7c 20 28 63  if( c<0x80 || (c
1470: 26 30 78 46 46 46 46 46 38 30 30 29 3d 3d 30 78  &0xFFFFF800)==0x
1480: 44 38 30 30 20 7c 7c 20 28 63 26 30 78 46 46 46  D800 || (c&0xFFF
1490: 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29  FFFFE)==0xFFFE )
14a0: 7b 0a 20 20 20 20 20 20 63 20 3d 20 30 78 46 46  {.      c = 0xFF
14b0: 46 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  FD;.    }.    *p
14c0: 4f 75 74 20 3d 20 63 3b 0a 20 20 20 20 72 65 74  Out = c;.    ret
14d0: 75 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn n;.  }.}../*
14e0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 43 68 61 72  .** The nextChar
14f0: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
1500: 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20 75  e has been set u
1510: 70 2e 20 20 41 64 64 20 61 6c 6c 20 22 6e 65 78  p.  Add all "nex
1520: 74 22 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  t" characters.**
1530: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73   to the result s
1540: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
1550: 69 64 20 66 69 6e 64 4e 65 78 74 43 68 61 72 73  id findNextChars
1560: 28 6e 65 78 74 43 68 61 72 43 6f 6e 74 65 78 74  (nextCharContext
1570: 20 2a 70 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64   *p){.  unsigned
1580: 20 63 50 72 65 76 20 3d 20 30 3b 0a 20 20 75 6e   cPrev = 0;.  un
1590: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 50 72 65  signed char zPre
15a0: 76 5b 38 5d 3b 0a 20 20 69 6e 74 20 6e 2c 20 72  v[8];.  int n, r
15b0: 63 3b 0a 20 20 0a 20 20 66 6f 72 28 3b 3b 29 7b  c;.  .  for(;;){
15c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
15d0: 64 5f 74 65 78 74 28 70 2d 3e 70 53 74 6d 74 2c  d_text(p->pStmt,
15e0: 20 31 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 50   1, (char*)p->zP
15f0: 72 65 66 69 78 2c 20 70 2d 3e 6e 50 72 65 66 69  refix, p->nPrefi
1600: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
1610: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1620: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
1630: 20 77 72 69 74 65 55 74 66 38 28 7a 50 72 65 76   writeUtf8(zPrev
1640: 2c 20 63 50 72 65 76 2b 31 29 3b 0a 20 20 20 20  , cPrev+1);.    
1650: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1660: 74 28 70 2d 3e 70 53 74 6d 74 2c 20 32 2c 20 28  t(p->pStmt, 2, (
1670: 63 68 61 72 2a 29 7a 50 72 65 76 2c 20 6e 2c 20  char*)zPrev, n, 
1680: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16a0: 5f 73 74 65 70 28 70 2d 3e 70 53 74 6d 74 29 3b  _step(p->pStmt);
16b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16c0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
16d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
16e0: 70 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  p->pStmt);.     
16f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
1700: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
1710: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  E_ROW ){.      p
1720: 2d 3e 6f 74 68 65 72 45 72 72 6f 72 20 3d 20 72  ->otherError = r
1730: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
1740: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1750: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1760: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
1770: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1780: 74 28 70 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  t(p->pStmt, 0);.
1790: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
17a0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 20 3d 20  Next;.      n = 
17b0: 72 65 61 64 55 74 66 38 28 7a 4f 75 74 2b 70 2d  readUtf8(zOut+p-
17c0: 3e 6e 50 72 65 66 69 78 2c 20 26 63 4e 65 78 74  >nPrefix, &cNext
17d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17e0: 5f 72 65 73 65 74 28 70 2d 3e 70 53 74 6d 74 29  _reset(p->pStmt)
17f0: 3b 0a 20 20 20 20 20 20 6e 65 78 74 43 68 61 72  ;.      nextChar
1800: 41 70 70 65 6e 64 28 70 2c 20 63 4e 65 78 74 29  Append(p, cNext)
1810: 3b 0a 20 20 20 20 20 20 63 50 72 65 76 20 3d 20  ;.      cPrev = 
1820: 63 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28  cNext;.      if(
1830: 20 70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   p->mallocFailed
1840: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d   ) return;.    }
1850: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6e  .  }.}.../*.** n
1860: 65 78 74 5f 63 68 61 72 61 63 74 65 72 28 41 2c  ext_character(A,
1870: 54 2c 46 2c 57 29 0a 2a 2a 0a 2a 2a 20 52 65 74  T,F,W).**.** Ret
1880: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 63 6f 6d  urn a string com
1890: 70 6f 73 74 65 64 20 6f 66 20 61 6c 6c 20 6e 65  posted of all ne
18a0: 78 74 20 70 6f 73 73 69 62 6c 65 20 63 68 61 72  xt possible char
18b0: 61 63 74 65 72 73 20 61 66 74 65 72 0a 2a 2a 20  acters after.** 
18c0: 41 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 6f  A for elements o
18d0: 66 20 54 2e 46 2e 20 20 49 66 20 57 20 69 73 20  f T.F.  If W is 
18e0: 73 75 70 70 6c 69 65 64 2c 20 74 68 65 6e 20 69  supplied, then i
18f0: 74 20 69 73 20 61 6e 20 53 51 4c 20 65 78 70 72  t is an SQL expr
1900: 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c  ession.** that l
1910: 69 6d 69 74 73 20 74 68 65 20 65 6c 65 6d 65 6e  imits the elemen
1920: 74 73 20 69 6e 20 54 2e 46 20 74 68 61 74 20 61  ts in T.F that a
1930: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a  re considered..*
1940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65  /.static void ne
1950: 78 74 43 68 61 72 46 75 6e 63 28 0a 20 20 73 71  xtCharFunc(.  sq
1960: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1970: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
1980: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
1990: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
19a0: 6e 65 78 74 43 68 61 72 43 6f 6e 74 65 78 74 20  nextCharContext 
19b0: 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  c;.  const unsig
19c0: 6e 65 64 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  ned char *zTable
19d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
19e0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
19f0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1a00: 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 20 3d 20   char *zField = 
1a10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1a20: 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 63  xt(argv[2]);.  c
1a30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a40: 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 63 6f  ar *zWhere;.  co
1a50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a60: 72 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 0a 20 20  r *zCollName;.  
1a70: 63 68 61 72 20 2a 7a 57 68 65 72 65 43 6c 61 75  char *zWhereClau
1a80: 73 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  se = 0;.  char *
1a90: 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 63 68 61  zColl = 0;.  cha
1aa0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
1ab0: 63 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 2c  c;..  memset(&c,
1ac0: 20 30 2c 20 73 69 7a 65 6f 66 28 63 29 29 3b 0a   0, sizeof(c));.
1ad0: 20 20 63 2e 64 62 20 3d 20 73 71 6c 69 74 65 33    c.db = sqlite3
1ae0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
1af0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63  le(context);.  c
1b00: 2e 7a 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74  .zPrefix = sqlit
1b10: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1b20: 67 76 5b 30 5d 29 3b 0a 20 20 63 2e 6e 50 72 65  gv[0]);.  c.nPre
1b30: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  fix = sqlite3_va
1b40: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1b50: 5d 29 3b 0a 20 20 69 66 28 20 7a 54 61 62 6c 65  ]);.  if( zTable
1b60: 3d 3d 30 20 7c 7c 20 7a 46 69 65 6c 64 3d 3d 30  ==0 || zField==0
1b70: 20 7c 7c 20 63 2e 7a 50 72 65 66 69 78 3d 3d 30   || c.zPrefix==0
1b80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1b90: 20 61 72 67 63 3e 3d 34 0a 20 20 20 26 26 20 28   argc>=4.   && (
1ba0: 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  zWhere = sqlite3
1bb0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1bc0: 5b 33 5d 29 29 21 3d 30 0a 20 20 20 26 26 20 7a  [3]))!=0.   && z
1bd0: 57 68 65 72 65 5b 30 5d 21 3d 30 0a 20 20 29 7b  Where[0]!=0.  ){
1be0: 0a 20 20 20 20 7a 57 68 65 72 65 43 6c 61 75 73  .    zWhereClaus
1bf0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
1c00: 6e 74 66 28 22 41 4e 44 20 28 25 73 29 22 2c 20  ntf("AND (%s)", 
1c10: 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  zWhere);.    if(
1c20: 20 7a 57 68 65 72 65 43 6c 61 75 73 65 3d 3d 30   zWhereClause==0
1c30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c40: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
1c50: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
1c60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1c70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c80: 7a 57 68 65 72 65 43 6c 61 75 73 65 20 3d 20 22  zWhereClause = "
1c90: 22 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  ";.  }.  if( arg
1ca0: 63 3e 3d 35 0a 20 20 20 26 26 20 28 7a 43 6f 6c  c>=5.   && (zCol
1cb0: 6c 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  lName = sqlite3_
1cc0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
1cd0: 34 5d 29 29 21 3d 30 0a 20 20 20 26 26 20 7a 43  4]))!=0.   && zC
1ce0: 6f 6c 6c 4e 61 6d 65 5b 30 5d 21 3d 30 20 0a 20  ollName[0]!=0 . 
1cf0: 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   ){.    zColl = 
1d00: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1d10: 22 63 6f 6c 6c 61 74 65 20 5c 22 25 77 5c 22 22  "collate \"%w\""
1d20: 2c 20 7a 43 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20  , zCollName);.  
1d30: 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 29    if( zColl==0 )
1d40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1d50: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
1d60: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
1d70: 20 20 20 69 66 28 20 7a 57 68 65 72 65 43 6c 61     if( zWhereCla
1d80: 75 73 65 5b 30 5d 20 29 20 73 71 6c 69 74 65 33  use[0] ) sqlite3
1d90: 5f 66 72 65 65 28 7a 57 68 65 72 65 43 6c 61 75  _free(zWhereClau
1da0: 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  se);.      retur
1db0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
1dc0: 7b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 22  {.    zColl = ""
1dd0: 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73  ;.  }.  zSql = s
1de0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1df0: 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 20 46      "SELECT %s F
1e00: 52 4f 4d 20 25 73 22 0a 20 20 20 20 22 20 57 48  ROM %s".    " WH
1e10: 45 52 45 20 25 73 3e 3d 28 3f 31 20 7c 7c 20 3f  ERE %s>=(?1 || ?
1e20: 32 29 20 25 73 22 0a 20 20 20 20 22 20 20 20 41  2) %s".    "   A
1e30: 4e 44 20 25 73 3c 3d 28 3f 31 20 7c 7c 20 63 68  ND %s<=(?1 || ch
1e40: 61 72 28 31 31 31 34 31 31 31 29 29 20 25 73 22  ar(1114111)) %s"
1e50: 20 2f 2a 20 31 31 31 34 31 31 31 20 3d 3d 20 30   /* 1114111 == 0
1e60: 78 31 30 66 66 66 66 20 2a 2f 0a 20 20 20 20 22  x10ffff */.    "
1e70: 20 20 20 25 73 22 0a 20 20 20 20 22 20 4f 52 44     %s".    " ORD
1e80: 45 52 20 42 59 20 31 20 25 73 20 41 53 43 20 4c  ER BY 1 %s ASC L
1e90: 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 7a 46 69  IMIT 1",.    zFi
1ea0: 65 6c 64 2c 20 7a 54 61 62 6c 65 2c 20 7a 46 69  eld, zTable, zFi
1eb0: 65 6c 64 2c 20 7a 43 6f 6c 6c 2c 20 7a 46 69 65  eld, zColl, zFie
1ec0: 6c 64 2c 20 7a 43 6f 6c 6c 2c 20 7a 57 68 65 72  ld, zColl, zWher
1ed0: 65 43 6c 61 75 73 65 2c 20 7a 43 6f 6c 6c 0a 20  eClause, zColl. 
1ee0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 68 65 72 65   );.  if( zWhere
1ef0: 43 6c 61 75 73 65 5b 30 5d 20 29 20 73 71 6c 69  Clause[0] ) sqli
1f00: 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 43  te3_free(zWhereC
1f10: 6c 61 75 73 65 29 3b 0a 20 20 69 66 28 20 7a 43  lause);.  if( zC
1f20: 6f 6c 6c 5b 30 5d 20 29 20 73 71 6c 69 74 65 33  oll[0] ) sqlite3
1f30: 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20  _free(zColl);.  
1f40: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1f50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1f60: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
1f70: 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75  ntext);.    retu
1f80: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rn;.  }..  rc = 
1f90: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1fa0: 76 32 28 63 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d  v2(c.db, zSql, -
1fb0: 31 2c 20 26 63 2e 70 53 74 6d 74 2c 20 30 29 3b  1, &c.pStmt, 0);
1fc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fd0: 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
1fe0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
1ff0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
2000: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ext, sqlite3_err
2010: 6d 73 67 28 63 2e 64 62 29 2c 20 2d 31 29 3b 0a  msg(c.db), -1);.
2020: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2030: 20 20 66 69 6e 64 4e 65 78 74 43 68 61 72 73 28    findNextChars(
2040: 26 63 29 3b 0a 20 20 69 66 28 20 63 2e 6d 61 6c  &c);.  if( c.mal
2050: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2060: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2070: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2080: 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ext);.  }else{. 
2090: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
20a0: 20 2a 70 52 65 73 3b 0a 20 20 20 20 70 52 65 73   *pRes;.    pRes
20b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
20c0: 63 36 34 28 20 63 2e 6e 55 73 65 64 2a 34 20 2b  c64( c.nUsed*4 +
20d0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 52   1 );.    if( pR
20e0: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  es==0 ){.      s
20f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2100: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
2110: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2120: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2130: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2140: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 2e     for(i=0; i<c.
2150: 6e 55 73 65 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  nUsed; i++){.   
2160: 20 20 20 20 20 6e 20 2b 3d 20 77 72 69 74 65 55       n += writeU
2170: 74 66 38 28 70 52 65 73 2b 6e 2c 20 63 2e 61 52  tf8(pRes+n, c.aR
2180: 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20  esult[i]);.     
2190: 20 7d 0a 20 20 20 20 20 20 70 52 65 73 5b 6e 5d   }.      pRes[n]
21a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
21b0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
21c0: 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20  context, (const 
21d0: 63 68 61 72 2a 29 70 52 65 73 2c 20 6e 2c 20 73  char*)pRes, n, s
21e0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
21f0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2200: 33 5f 66 69 6e 61 6c 69 7a 65 28 63 2e 70 53 74  3_finalize(c.pSt
2210: 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  mt);.  sqlite3_f
2220: 72 65 65 28 63 2e 61 52 65 73 75 6c 74 29 3b 0a  ree(c.aResult);.
2230: 7d 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  }..#ifdef _WIN32
2240: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
2250: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e  xport).#endif.in
2260: 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68  t sqlite3_nextch
2270: 61 72 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  ar_init(.  sqlit
2280: 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20  e3 *db, .  char 
2290: 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63  **pzErrMsg, .  c
22a0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
22b0: 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a  _routines *pApi.
22c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54  LITE_OK;.  SQLIT
22e0: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
22f0: 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64  2(pApi);.  (void
2300: 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55  )pzErrMsg;  /* U
2310: 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20  nused parameter 
2320: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2330: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2340: 6e 28 64 62 2c 20 22 6e 65 78 74 5f 63 68 61 72  n(db, "next_char
2350: 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
2360: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 6e 65 78 74 43 68 61 72 46 75 6e       nextCharFun
2390: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
23a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23c0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
23d0: 6e 28 64 62 2c 20 22 6e 65 78 74 5f 63 68 61 72  n(db, "next_char
23e0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
23f0: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 20 6e 65 78 74 43 68 61 72 46         nextCharF
2420: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
2430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2450: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2460: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6e 65 78  unction(db, "nex
2470: 74 5f 63 68 61 72 22 2c 20 35 2c 20 53 51 4c 49  t_char", 5, SQLI
2480: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
24b0: 74 43 68 61 72 46 75 6e 63 2c 20 30 2c 20 30 29  tCharFunc, 0, 0)
24c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24d0: 63 3b 0a 7d 0a                                   c;.}.