System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 37bb57ce6cb9ce6e9d8cfc4d80e5f4f5facca1f7:


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 36 20  llback.c,v 1.16 
0210: 32 30 30 36 2f 30 36 2f 30 38 20 30 34 3a 31 39  2006/06/08 04:19
0220: 3a 35 31 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :51 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 20 28 73 71 6c  t( !pDel || (sql
1720: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
1730: 28 29 20 26 26 20 70 44 65 6c 3d 3d 70 43 6f 6c  () && pDel==pCol
1740: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
1750: 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pDel ){.        
1760: 73 71 6c 69 74 65 46 72 65 65 28 70 44 65 6c 29  sqliteFree(pDel)
1770: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
1780: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1790: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17a0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
17b0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
17c0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d  points to a UTF-
17d0: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
17e0: 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e   nName bytes lon
17f0: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  g..** Return the
1800: 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65   CollSeq* pointe
1810: 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  r for the collat
1820: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1830: 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ed zName.** for 
1840: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e  the encoding 'en
1850: 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  c' from the data
1860: 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a  base 'db'..**.**
1870: 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70   If the entry sp
1880: 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66  ecified is not f
1890: 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65  ound and 'create
18a0: 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ' is true, then 
18b0: 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20  create a.** new 
18c0: 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73  entry.  Otherwis
18d0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
18e0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
18f0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20  e3FindCollSeq(. 
1900: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
1910: 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20  u8 enc,.  const 
1920: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
1930: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
1940: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
1950: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
1960: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 70  ( zName ){.    p
1970: 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53  Coll = findCollS
1980: 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d  eqEntry(db, zNam
1990: 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65  e, nName, create
19a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19b0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
19c0: 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  tColl;.  }.  ass
19d0: 65 72 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38  ert( SQLITE_UTF8
19e0: 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54  ==1 && SQLITE_UT
19f0: 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49  F16LE==2 && SQLI
1a00: 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b  TE_UTF16BE==3 );
1a10: 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d  .  assert( enc>=
1a20: 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65  SQLITE_UTF8 && e
1a30: 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc<=SQLITE_UTF16
1a40: 42 45 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  BE );.  if( pCol
1a50: 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63  l ) pColl += enc
1a60: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f  -1;.  return pCo
1a70: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  ll;.}../*.** Loc
1a80: 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  ate a user funct
1a90: 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65  ion given a name
1aa0: 2c 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  , a number of ar
1ab0: 67 75 6d 65 6e 74 73 20 61 6e 64 20 61 20 66 6c  guments and a fl
1ac0: 61 67 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  ag.** indicating
1ad0: 20 77 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   whether the fun
1ae0: 63 74 69 6f 6e 20 70 72 65 66 65 72 73 20 55 54  ction prefers UT
1af0: 46 2d 31 36 20 6f 76 65 72 20 55 54 46 2d 38 2e  F-16 over UTF-8.
1b00: 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f    Return a.** po
1b10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
1b20: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74  cDef structure t
1b30: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 61 74  hat defines that
1b40: 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65   function, or re
1b50: 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20  turn.** NULL if 
1b60: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
1b70: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a  s not exist..**.
1b80: 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61 74 65  ** If the create
1b90: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
1ba0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65   true, then a ne
1bb0: 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65  w (blank) FuncDe
1bc0: 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  f.** structure i
1bd0: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69  s created and li
1be0: 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62  ked into the "db
1bf0: 22 20 73 74 72 75 63 74 75 72 65 20 69 66 20 61  " structure if a
1c00: 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20  .** no matching 
1c10: 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  function previou
1c20: 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57 68  sly existed.  Wh
1c30: 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  en createFlag is
1c40: 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65   true.** and the
1c50: 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72 20   nArg parameter 
1c60: 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79  is -1, then only
1c70: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
1c80: 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20   accepts.** any 
1c90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
1ca0: 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75  nts will be retu
1cb0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  rned..**.** If c
1cc0: 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c  reateFlag is fal
1cd0: 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d  se and nArg is -
1ce0: 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  1, then the firs
1cf0: 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74  t valid.** funct
1d00: 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74  ion found is ret
1d10: 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69  urned.  A functi
1d20: 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20 65  on is valid if e
1d30: 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f  ither xFunc.** o
1d40: 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a  r xStep is non-z
1d50: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72  ero..**.** If cr
1d60: 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73  eateFlag is fals
1d70: 65 2c 20 74 68 65 6e 20 61 20 66 75 6e 63 74 69  e, then a functi
1d80: 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 71 75  on with the requ
1d90: 69 72 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a  ired name and.**
1da0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
1db0: 65 6e 74 73 20 6d 61 79 20 62 65 20 72 65 74 75  ents may be retu
1dc0: 72 6e 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  rned even if the
1dd0: 20 65 54 65 78 74 52 65 70 20 66 6c 61 67 20 64   eTextRep flag d
1de0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68  oes not.** match
1df0: 20 74 68 61 74 20 72 65 71 75 65 73 74 65 64 2e   that requested.
1e00: 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c  .*/.FuncDef *sql
1e10: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1e20: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1e30: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
1e40: 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  n database */.  
1e50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1e60: 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e, /* Name of th
1e70: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74  e function.  Not
1e80: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
1e90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c   */.  int nName,
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1eb0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
1ec0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   in the name */.
1ed0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
1ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ef0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31  f arguments.  -1
1f00: 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65   means any numbe
1f10: 72 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20  r */.  u8 enc,  
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1f30: 66 65 72 72 65 64 20 74 65 78 74 20 65 6e 63 6f  ferred text enco
1f40: 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72  ding */.  int cr
1f50: 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20  eateFlag     /* 
1f60: 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79  Create new entry
1f70: 20 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65   if true and doe
1f80: 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
1f90: 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75  exist */.){.  Fu
1fa0: 6e 63 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20  ncDef *p;       
1fb0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
1fc0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63  riable */.  Func
1fd0: 44 65 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Def *pFirst;    
1fe0: 2f 2a 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f  /* First functio
1ff0: 6e 20 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65  n with this name
2000: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
2010: 42 65 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73  Best = 0; /* Bes
2020: 74 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f  t match found so
2030: 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65   far */.  int be
2040: 73 74 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a  stmatch = 0;  ..
2050: 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d  .  assert( enc==
2060: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
2070: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
2080: 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54  LE || enc==SQLIT
2090: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69  E_UTF16BE );.  i
20a0: 66 28 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72  f( nArg<-1 ) nAr
20b0: 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73  g = -1;..  pFirs
20c0: 74 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71  t = (FuncDef*)sq
20d0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
20e0: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
20f0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70   nName);.  for(p
2100: 3d 70 46 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d  =pFirst; p; p=p-
2110: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
2120: 44 75 72 69 6e 67 20 74 68 65 20 73 65 61 72 63  During the searc
2130: 68 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 66  h for the best f
2140: 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
2150: 6f 6e 2c 20 62 65 73 74 6d 61 74 63 68 20 69 73  on, bestmatch is
2160: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 73 20 66   set.    ** as f
2170: 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63 61  ollows to indica
2180: 74 65 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  te the quality o
2190: 66 20 74 68 65 20 6d 61 74 63 68 20 77 69 74 68  f the match with
21a0: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a   the definition.
21b0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
21c0: 6f 20 62 79 20 70 42 65 73 74 3a 0a 20 20 20 20  o by pBest:.    
21d0: 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42 65  **.    ** 0: pBe
21e0: 73 74 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d  st is NULL. No m
21f0: 61 74 63 68 20 68 61 73 20 62 65 65 6e 20 66 6f  atch has been fo
2200: 75 6e 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41  und..    ** 1: A
2210: 20 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65   variable argume
2220: 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  nts function tha
2230: 74 20 70 72 65 66 65 72 73 20 55 54 46 2d 38 20  t prefers UTF-8 
2240: 77 68 65 6e 20 61 20 55 54 46 2d 31 36 0a 20 20  when a UTF-16.  
2250: 20 20 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67    **    encoding
2260: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f   is requested, o
2270: 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20  r vice versa..  
2280: 20 20 2a 2a 20 32 3a 20 41 20 76 61 72 69 61 62    ** 2: A variab
2290: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e  le arguments fun
22a0: 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ction that uses 
22b0: 55 54 46 2d 31 36 42 45 20 77 68 65 6e 20 55 54  UTF-16BE when UT
22c0: 46 2d 31 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a  F-16LE is.    **
22d0: 20 20 20 20 72 65 71 75 65 73 74 65 64 2c 20 6f      requested, o
22e0: 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20  r vice versa..  
22f0: 20 20 2a 2a 20 33 3a 20 41 20 76 61 72 69 61 62    ** 3: A variab
2300: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e  le arguments fun
2310: 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ction using the 
2320: 73 61 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69  same text encodi
2330: 6e 67 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20  ng..    ** 4: A 
2340: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
2350: 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f  e exact number o
2360: 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75  f arguments requ
2370: 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a  ested that.    *
2380: 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54 46  *    prefers UTF
2390: 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36  -8 when a UTF-16
23a0: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71   encoding is req
23b0: 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
23c0: 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a  versa..    ** 5:
23d0: 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   A function with
23e0: 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65   the exact numbe
23f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72  r of arguments r
2400: 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20 20  equested that.  
2410: 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20    **    prefers 
2420: 55 54 46 2d 31 36 4c 45 20 77 68 65 6e 20 55 54  UTF-16LE when UT
2430: 46 2d 31 36 42 45 20 69 73 20 72 65 71 75 65 73  F-16BE is reques
2440: 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
2450: 73 61 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e  sa..    ** 6: An
2460: 20 65 78 61 63 74 20 6d 61 74 63 68 2e 0a 20 20   exact match..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61    **.    ** A la
2480: 72 67 65 72 20 76 61 6c 75 65 20 6f 66 20 27 6d  rger value of 'm
2490: 61 74 63 68 71 75 61 6c 27 20 69 6e 64 69 63 61  atchqual' indica
24a0: 74 65 73 20 61 20 6d 6f 72 65 20 64 65 73 69 72  tes a more desir
24b0: 61 62 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20 20  able match..    
24c0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41  */.    if( p->nA
24d0: 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72  rg==-1 || p->nAr
24e0: 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d  g==nArg || nArg=
24f0: 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
2500: 20 6d 61 74 63 68 20 3d 20 31 3b 20 20 20 20 20   match = 1;     
2510: 20 20 20 20 20 2f 2a 20 51 75 61 6c 69 74 79 20       /* Quality 
2520: 6f 66 20 74 68 69 73 20 6d 61 74 63 68 20 2a 2f  of this match */
2530: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41  .      if( p->nA
2540: 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67  rg==nArg || nArg
2550: 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ==-1 ){.        
2560: 6d 61 74 63 68 20 3d 20 34 3b 0a 20 20 20 20 20  match = 4;.     
2570: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63   }.      if( enc
2580: 3d 3d 70 2d 3e 69 50 72 65 66 45 6e 63 20 29 7b  ==p->iPrefEnc ){
2590: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b  .        match +
25a0: 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 2;.      }.   
25b0: 20 20 20 65 6c 73 65 20 69 66 28 20 28 65 6e 63     else if( (enc
25c0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
25d0: 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d   && p->iPrefEnc=
25e0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 29  =SQLITE_UTF16BE)
25f0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2600: 20 20 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f     (enc==SQLITE_
2610: 55 54 46 31 36 42 45 20 26 26 20 70 2d 3e 69 50  UTF16BE && p->iP
2620: 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  refEnc==SQLITE_U
2630: 54 46 31 36 4c 45 29 20 29 7b 0a 20 20 20 20 20  TF16LE) ){.     
2640: 20 20 20 6d 61 74 63 68 20 2b 3d 20 31 3b 0a 20     match += 1;. 
2650: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2660: 28 20 6d 61 74 63 68 3e 62 65 73 74 6d 61 74 63  ( match>bestmatc
2670: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 65  h ){.        pBe
2680: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
2690: 62 65 73 74 6d 61 74 63 68 20 3d 20 6d 61 74 63  bestmatch = matc
26a0: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  h;.      }.    }
26b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
26c0: 65 20 63 72 65 61 74 65 46 6c 61 67 20 70 61 72  e createFlag par
26d0: 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20  ameter is true, 
26e0: 61 6e 64 20 74 68 65 20 73 65 61 63 68 20 64 69  and the seach di
26f0: 64 20 6e 6f 74 20 72 65 76 65 61 6c 20 61 6e 0a  d not reveal an.
2700: 20 20 2a 2a 20 65 78 61 63 74 20 6d 61 74 63 68    ** exact match
2710: 20 66 6f 72 20 74 68 65 20 6e 61 6d 65 2c 20 6e   for the name, n
2720: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2730: 74 73 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 2c  ts and encoding,
2740: 20 74 68 65 6e 20 61 64 64 20 61 0a 20 20 2a 2a   then add a.  **
2750: 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
2760: 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  e hash table and
2770: 20 72 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f   return it..  */
2780: 0a 20 20 69 66 28 20 63 72 65 61 74 65 46 6c 61  .  if( createFla
2790: 67 20 26 26 20 62 65 73 74 6d 61 74 63 68 3c 36  g && bestmatch<6
27a0: 20 26 26 20 0a 20 20 20 20 20 20 28 70 42 65 73   && .      (pBes
27b0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
27c0: 28 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b  (sizeof(*pBest)+
27d0: 6e 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20  nName))!=0 ){.  
27e0: 20 20 70 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20    pBest->nArg = 
27f0: 6e 41 72 67 3b 0a 20 20 20 20 70 42 65 73 74 2d  nArg;.    pBest-
2800: 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  >pNext = pFirst;
2810: 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50 72 65  .    pBest->iPre
2820: 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20  fEnc = enc;.    
2830: 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e  memcpy(pBest->zN
2840: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
2850: 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a  e);.    pBest->z
2860: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
2870: 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 3d 3d  .    if( pBest==
2880: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2890: 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65  t(&db->aFunc,pBe
28a0: 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c  st->zName,nName,
28b0: 28 76 6f 69 64 2a 29 70 42 65 73 74 29 20 29 7b  (void*)pBest) ){
28c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
28d0: 65 28 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pBest);.      
28e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
28f0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74    }..  if( pBest
2900: 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65   && (pBest->xSte
2910: 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e  p || pBest->xFun
2920: 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29  c || createFlag)
2930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2940: 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Best;.  }.  retu
2950: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 0;.}../*.** F
2960: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
2970: 73 20 68 65 6c 64 20 62 79 20 74 68 65 20 73 63  s held by the sc
2980: 68 65 6d 61 20 73 74 72 75 63 74 75 72 65 2e 20  hema structure. 
2990: 54 68 65 20 76 6f 69 64 2a 20 61 72 67 75 6d 65  The void* argume
29a0: 6e 74 20 70 6f 69 6e 74 73 0a 2a 2a 20 61 74 20  nt points.** at 
29b0: 61 20 53 63 68 65 6d 61 20 73 74 72 75 63 74 2e  a Schema struct.
29c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
29d0: 6f 65 73 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c  oes not call sql
29e0: 69 74 65 46 72 65 65 28 29 20 6f 6e 20 74 68 65  iteFree() on the
29f0: 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 74 73   .** pointer its
2a00: 65 6c 66 2c 20 69 74 20 6a 75 73 74 20 63 6c 65  elf, it just cle
2a10: 61 6e 73 20 75 70 20 73 75 62 73 69 64 75 61 72  ans up subsiduar
2a20: 79 20 72 65 73 6f 75 72 63 65 73 20 28 69 2e 65  y resources (i.e
2a30: 2e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  . the contents.*
2a40: 2a 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  * of the schema 
2a50: 68 61 73 68 20 74 61 62 6c 65 73 29 2e 0a 2a 2f  hash tables)..*/
2a60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 63 68  .void sqlite3Sch
2a70: 65 6d 61 46 72 65 65 28 76 6f 69 64 20 2a 70 29  emaFree(void *p)
2a80: 7b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a  {.  Hash temp1;.
2a90: 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20    Hash temp2;.  
2aa0: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
2ab0: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
2ac0: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
2ad0: 3b 0a 0a 20 20 74 65 6d 70 31 20 3d 20 70 53 63  ;..  temp1 = pSc
2ae0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
2af0: 20 74 65 6d 70 32 20 3d 20 70 53 63 68 65 6d 61   temp2 = pSchema
2b00: 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 73 71  ->trigHash;.  sq
2b10: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
2b20: 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68  Schema->trigHash
2b30: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2b40: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69  RING, 0);.  sqli
2b50: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 53  te3HashClear(&pS
2b60: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 29 3b 0a 20  chema->aFKey);. 
2b70: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2b80: 72 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  r(&pSchema->idxH
2b90: 61 73 68 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65  ash);.  for(pEle
2ba0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
2bb0: 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d  t(&temp2); pElem
2bc0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
2bd0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
2be0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
2bf0: 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65  eTrigger((Trigge
2c00: 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  r*)sqliteHashDat
2c10: 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20  a(pElem));.  }. 
2c20: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2c30: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c  r(&temp2);.  sql
2c40: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 53  ite3HashInit(&pS
2c50: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2c60: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2c70: 4e 47 2c 20 30 29 3b 0a 20 20 66 6f 72 28 70 45  NG, 0);.  for(pE
2c80: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2c90: 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c  rst(&temp1); pEl
2ca0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
2cb0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
2cc0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2cd0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
2ce0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73  ta(pElem);.    s
2cf0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
2d00: 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  e(0, pTab);.  }.
2d10: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2d20: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 70 53  ar(&temp1);.  pS
2d30: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
2d40: 20 30 3b 0a 20 20 70 53 63 68 65 6d 61 2d 3e 66   0;.  pSchema->f
2d50: 6c 61 67 73 20 26 3d 20 7e 44 42 5f 53 63 68 65  lags &= ~DB_Sche
2d60: 6d 61 4c 6f 61 64 65 64 3b 0a 7d 0a 0a 2f 2a 0a  maLoaded;.}../*.
2d70: 2a 2a 20 46 69 6e 64 20 61 6e 64 20 72 65 74 75  ** Find and retu
2d80: 72 6e 20 74 68 65 20 73 63 68 65 6d 61 20 61 73  rn the schema as
2d90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
2da0: 42 54 72 65 65 2e 20 20 43 72 65 61 74 65 0a 2a  BTree.  Create.*
2db0: 2a 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  * a new one if n
2dc0: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 53 63 68  ecessary..*/.Sch
2dd0: 65 6d 61 20 2a 73 71 6c 69 74 65 33 53 63 68 65  ema *sqlite3Sche
2de0: 6d 61 47 65 74 28 42 74 72 65 65 20 2a 70 42 74  maGet(Btree *pBt
2df0: 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 20 70 3b  ){.  Schema * p;
2e00: 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20  .  if( pBt ){.  
2e10: 20 20 70 20 3d 20 28 53 63 68 65 6d 61 20 2a 29    p = (Schema *)
2e20: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
2e30: 6d 61 28 70 42 74 2c 73 69 7a 65 6f 66 28 53 63  ma(pBt,sizeof(Sc
2e40: 68 65 6d 61 29 2c 73 71 6c 69 74 65 33 53 63 68  hema),sqlite3Sch
2e50: 65 6d 61 46 72 65 65 29 3b 0a 20 20 7d 65 6c 73  emaFree);.  }els
2e60: 65 7b 0a 20 20 20 20 70 20 3d 20 28 53 63 68 65  e{.    p = (Sche
2e70: 6d 61 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ma *)sqliteMallo
2e80: 63 28 73 69 7a 65 6f 66 28 53 63 68 65 6d 61 29  c(sizeof(Schema)
2e90: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 26  );.  }.  if( p &
2ea0: 26 20 30 3d 3d 70 2d 3e 66 69 6c 65 5f 66 6f 72  & 0==p->file_for
2eb0: 6d 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mat ){.    sqlit
2ec0: 65 33 48 61 73 68 49 6e 69 74 28 26 70 2d 3e 74  e3HashInit(&p->t
2ed0: 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  blHash, SQLITE_H
2ee0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
2ef0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2f00: 6e 69 74 28 26 70 2d 3e 69 64 78 48 61 73 68 2c  nit(&p->idxHash,
2f10: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
2f20: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ING, 0);.    sql
2f30: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 2d  ite3HashInit(&p-
2f40: 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54  >trigHash, SQLIT
2f50: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2f60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2f70: 73 68 49 6e 69 74 28 26 70 2d 3e 61 46 4b 65 79  shInit(&p->aFKey
2f80: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2f90: 52 49 4e 47 2c 20 31 29 3b 0a 20 20 20 20 70 2d  RING, 1);.    p-
2fa0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
2fb0: 46 38 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  F8;.  }.  return
2fc0: 20 70 3b 0a 7d 0a                                 p;.}.