/ Hex Artifact Content
Login

Artifact 35c8b8baacb96d92abbb34a83a997b797075b342:


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 28 70 2d 3e 61 52 65 73 75  realloc(p->aResu
0d50: 6c 74 2c 20 6e 2a 73 69 7a 65 6f 66 28 75 6e 73  lt, n*sizeof(uns
0d60: 69 67 6e 65 64 20 69 6e 74 29 29 3b 0a 20 20 20  igned int));.   
0d70: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
0d80: 20 20 20 20 20 20 70 2d 3e 6d 61 6c 6c 6f 63 46        p->mallocF
0d90: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
0da0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
0db0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 61 52 65  se{.      p->aRe
0dc0: 73 75 6c 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  sult = aNew;.   
0dd0: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e     p->nAlloc = n
0de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0df0: 3e 61 52 65 73 75 6c 74 5b 70 2d 3e 6e 55 73 65  >aResult[p->nUse
0e00: 64 2b 2b 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a  d++] = c;.}../*.
0e10: 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61 72 61  ** Write a chara
0e20: 63 74 65 72 20 69 6e 74 6f 20 7a 5b 5d 20 61 73  cter into z[] as
0e30: 20 55 54 46 38 2e 20 20 52 65 74 75 72 6e 20 74   UTF8.  Return t
0e40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
0e50: 65 73 20 6e 65 65 64 65 64 0a 2a 2a 20 74 6f 20  es needed.** to 
0e60: 68 6f 6c 64 20 74 68 65 20 63 68 61 72 61 63 74  hold the charact
0e70: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
0e80: 20 77 72 69 74 65 55 74 66 38 28 75 6e 73 69 67   writeUtf8(unsig
0e90: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 75 6e 73  ned char *z, uns
0ea0: 69 67 6e 65 64 20 63 29 7b 0a 20 20 69 66 28 20  igned c){.  if( 
0eb0: 63 3c 30 78 30 30 30 38 30 20 29 7b 0a 20 20 20  c<0x00080 ){.   
0ec0: 20 7a 5b 30 5d 20 3d 20 28 75 6e 73 69 67 6e 65   z[0] = (unsigne
0ed0: 64 20 63 68 61 72 29 28 63 26 30 78 66 66 29 3b  d char)(c&0xff);
0ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
0ef0: 20 7d 0a 20 20 69 66 28 20 63 3c 30 78 30 30 38   }.  if( c<0x008
0f00: 30 30 20 29 7b 0a 20 20 20 20 7a 5b 30 5d 20 3d  00 ){.    z[0] =
0f10: 20 30 78 43 30 20 2b 20 28 75 6e 73 69 67 6e 65   0xC0 + (unsigne
0f20: 64 20 63 68 61 72 29 28 28 63 3e 3e 36 29 26 30  d char)((c>>6)&0
0f30: 78 31 46 29 3b 0a 20 20 20 20 7a 5b 31 5d 20 3d  x1F);.    z[1] =
0f40: 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67 6e 65   0x80 + (unsigne
0f50: 64 20 63 68 61 72 29 28 63 20 26 20 30 78 33 46  d char)(c & 0x3F
0f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  );.    return 2;
0f70: 0a 20 20 7d 0a 20 20 69 66 28 20 63 3c 30 78 31  .  }.  if( c<0x1
0f80: 30 30 30 30 20 29 7b 0a 20 20 20 20 7a 5b 30 5d  0000 ){.    z[0]
0f90: 20 3d 20 30 78 45 30 20 2b 20 28 75 6e 73 69 67   = 0xE0 + (unsig
0fa0: 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31 32  ned char)((c>>12
0fb0: 29 26 30 78 30 46 29 3b 0a 20 20 20 20 7a 5b 31  )&0x0F);.    z[1
0fc0: 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69  ] = 0x80 + (unsi
0fd0: 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 36  gned char)((c>>6
0fe0: 29 20 26 20 30 78 33 46 29 3b 0a 20 20 20 20 7a  ) & 0x3F);.    z
0ff0: 5b 32 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  [2] = 0x80 + (un
1000: 73 69 67 6e 65 64 20 63 68 61 72 29 28 63 20 26  signed char)(c &
1010: 20 30 78 33 46 29 3b 0a 20 20 20 20 72 65 74 75   0x3F);.    retu
1020: 72 6e 20 33 3b 0a 20 20 7d 0a 20 20 7a 5b 30 5d  rn 3;.  }.  z[0]
1030: 20 3d 20 30 78 46 30 20 2b 20 28 75 6e 73 69 67   = 0xF0 + (unsig
1040: 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31 38  ned char)((c>>18
1050: 29 20 26 20 30 78 30 37 29 3b 0a 20 20 7a 5b 31  ) & 0x07);.  z[1
1060: 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69  ] = 0x80 + (unsi
1070: 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31  gned char)((c>>1
1080: 32 29 20 26 20 30 78 33 46 29 3b 0a 20 20 7a 5b  2) & 0x3F);.  z[
1090: 32 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73  2] = 0x80 + (uns
10a0: 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e  igned char)((c>>
10b0: 36 29 20 26 20 30 78 33 46 29 3b 0a 20 20 7a 5b  6) & 0x3F);.  z[
10c0: 33 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73  3] = 0x80 + (uns
10d0: 69 67 6e 65 64 20 63 68 61 72 29 28 63 20 26 20  igned char)(c & 
10e0: 30 78 33 46 29 3b 0a 20 20 72 65 74 75 72 6e 20  0x3F);.  return 
10f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  4;.}../*.** Read
1100: 20 61 20 55 54 46 38 20 63 68 61 72 61 63 74 65   a UTF8 characte
1110: 72 20 6f 75 74 20 6f 66 20 7a 5b 5d 20 61 6e 64  r out of z[] and
1120: 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 2a   write it into *
1130: 70 4f 75 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  pOut.  Return.**
1140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1150: 79 74 65 73 20 69 6e 20 7a 5b 5d 20 74 68 61 74  ytes in z[] that
1160: 20 77 65 72 65 20 75 73 65 64 20 74 6f 20 63 6f   were used to co
1170: 6e 73 74 72 75 63 74 20 74 68 65 20 63 68 61 72  nstruct the char
1180: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1190: 20 69 6e 74 20 72 65 61 64 55 74 66 38 28 63 6f   int readUtf8(co
11a0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11b0: 72 20 2a 7a 2c 20 75 6e 73 69 67 6e 65 64 20 2a  r *z, unsigned *
11c0: 70 4f 75 74 29 7b 0a 20 20 73 74 61 74 69 63 20  pOut){.  static 
11d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11e0: 68 61 72 20 76 61 6c 69 64 42 69 74 73 5b 5d 20  har validBits[] 
11f0: 3d 20 7b 0a 20 20 20 20 30 78 30 30 2c 20 30 78  = {.    0x00, 0x
1200: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
1210: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
1220: 2c 20 30 78 30 37 2c 0a 20 20 20 20 30 78 30 38  , 0x07,.    0x08
1230: 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78  , 0x09, 0x0a, 0x
1240: 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20  0b, 0x0c, 0x0d, 
1250: 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 20 20  0x0e, 0x0f,.    
1260: 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78 31 32  0x10, 0x11, 0x12
1270: 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20 30 78  , 0x13, 0x14, 0x
1280: 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37 2c 0a  15, 0x16, 0x17,.
1290: 20 20 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20      0x18, 0x19, 
12a0: 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63  0x1a, 0x1b, 0x1c
12b0: 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78  , 0x1d, 0x1e, 0x
12c0: 31 66 2c 0a 20 20 20 20 30 78 30 30 2c 20 30 78  1f,.    0x00, 0x
12d0: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
12e0: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
12f0: 2c 20 30 78 30 37 2c 0a 20 20 20 20 30 78 30 38  , 0x07,.    0x08
1300: 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78  , 0x09, 0x0a, 0x
1310: 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20  0b, 0x0c, 0x0d, 
1320: 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 20 20  0x0e, 0x0f,.    
1330: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
1340: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
1350: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
1360: 20 20 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20      0x00, 0x01, 
1370: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 30  0x02, 0x03, 0x00
1380: 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78  , 0x01, 0x00, 0x
1390: 30 30 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  00,.  };.  unsig
13a0: 6e 65 64 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20  ned c = z[0];.  
13b0: 69 66 28 20 63 3c 30 78 63 30 20 29 7b 0a 20 20  if( c<0xc0 ){.  
13c0: 20 20 2a 70 4f 75 74 20 3d 20 63 3b 0a 20 20 20    *pOut = c;.   
13d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
13e0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  se{.    int n = 
13f0: 31 3b 0a 20 20 20 20 63 20 3d 20 76 61 6c 69 64  1;.    c = valid
1400: 42 69 74 73 5b 63 2d 30 78 63 30 5d 3b 0a 20 20  Bits[c-0xc0];.  
1410: 20 20 77 68 69 6c 65 28 20 28 7a 5b 6e 5d 20 26    while( (z[n] &
1420: 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a   0xc0)==0x80 ){.
1430: 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29        c = (c<<6)
1440: 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 6e 2b 2b   + (0x3f & z[n++
1450: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
1460: 28 20 63 3c 30 78 38 30 20 7c 7c 20 28 63 26 30  ( c<0x80 || (c&0
1470: 78 46 46 46 46 46 38 30 30 29 3d 3d 30 78 44 38  xFFFFF800)==0xD8
1480: 30 30 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46  00 || (c&0xFFFFF
1490: 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 7b 0a  FFE)==0xFFFE ){.
14a0: 20 20 20 20 20 20 63 20 3d 20 30 78 46 46 46 44        c = 0xFFFD
14b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 4f 75  ;.    }.    *pOu
14c0: 74 20 3d 20 63 3b 0a 20 20 20 20 72 65 74 75 72  t = c;.    retur
14d0: 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n n;.  }.}../*.*
14e0: 2a 20 54 68 65 20 6e 65 78 74 43 68 61 72 43 6f  * The nextCharCo
14f0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
1500: 68 61 73 20 62 65 65 6e 20 73 65 74 20 75 70 2e  has been set up.
1510: 20 20 41 64 64 20 61 6c 6c 20 22 6e 65 78 74 22    Add all "next"
1520: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 74   characters.** t
1530: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  o the result set
1540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1550: 20 66 69 6e 64 4e 65 78 74 43 68 61 72 73 28 6e   findNextChars(n
1560: 65 78 74 43 68 61 72 43 6f 6e 74 65 78 74 20 2a  extCharContext *
1570: 70 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  p){.  unsigned c
1580: 50 72 65 76 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Prev = 0;.  unsi
1590: 67 6e 65 64 20 63 68 61 72 20 7a 50 72 65 76 5b  gned char zPrev[
15a0: 38 5d 3b 0a 20 20 69 6e 74 20 6e 2c 20 72 63 3b  8];.  int n, rc;
15b0: 0a 20 20 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  .  .  for(;;){. 
15c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15d0: 74 65 78 74 28 70 2d 3e 70 53 74 6d 74 2c 20 31  text(p->pStmt, 1
15e0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 50 72 65  , (char*)p->zPre
15f0: 66 69 78 2c 20 70 2d 3e 6e 50 72 65 66 69 78 2c  fix, p->nPrefix,
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1610: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
1620: 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 77  ATIC);.    n = w
1630: 72 69 74 65 55 74 66 38 28 7a 50 72 65 76 2c 20  riteUtf8(zPrev, 
1640: 63 50 72 65 76 2b 31 29 3b 0a 20 20 20 20 73 71  cPrev+1);.    sq
1650: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
1660: 70 2d 3e 70 53 74 6d 74 2c 20 32 2c 20 28 63 68  p->pStmt, 2, (ch
1670: 61 72 2a 29 7a 50 72 65 76 2c 20 6e 2c 20 53 51  ar*)zPrev, n, SQ
1680: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
16a0: 74 65 70 28 70 2d 3e 70 53 74 6d 74 29 3b 0a 20  tep(p->pStmt);. 
16b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16c0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
16d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
16e0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  >pStmt);.      r
16f0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
1700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1710: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ROW ){.      p->
1720: 6f 74 68 65 72 45 72 72 6f 72 20 3d 20 72 63 3b  otherError = rc;
1730: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1740: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1750: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1760: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
1770: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1780: 70 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  p->pStmt, 0);.  
1790: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 4e 65      unsigned cNe
17a0: 78 74 3b 0a 20 20 20 20 20 20 6e 20 3d 20 72 65  xt;.      n = re
17b0: 61 64 55 74 66 38 28 7a 4f 75 74 2b 70 2d 3e 6e  adUtf8(zOut+p->n
17c0: 50 72 65 66 69 78 2c 20 26 63 4e 65 78 74 29 3b  Prefix, &cNext);
17d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
17e0: 65 73 65 74 28 70 2d 3e 70 53 74 6d 74 29 3b 0a  eset(p->pStmt);.
17f0: 20 20 20 20 20 20 6e 65 78 74 43 68 61 72 41 70        nextCharAp
1800: 70 65 6e 64 28 70 2c 20 63 4e 65 78 74 29 3b 0a  pend(p, cNext);.
1810: 20 20 20 20 20 20 63 50 72 65 76 20 3d 20 63 4e        cPrev = cN
1820: 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ext;.      if( p
1830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1840: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1850: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6e 65 78   }.}.../*.** nex
1860: 74 5f 63 68 61 72 61 63 74 65 72 28 41 2c 54 2c  t_character(A,T,
1870: 46 2c 57 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  F,W).**.** Retur
1880: 6e 20 61 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f  n a string compo
1890: 73 74 65 64 20 6f 66 20 61 6c 6c 20 6e 65 78 74  sted of all next
18a0: 20 70 6f 73 73 69 62 6c 65 20 63 68 61 72 61 63   possible charac
18b0: 74 65 72 73 20 61 66 74 65 72 0a 2a 2a 20 41 20  ters after.** A 
18c0: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  for elements of 
18d0: 54 2e 46 2e 20 20 49 66 20 57 20 69 73 20 73 75  T.F.  If W is su
18e0: 70 70 6c 69 65 64 2c 20 74 68 65 6e 20 69 74 20  pplied, then it 
18f0: 69 73 20 61 6e 20 53 51 4c 20 65 78 70 72 65 73  is an SQL expres
1900: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 69 6d  sion.** that lim
1910: 69 74 73 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  its the elements
1920: 20 69 6e 20 54 2e 46 20 74 68 61 74 20 61 72 65   in T.F that are
1930: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
1940: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65 78 74  static void next
1950: 43 68 61 72 46 75 6e 63 28 0a 20 20 73 71 6c 69  CharFunc(.  sqli
1960: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1970: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
1980: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1990: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 6e 65  e **argv.){.  ne
19a0: 78 74 43 68 61 72 43 6f 6e 74 65 78 74 20 63 3b  xtCharContext c;
19b0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
19c0: 64 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d  d char *zTable =
19d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
19e0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
19f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a00: 68 61 72 20 2a 7a 46 69 65 6c 64 20 3d 20 73 71  har *zField = sq
1a10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1a20: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 63 6f 6e  (argv[2]);.  con
1a30: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a40: 20 2a 7a 57 68 65 72 65 3b 0a 20 20 63 6f 6e 73   *zWhere;.  cons
1a50: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a60: 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 0a 20 20 63 68  *zCollName;.  ch
1a70: 61 72 20 2a 7a 57 68 65 72 65 43 6c 61 75 73 65  ar *zWhereClause
1a80: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 43   = 0;.  char *zC
1a90: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  oll = 0;.  char 
1aa0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zSql;.  int rc;
1ab0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 2c 20 30  ..  memset(&c, 0
1ac0: 2c 20 73 69 7a 65 6f 66 28 63 29 29 3b 0a 20 20  , sizeof(c));.  
1ad0: 63 2e 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  c.db = sqlite3_c
1ae0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
1af0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 2e 7a  (context);.  c.z
1b00: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
1b10: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1b20: 5b 30 5d 29 3b 0a 20 20 63 2e 6e 50 72 65 66 69  [0]);.  c.nPrefi
1b30: 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
1b40: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
1b50: 3b 0a 20 20 69 66 28 20 7a 54 61 62 6c 65 3d 3d  ;.  if( zTable==
1b60: 30 20 7c 7c 20 7a 46 69 65 6c 64 3d 3d 30 20 7c  0 || zField==0 |
1b70: 7c 20 63 2e 7a 50 72 65 66 69 78 3d 3d 30 20 29  | c.zPrefix==0 )
1b80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61   return;.  if( a
1b90: 72 67 63 3e 3d 34 0a 20 20 20 26 26 20 28 7a 57  rgc>=4.   && (zW
1ba0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  here = sqlite3_v
1bb0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
1bc0: 5d 29 29 21 3d 30 0a 20 20 20 26 26 20 7a 57 68  ]))!=0.   && zWh
1bd0: 65 72 65 5b 30 5d 21 3d 30 0a 20 20 29 7b 0a 20  ere[0]!=0.  ){. 
1be0: 20 20 20 7a 57 68 65 72 65 43 6c 61 75 73 65 20     zWhereClause 
1bf0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1c00: 66 28 22 41 4e 44 20 28 25 73 29 22 2c 20 7a 57  f("AND (%s)", zW
1c10: 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  here);.    if( z
1c20: 57 68 65 72 65 43 6c 61 75 73 65 3d 3d 30 20 29  WhereClause==0 )
1c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1c40: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
1c50: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
1c60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1c70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 57  .  }else{.    zW
1c80: 68 65 72 65 43 6c 61 75 73 65 20 3d 20 22 22 3b  hereClause = "";
1c90: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e  .  }.  if( argc>
1ca0: 3d 35 0a 20 20 20 26 26 20 28 7a 43 6f 6c 6c 4e  =5.   && (zCollN
1cb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ame = sqlite3_va
1cc0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 34 5d  lue_text(argv[4]
1cd0: 29 29 21 3d 30 0a 20 20 20 26 26 20 7a 43 6f 6c  ))!=0.   && zCol
1ce0: 6c 4e 61 6d 65 5b 30 5d 21 3d 30 20 0a 20 20 29  lName[0]!=0 .  )
1cf0: 7b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  {.    zColl = sq
1d00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
1d10: 6f 6c 6c 61 74 65 20 5c 22 25 77 5c 22 22 2c 20  ollate \"%w\"", 
1d20: 7a 43 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  zCollName);.    
1d30: 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  if( zColl==0 ){.
1d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1d50: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1d60: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
1d70: 20 69 66 28 20 7a 57 68 65 72 65 43 6c 61 75 73   if( zWhereClaus
1d80: 65 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 66  e[0] ) sqlite3_f
1d90: 72 65 65 28 7a 57 68 65 72 65 43 6c 61 75 73 65  ree(zWhereClause
1da0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
1db0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1dc0: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 22 3b 0a      zColl = "";.
1dd0: 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
1de0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1df0: 20 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f    "SELECT %s FRO
1e00: 4d 20 25 73 22 0a 20 20 20 20 22 20 57 48 45 52  M %s".    " WHER
1e10: 45 20 25 73 3e 3d 28 3f 31 20 7c 7c 20 3f 32 29  E %s>=(?1 || ?2)
1e20: 20 25 73 22 0a 20 20 20 20 22 20 20 20 41 4e 44   %s".    "   AND
1e30: 20 25 73 3c 3d 28 3f 31 20 7c 7c 20 63 68 61 72   %s<=(?1 || char
1e40: 28 31 31 31 34 31 31 31 29 29 20 25 73 22 20 2f  (1114111)) %s" /
1e50: 2a 20 31 31 31 34 31 31 31 20 3d 3d 20 30 78 31  * 1114111 == 0x1
1e60: 30 66 66 66 66 20 2a 2f 0a 20 20 20 20 22 20 20  0ffff */.    "  
1e70: 20 25 73 22 0a 20 20 20 20 22 20 4f 52 44 45 52   %s".    " ORDER
1e80: 20 42 59 20 31 20 25 73 20 41 53 43 20 4c 49 4d   BY 1 %s ASC LIM
1e90: 49 54 20 31 22 2c 0a 20 20 20 20 7a 46 69 65 6c  IT 1",.    zFiel
1ea0: 64 2c 20 7a 54 61 62 6c 65 2c 20 7a 46 69 65 6c  d, zTable, zFiel
1eb0: 64 2c 20 7a 43 6f 6c 6c 2c 20 7a 46 69 65 6c 64  d, zColl, zField
1ec0: 2c 20 7a 43 6f 6c 6c 2c 20 7a 57 68 65 72 65 43  , zColl, zWhereC
1ed0: 6c 61 75 73 65 2c 20 7a 43 6f 6c 6c 0a 20 20 29  lause, zColl.  )
1ee0: 3b 0a 20 20 69 66 28 20 7a 57 68 65 72 65 43 6c  ;.  if( zWhereCl
1ef0: 61 75 73 65 5b 30 5d 20 29 20 73 71 6c 69 74 65  ause[0] ) sqlite
1f00: 33 5f 66 72 65 65 28 7a 57 68 65 72 65 43 6c 61  3_free(zWhereCla
1f10: 75 73 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6c  use);.  if( zCol
1f20: 6c 5b 30 5d 20 29 20 73 71 6c 69 74 65 33 5f 66  l[0] ) sqlite3_f
1f30: 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 69 66  ree(zColl);.  if
1f40: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
1f50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f60: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
1f70: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
1f80: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1f90: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1fa0: 28 63 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (c.db, zSql, -1,
1fb0: 20 26 63 2e 70 53 74 6d 74 2c 20 30 29 3b 0a 20   &c.pStmt, 0);. 
1fc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1fd0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ql);.  if( rc ){
1fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1ff0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
2000: 74 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  t, sqlite3_errms
2010: 67 28 63 2e 64 62 29 2c 20 2d 31 29 3b 0a 20 20  g(c.db), -1);.  
2020: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2030: 66 69 6e 64 4e 65 78 74 43 68 61 72 73 28 26 63  findNextChars(&c
2040: 29 3b 0a 20 20 69 66 28 20 63 2e 6d 61 6c 6c 6f  );.  if( c.mallo
2050: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2060: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2070: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
2080: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
2090: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20a0: 70 52 65 73 3b 0a 20 20 20 20 70 52 65 73 20 3d  pRes;.    pRes =
20b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
20c0: 20 63 2e 6e 55 73 65 64 2a 34 20 2b 20 31 20 29   c.nUsed*4 + 1 )
20d0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 3d 3d  ;.    if( pRes==
20e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
20f0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
2100: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
2110: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2120: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
2130: 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  t n = 0;.      f
2140: 6f 72 28 69 3d 30 3b 20 69 3c 63 2e 6e 55 73 65  or(i=0; i<c.nUse
2150: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
2160: 20 6e 20 2b 3d 20 77 72 69 74 65 55 74 66 38 28   n += writeUtf8(
2170: 70 52 65 73 2b 6e 2c 20 63 2e 61 52 65 73 75 6c  pRes+n, c.aResul
2180: 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t[i]);.      }. 
2190: 20 20 20 20 20 70 52 65 73 5b 6e 5d 20 3d 20 30       pRes[n] = 0
21a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
21b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
21c0: 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ext, (const char
21d0: 2a 29 70 52 65 73 2c 20 6e 2c 20 73 71 6c 69 74  *)pRes, n, sqlit
21e0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
21f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
2200: 6e 61 6c 69 7a 65 28 63 2e 70 53 74 6d 74 29 3b  nalize(c.pStmt);
2210: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2220: 63 2e 61 52 65 73 75 6c 74 29 3b 0a 7d 0a 0a 23  c.aResult);.}..#
2230: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
2240: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
2250: 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
2260: 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72 5f 69  lite3_nextchar_i
2270: 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  nit(.  sqlite3 *
2280: 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  db, .  char **pz
2290: 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74  ErrMsg, .  const
22a0: 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
22b0: 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20  tines *pApi.){. 
22c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22d0: 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58  _OK;.  SQLITE_EX
22e0: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41  TENSION_INIT2(pA
22f0: 70 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a 45  pi);.  (void)pzE
2300: 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73 65  rrMsg;  /* Unuse
2310: 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  d parameter */. 
2320: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
2330: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
2340: 2c 20 22 6e 65 78 74 5f 63 68 61 72 22 2c 20 33  , "next_char", 3
2350: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
2360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 6e 65 78 74 43 68 61 72 46 75 6e 63 2c 20 30   nextCharFunc, 0
2390: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
23a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
23c0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
23d0: 2c 20 22 6e 65 78 74 5f 63 68 61 72 22 2c 20 34  , "next_char", 4
23e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
23f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 6e 65 78 74 43 68 61 72 46 75 6e 63 2c     nextCharFunc,
2420: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
2430: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2440: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2450: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
2460: 69 6f 6e 28 64 62 2c 20 22 6e 65 78 74 5f 63 68  ion(db, "next_ch
2470: 61 72 22 2c 20 35 2c 20 53 51 4c 49 54 45 5f 55  ar", 5, SQLITE_U
2480: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 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 6e 65 78 74 43 68 61           nextCha
24b0: 72 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  rFunc, 0, 0);.  
24c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24d0: 0a                                               .