System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7de67937913c091a39e2f52a6d71d64871855adf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4d 61 79 20 32  /*.** 2005 May 2
0010: 33 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  3 .**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 66 75 6e 63 74  e contains funct
0190: 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 61 63 63  ions used to acc
01a0: 65 73 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ess the internal
01b0: 20 68 61 73 68 20 74 61 62 6c 65 73 0a 2a 2a 20   hash tables.** 
01c0: 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
01d0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 63 6f  functions and co
01e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
01f0: 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 63 61  s..**.** $Id: ca
0200: 6c 6c 62 61 63 6b 2e 63 2c 76 20 31 2e 31 30 20  llback.c,v 1.10 
0210: 32 30 30 36 2f 30 31 2f 31 32 20 32 30 3a 35 34  2006/01/12 20:54
0220: 3a 30 37 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :07 rmsimpson Ex
0230: 70 20 24 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  p $.*/..#include
0240: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0250: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
0260: 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64   'collation need
0270: 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ed' callback to 
0280: 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74  request a collat
0290: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
02a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
02b0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66  text encoding of
02c0: 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e   name zName, len
02d0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66  gth nName..** If
02e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
02f0: 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  equence.*/.stati
0300: 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e  c void callCollN
0310: 65 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a 64  eeded(sqlite3 *d
0320: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0330: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
0340: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  {.  assert( !db-
0350: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20  >xCollNeeded || 
0360: 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64  !db->xCollNeeded
0370: 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  16 );.  if( nNam
0380: 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74  e<0 ) nName = st
0390: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  rlen(zName);.  i
03a0: 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  f( db->xCollNeed
03b0: 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ed ){.    char *
03c0: 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69  zExternal = sqli
03d0: 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c  teStrNDup(zName,
03e0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
03f0: 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65   !zExternal ) re
0400: 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43  turn;.    db->xC
0410: 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43  ollNeeded(db->pC
0420: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62  ollNeededArg, db
0430: 2c 20 28 69 6e 74 29 45 4e 43 28 64 62 29 2c 20  , (int)ENC(db), 
0440: 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20  zExternal);.    
0450: 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65  sqliteFree(zExte
0460: 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rnal);.  }.#ifnd
0470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
0480: 54 46 31 36 0a 20 20 69 66 28 20 64 62 2d 3e 78  TF16.  if( db->x
0490: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a  CollNeeded16 ){.
04a0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
04b0: 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20 73  zExternal;.    s
04c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54  qlite3_value *pT
04d0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  mp = sqlite3Valu
04e0: 65 4e 65 77 28 29 3b 0a 20 20 20 20 73 71 6c 69  eNew();.    sqli
04f0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
0500: 54 6d 70 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  Tmp, nName, zNam
0510: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
0520: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
0530: 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20      zExternal = 
0540: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
0550: 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54  (pTmp, SQLITE_UT
0560: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
0570: 69 66 28 20 7a 45 78 74 65 72 6e 61 6c 20 29 7b  if( zExternal ){
0580: 0a 20 20 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c  .      db->xColl
0590: 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f  Needed16(db->pCo
05a0: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
05b0: 20 28 69 6e 74 29 45 4e 43 28 64 62 29 2c 20 7a   (int)ENC(db), z
05c0: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  External);.    }
05d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
05e0: 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 7d  eFree(pTmp);.  }
05f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
0600: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0610: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63   called if the c
0620: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
0630: 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65   fails to delive
0640: 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  r a.** collation
0650: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
0660: 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62   best encoding b
0670: 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  ut there may be 
0680: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  other versions.*
0690: 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74  * of this collat
06a0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f  ion function (fo
06b0: 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  r other text enc
06c0: 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c  odings) availabl
06d0: 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66  e. Use one.** of
06e0: 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20 69   these instead i
06f0: 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41 76  f they exist. Av
0700: 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20  oid a UTF-8 <-> 
0710: 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f  UTF-16 conversio
0720: 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  n if.** possible
0730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0740: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 73 71 6c  synthCollSeq(sql
0750: 69 74 65 33 20 2a 64 62 2c 20 43 6f 6c 6c 53 65  ite3 *db, CollSe
0760: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c  q *pColl){.  Col
0770: 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20  lSeq *pColl2;.  
0780: 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d  char *z = pColl-
0790: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20  >zName;.  int n 
07a0: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  = strlen(z);.  i
07b0: 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63  nt i;.  static c
07c0: 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d  onst u8 aEnc[] =
07d0: 20 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   { SQLITE_UTF16B
07e0: 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  E, SQLITE_UTF16L
07f0: 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d  E, SQLITE_UTF8 }
0800: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
0810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c  ; i++){.    pCol
0820: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
0830: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63  CollSeq(db, aEnc
0840: 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20  [i], z, n, 0);. 
0850: 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78     if( pColl2->x
0860: 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cmp!=0 ){.      
0870: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43  memcpy(pColl, pC
0880: 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c  oll2, sizeof(Col
0890: 6c 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65  lSeq));.      re
08a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
08b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
08c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
08d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
08e0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
08f0: 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 6f 6b  nsible for invok
0900: 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
0910: 6e 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  n factory callba
0920: 63 6b 0a 2a 2a 20 6f 72 20 73 75 62 73 74 69 74  ck.** or substit
0930: 75 74 69 6e 67 20 61 20 63 6f 6c 6c 61 74 69 6f  uting a collatio
0940: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 61 20  n sequence of a 
0950: 64 69 66 66 65 72 65 6e 74 20 65 6e 63 6f 64 69  different encodi
0960: 6e 67 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 72  ng when the.** r
0970: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
0980: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
0990: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
09a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
09b0: 69 76 65 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 2e  ive.** encoding.
09c0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 69 74 20 69 73  .** .** If it is
09d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
09e0: 70 43 6f 6c 6c 20 6d 75 73 74 20 70 6f 69 6e 74  pColl must point
09f0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a00: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
0a10: 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   .** collation s
0a20: 65 71 75 65 6e 63 65 20 77 69 74 68 20 6e 61 6d  equence with nam
0a30: 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  e zName, length 
0a40: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nName..**.** The
0a50: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
0a60: 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6c 6c   either the coll
0a70: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
0a80: 6f 20 62 65 20 75 73 65 64 20 69 6e 20 64 61 74  o be used in dat
0a90: 61 62 61 73 65 0a 2a 2a 20 64 62 20 66 6f 72 20  abase.** db for 
0aa0: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 6e  collation type n
0ab0: 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ame zName, lengt
0ac0: 68 20 6e 4e 61 6d 65 2c 20 6f 72 20 4e 55 4c 4c  h nName, or NULL
0ad0: 2c 20 69 66 20 6e 6f 20 63 6f 6c 6c 61 74 69 6f  , if no collatio
0ae0: 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
0af0: 6e 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 43  n be found..*/.C
0b00: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 47  ollSeq *sqlite3G
0b10: 65 74 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c  etCollSeq(.  sql
0b20: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 43 6f 6c  ite3* db, .  Col
0b30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 0a 20 20  lSeq *pColl, .  
0b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
0b50: 65 2c 20 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 0a  e, .  int nName.
0b60: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 3b  ){.  CollSeq *p;
0b70: 0a 0a 20 20 70 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ..  p = pColl;. 
0b80: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70   if( !p ){.    p
0b90: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
0ba0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
0bb0: 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  ), zName, nName,
0bc0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21   0);.  }.  if( !
0bd0: 70 20 7c 7c 20 21 70 2d 3e 78 43 6d 70 20 29 7b  p || !p->xCmp ){
0be0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
0bf0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
0c00: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
0c10: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
0c20: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20  registered..    
0c30: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c  ** Call the coll
0c40: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f  ation factory to
0c50: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73   see if it can s
0c60: 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e  upply us with on
0c70: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
0c80: 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2c  llCollNeeded(db,
0c90: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
0ca0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46      p = sqlite3F
0cb0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
0cc0: 4e 43 28 64 62 29 2c 20 7a 4e 61 6d 65 2c 20 6e  NC(db), zName, n
0cd0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
0ce0: 69 66 28 20 70 20 26 26 20 21 70 2d 3e 78 43 6d  if( p && !p->xCm
0cf0: 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65  p && synthCollSe
0d00: 71 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20 20  q(db, p) ){.    
0d10: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  p = 0;.  }.  ass
0d20: 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 78 43  ert( !p || p->xC
0d30: 6d 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mp );.  return p
0d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0d50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0d60: 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  d on a collation
0d70: 20 73 65 71 75 65 6e 63 65 20 62 65 66 6f 72 65   sequence before
0d80: 20 69 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   it is used to.*
0d90: 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  * check that it 
0da0: 69 73 20 64 65 66 69 6e 65 64 2e 20 41 6e 20 75  is defined. An u
0db0: 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69  ndefined collati
0dc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 65 78 69 73  on sequence exis
0dd0: 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74  ts when.** a dat
0de0: 61 62 61 73 65 20 69 73 20 6c 6f 61 64 65 64 20  abase is loaded 
0df0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 72 65  that contains re
0e00: 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c  ferences to coll
0e10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a  ation sequences.
0e20: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74  ** that have not
0e30: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 62 79   been defined by
0e40: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
0e50: 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e  collation() etc.
0e60: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69 72  .**.** If requir
0e70: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
0e80: 20 63 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c   calls the 'coll
0e90: 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61  ation needed' ca
0ea0: 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71  llback to.** req
0eb0: 75 65 73 74 20 61 20 64 65 66 69 6e 69 74 69 6f  uest a definitio
0ec0: 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  n of the collati
0ed0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ng sequence. If 
0ee0: 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77 6f 72  this doesn't wor
0ef0: 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61  k, .** an equiva
0f00: 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  lent collating s
0f10: 65 71 75 65 6e 63 65 20 74 68 61 74 20 75 73 65  equence that use
0f20: 73 20 61 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  s a text encodin
0f30: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  g different.** f
0f40: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61 74  rom the main dat
0f50: 61 62 61 73 65 20 69 73 20 73 75 62 73 74 69 74  abase is substit
0f60: 75 74 65 64 2c 20 69 66 20 6f 6e 65 20 69 73 20  uted, if one is 
0f70: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  available..*/.in
0f80: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  t sqlite3CheckCo
0f90: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0fa0: 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43  rse, CollSeq *pC
0fb0: 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c  oll){.  if( pCol
0fc0: 6c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  l ){.    const c
0fd0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 43 6f  har *zName = pCo
0fe0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43  ll->zName;.    C
0ff0: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69  ollSeq *p = sqli
1000: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1010: 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2c  arse->db, pColl,
1020: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20   zName, -1);.   
1030: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
1040: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1050: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1060: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1070: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1080: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1090: 6e 63 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  nce: %s", zName)
10a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
10c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
10e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d  .    assert( p==
10f0: 70 43 6f 6c 6c 20 29 3b 0a 20 20 7d 0a 20 20 72  pColl );.  }.  r
1100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1110: 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  .}..../*.** Loca
1120: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  te and return an
1130: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
1140: 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  db.aCollSeq hash
1150: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65   table. If the e
1160: 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65  ntry.** specifie
1170: 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e  d by zName and n
1180: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e  Name is not foun
1190: 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  d and parameter 
11a0: 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74  'create' is.** t
11b0: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
11c0: 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74   a new entry. Ot
11d0: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
11e0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ULL..**.** Each 
11f0: 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69  pointer stored i
1200: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43  n the sqlite3.aC
1210: 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c  ollSeq hash tabl
1220: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a  e contains an.**
1230: 20 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20   array of three 
1240: 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72  CollSeq structur
1250: 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73  es. The first is
1260: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1270: 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66  equence.** preff
1280: 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  erred for UTF-8,
1290: 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d   the second UTF-
12a0: 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68  16le, and the th
12b0: 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a  ird UTF-16be..**
12c0: 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64  .** Stored immed
12d0: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
12e0: 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e   three collation
12f0: 20 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20   sequences is a 
1300: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63  copy of.** the c
1310: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1320: 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65  e name. A pointe
1330: 72 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67  r to this string
1340: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
1350: 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   each collation 
1360: 73 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75  sequence structu
1370: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  re..*/.static Co
1380: 6c 6c 53 65 71 20 2a 66 69 6e 64 43 6f 6c 6c 53  llSeq *findCollS
1390: 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74  eqEntry(.  sqlit
13a0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
13b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
13c0: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
13d0: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
13e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
13f0: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
1400: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
1410: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
1420: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
1430: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
1440: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66  e, nName);..  if
1450: 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72  ( 0==pColl && cr
1460: 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  eate ){.    pCol
1470: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
1480: 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  ( 3*sizeof(*pCol
1490: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
14a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
14b0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
14c0: 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
14d0: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
14e0: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
14f0: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
1500: 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [0].enc = SQLITE
1510: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f  _UTF8;.      pCo
1520: 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[1].zName = (c
1530: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
1540: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65        pColl[1].e
1550: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
1560: 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6LE;.      pColl
1570: 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [2].zName = (cha
1580: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
1590: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63      pColl[2].enc
15a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
15b0: 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  E;.      memcpy(
15c0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
15d0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
15e0: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
15f0: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
1600: 20 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71 6c        pDel = sql
1610: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1620: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
1630: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
1640: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 0a 20 20  ame, pColl);..  
1650: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
1660: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 63 63  oc() failure occ
1670: 75 72 65 64 20 69 6e 20 73 71 6c 69 74 65 33 48  ured in sqlite3H
1680: 61 73 68 49 6e 73 65 72 74 28 29 2c 20 69 74 20  ashInsert(), it 
1690: 77 69 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 72  will .      ** r
16a0: 65 74 75 72 6e 20 74 68 65 20 70 43 6f 6c 6c 20  eturn the pColl 
16b0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 64 65  pointer to be de
16c0: 6c 65 74 65 64 20 28 62 65 63 61 75 73 65 20 69  leted (because i
16d0: 74 20 77 61 73 6e 27 74 20 61 64 64 65 64 0a 20  t wasn't added. 
16e0: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 68       ** to the h
16f0: 61 73 68 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  ash table)..    
1700: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
1710: 74 28 20 21 70 44 65 6c 20 7c 7c 0a 20 20 20 20  t( !pDel ||.    
1720: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1730: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
1740: 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  Only()->mallocFa
1750: 69 6c 65 64 20 26 26 20 70 44 65 6c 3d 3d 70 43  iled && pDel==pC
1760: 6f 6c 6c 29 20 29 3b 0a 20 20 20 20 20 20 73 71  oll) );.      sq
1770: 6c 69 74 65 46 72 65 65 28 70 44 65 6c 29 3b 0a  liteFree(pDel);.
1780: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1790: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
17a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
17b0: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55  me points to a U
17c0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
17d0: 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20  ing nName bytes 
17e0: 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  long..** Return 
17f0: 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69  the CollSeq* poi
1800: 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c  nter for the col
1810: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1820: 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66  named zName.** f
1830: 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  or the encoding 
1840: 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64  'enc' from the d
1850: 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a  atabase 'db'..**
1860: 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79  .** If the entry
1870: 20 73 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f   specified is no
1880: 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65  t found and 'cre
1890: 61 74 65 27 20 69 73 20 74 72 75 65 2c 20 74 68  ate' is true, th
18a0: 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e  en create a.** n
18b0: 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72  ew entry.  Other
18c0: 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  wise return NULL
18d0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
18e0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
18f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1900: 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e  .  u8 enc,.  con
1910: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
1920: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69    int nName,.  i
1930: 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43  nt create.){.  C
1940: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1950: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1960: 20 20 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f    pColl = findCo
1970: 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20 7a  llSeqEntry(db, z
1980: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65  Name, nName, cre
1990: 61 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ate);.  }else{. 
19a0: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
19b0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20  DfltColl;.  }.  
19c0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55  assert( SQLITE_U
19d0: 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45  TF8==1 && SQLITE
19e0: 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53  _UTF16LE==2 && S
19f0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33  QLITE_UTF16BE==3
1a00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e   );.  assert( en
1a10: 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26  c>=SQLITE_UTF8 &
1a20: 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54  & enc<=SQLITE_UT
1a30: 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70  F16BE );.  if( p
1a40: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20  Coll ) pColl += 
1a50: 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  enc-1;.  return 
1a60: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
1a70: 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66 75  Locate a user fu
1a80: 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e  nction given a n
1a90: 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f 66  ame, a number of
1aa0: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 61   arguments and a
1ab0: 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61 74   flag.** indicat
1ac0: 69 6e 67 20 77 68 65 74 68 65 72 20 74 68 65 20  ing whether the 
1ad0: 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65 72 73  function prefers
1ae0: 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55 54 46   UTF-16 over UTF
1af0: 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a  -8.  Return a.**
1b00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1b10: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
1b20: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  e that defines t
1b30: 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  hat function, or
1b40: 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20   return.** NULL 
1b50: 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  if the function 
1b60: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
1b70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65  **.** If the cre
1b80: 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  ateFlag argument
1b90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
1ba0: 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e   new (blank) Fun
1bb0: 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72  cDef.** structur
1bc0: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
1bd0: 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20   liked into the 
1be0: 22 64 62 22 20 73 74 72 75 63 74 75 72 65 20 69  "db" structure i
1bf0: 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69  f a.** no matchi
1c00: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76  ng function prev
1c10: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
1c20: 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67   When createFlag
1c30: 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20   is true.** and 
1c40: 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74  the nArg paramet
1c50: 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f  er is -1, then o
1c60: 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  nly a function t
1c70: 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61  hat accepts.** a
1c80: 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ny number of arg
1c90: 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72  uments will be r
1ca0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1cb0: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
1cc0: 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69  false and nArg i
1cd0: 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66  s -1, then the f
1ce0: 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75  irst valid.** fu
1cf0: 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20  nction found is 
1d00: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e  returned.  A fun
1d10: 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69  ction is valid i
1d20: 66 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a  f either xFunc.*
1d30: 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f  * or xStep is no
1d40: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  n-zero..**.** If
1d50: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66   createFlag is f
1d60: 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66 75 6e  alse, then a fun
1d70: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72  ction with the r
1d80: 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61 6e 64  equired name and
1d90: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
1da0: 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 72  guments may be r
1db0: 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69 66 20  eturned even if 
1dc0: 74 68 65 20 65 54 65 78 74 52 65 70 20 66 6c 61  the eTextRep fla
1dd0: 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 61  g does not.** ma
1de0: 74 63 68 20 74 68 61 74 20 72 65 71 75 65 73 74  tch that request
1df0: 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a  ed..*/.FuncDef *
1e00: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1e10: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
1e20: 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  db,       /* An 
1e30: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f  open database */
1e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e50: 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  Name, /* Name of
1e60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
1e70: 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  Not null-termina
1e80: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ted */.  int nNa
1e90: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
1ea0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
1eb0: 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  ers in the name 
1ec0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ee0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
1ef0: 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75   -1 means any nu
1f00: 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e 63  mber */.  u8 enc
1f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f20: 50 72 65 66 65 72 72 65 64 20 74 65 78 74 20 65  Preferred text e
1f30: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
1f40: 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20 20   createFlag     
1f50: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e  /* Create new en
1f60: 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64 20  try if true and 
1f70: 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  does not otherwi
1f80: 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20  se exist */.){. 
1f90: 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20 20 20   FuncDef *p;    
1fa0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
1fb0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46   variable */.  F
1fc0: 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74 3b 20  uncDef *pFirst; 
1fd0: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75 6e 63     /* First func
1fe0: 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20 6e  tion with this n
1ff0: 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ame */.  FuncDef
2000: 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a 20   *pBest = 0; /* 
2010: 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75 6e 64  Best match found
2020: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74   so far */.  int
2030: 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30 3b 20   bestmatch = 0; 
2040: 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e   ...  assert( en
2050: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
2060: 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  | enc==SQLITE_UT
2070: 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51  F16LE || enc==SQ
2080: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
2090: 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29 20    if( nArg<-1 ) 
20a0: 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46  nArg = -1;..  pF
20b0: 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66 2a  irst = (FuncDef*
20c0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
20d0: 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61  (&db->aFunc, zNa
20e0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f  me, nName);.  fo
20f0: 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20 70  r(p=pFirst; p; p
2100: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
2110: 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20 73 65  /* During the se
2120: 61 72 63 68 20 66 6f 72 20 74 68 65 20 62 65 73  arch for the bes
2130: 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  t function defin
2140: 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63 68  ition, bestmatch
2150: 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a 20 61   is set.    ** a
2160: 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e 64  s follows to ind
2170: 69 63 61 74 65 20 74 68 65 20 71 75 61 6c 69 74  icate the qualit
2180: 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20 77  y of the match w
2190: 69 74 68 20 74 68 65 20 64 65 66 69 6e 69 74 69  ith the definiti
21a0: 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  on.    ** pointe
21b0: 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a 0a 20  d to by pBest:. 
21c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a 20     **.    ** 0: 
21d0: 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20 4e  pBest is NULL. N
21e0: 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65 65 6e  o match has been
21f0: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20 31   found..    ** 1
2200: 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67  : A variable arg
2210: 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20  uments function 
2220: 74 68 61 74 20 70 72 65 66 65 72 73 20 55 54 46  that prefers UTF
2230: 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36  -8 when a UTF-16
2240: 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f 64  .    **    encod
2250: 69 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64  ing is requested
2260: 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e  , or vice versa.
2270: 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76 61 72  .    ** 2: A var
2280: 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
2290: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
22a0: 65 73 20 55 54 46 2d 31 36 42 45 20 77 68 65 6e  es UTF-16BE when
22b0: 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20 20 20   UTF-16LE is.   
22c0: 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74 65 64   **    requested
22d0: 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e  , or vice versa.
22e0: 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76 61 72  .    ** 3: A var
22f0: 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
2300: 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74  function using t
2310: 68 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63  he same text enc
2320: 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34 3a  oding..    ** 4:
2330: 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   A function with
2340: 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65   the exact numbe
2350: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72  r of arguments r
2360: 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20 20  equested that.  
2370: 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20    **    prefers 
2380: 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46  UTF-8 when a UTF
2390: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  -16 encoding is 
23a0: 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
23b0: 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
23c0: 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77   5: A function w
23d0: 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75  ith the exact nu
23e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
23f0: 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74  s requested that
2400: 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65  .    **    prefe
2410: 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68 65 6e  rs UTF-16LE when
2420: 20 55 54 46 2d 31 36 42 45 20 69 73 20 72 65 71   UTF-16BE is req
2430: 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
2440: 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36 3a  versa..    ** 6:
2450: 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2e   An exact match.
2460: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
2470: 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20 6f 66   larger value of
2480: 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69 6e 64   'matchqual' ind
2490: 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20 64 65  icates a more de
24a0: 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a 20  sirable match.. 
24b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
24c0: 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d 3e  >nArg==-1 || p->
24d0: 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41  nArg==nArg || nA
24e0: 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  rg==-1 ){.      
24f0: 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b 20 20  int match = 1;  
2500: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 6c 69          /* Quali
2510: 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74 63 68  ty of this match
2520: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
2530: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e  >nArg==nArg || n
2540: 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  Arg==-1 ){.     
2550: 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20 20     match = 4;.  
2560: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2570: 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e 63  enc==p->iPrefEnc
2580: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
2590: 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a  h += 2;.      }.
25a0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28        else if( (
25b0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
25c0: 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45  6LE && p->iPrefE
25d0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
25e0: 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  BE) ||.         
25f0: 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c 49        (enc==SQLI
2600: 54 45 5f 55 54 46 31 36 42 45 20 26 26 20 70 2d  TE_UTF16BE && p-
2610: 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54  >iPrefEnc==SQLIT
2620: 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a 20 20  E_UTF16LE) ){.  
2630: 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 31        match += 1
2640: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2650: 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73 74 6d   if( match>bestm
2660: 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
2670: 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  pBest = p;.     
2680: 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d 20 6d     bestmatch = m
2690: 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  atch;.      }.  
26a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26b0: 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20   the createFlag 
26c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
26d0: 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61 63 68  e, and the seach
26e0: 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61 6c 20   did not reveal 
26f0: 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d 61  an.  ** exact ma
2700: 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61 6d 65  tch for the name
2710: 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  , number of argu
2720: 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64 69  ments and encodi
2730: 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61 0a 20  ng, then add a. 
2740: 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20 74 6f   ** new entry to
2750: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2760: 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 0a 20  and return it.. 
2770: 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74 65   */.  if( create
2780: 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61 74 63  Flag && bestmatc
2790: 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20 28 70  h<6 && .      (p
27a0: 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Best = sqliteMal
27b0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42 65 73  loc(sizeof(*pBes
27c0: 74 29 2b 6e 4e 61 6d 65 29 29 21 3d 30 20 29 7b  t)+nName))!=0 ){
27d0: 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72 67  .    pBest->nArg
27e0: 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42 65   = nArg;.    pBe
27f0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72  st->pNext = pFir
2800: 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 69  st;.    pBest->i
2810: 50 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20  PrefEnc = enc;. 
2820: 20 20 20 6d 65 6d 63 70 79 28 70 42 65 73 74 2d     memcpy(pBest-
2830: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
2840: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 42 65 73 74  Name);.    pBest
2850: 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d  ->zName[nName] =
2860: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
2870: 74 3d 3d 73 71 6c 69 74 65 33 48 61 73 68 49 6e  t==sqlite3HashIn
2880: 73 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c  sert(&db->aFunc,
2890: 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e 61  pBest->zName,nNa
28a0: 6d 65 2c 28 76 6f 69 64 2a 29 70 42 65 73 74 29  me,(void*)pBest)
28b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28c0: 46 72 65 65 28 70 42 65 73 74 29 3b 0a 20 20 20  Free(pBest);.   
28d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
28e0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
28f0: 65 73 74 20 26 26 20 28 70 42 65 73 74 2d 3e 78  est && (pBest->x
2900: 53 74 65 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78  Step || pBest->x
2910: 46 75 6e 63 20 7c 7c 20 63 72 65 61 74 65 46 6c  Func || createFl
2920: 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ag) ){.    retur
2930: 6e 20 70 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72  n pBest;.  }.  r
2940: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.