/ Hex Artifact Content
Login

Artifact 79cfbac59139b525e3a195ee27b8be1ca06fbd38:


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 38 20 32  llback.c,v 1.8 2
0210: 30 30 36 2f 30 31 2f 30 39 20 30 36 3a 32 39 3a  006/01/09 06:29:
0220: 34 38 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  48 danielk1977 E
0230: 78 70 20 24 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  xp $.*/..#includ
0240: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0250: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
0260: 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  e 'collation nee
0270: 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ded' callback to
0280: 20 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61   request a colla
0290: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a  tion sequence.**
02a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
02b0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f   text encoding o
02c0: 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65  f name zName, le
02d0: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49  ngth nName..** I
02e0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
02f0: 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74  sequence.*/.stat
0300: 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c  ic void callColl
0310: 4e 65 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a  Needed(sqlite3 *
0320: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
0330: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
0340: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ){.  assert( !db
0350: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c  ->xCollNeeded ||
0360: 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65   !db->xCollNeede
0370: 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61  d16 );.  if( nNa
0380: 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73  me<0 ) nName = s
0390: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
03a0: 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  if( db->xCollNee
03b0: 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ded ){.    char 
03c0: 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c  *zExternal = sql
03d0: 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65  iteStrNDup(zName
03e0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
03f0: 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72  ( !zExternal ) r
0400: 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78  eturn;.    db->x
0410: 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70  CollNeeded(db->p
0420: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64  CollNeededArg, d
0430: 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c  b, (int)db->enc,
0440: 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20   zExternal);.   
0450: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74   sqliteFree(zExt
0460: 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23 69 66 6e  ernal);.  }.#ifn
0470: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0480: 55 54 46 31 36 0a 20 20 69 66 28 20 64 62 2d 3e  UTF16.  if( db->
0490: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b  xCollNeeded16 ){
04a0: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
04b0: 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20  *zExternal;.    
04c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
04d0: 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Tmp = sqlite3Val
04e0: 75 65 4e 65 77 28 29 3b 0a 20 20 20 20 73 71 6c  ueNew();.    sql
04f0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
0500: 70 54 6d 70 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  pTmp, nName, zNa
0510: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
0520: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
0530: 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d  .    zExternal =
0540: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
0550: 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55  t(pTmp, SQLITE_U
0560: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
0570: 20 69 66 28 20 7a 45 78 74 65 72 6e 61 6c 20 29   if( zExternal )
0580: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 43 6f 6c  {.      db->xCol
0590: 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43  lNeeded16(db->pC
05a0: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62  ollNeededArg, db
05b0: 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20  , (int)db->enc, 
05c0: 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20  zExternal);.    
05d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
05e0: 75 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  ueFree(pTmp);.  
05f0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
0600: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0610: 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  s called if the 
0620: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
0630: 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76  y fails to deliv
0640: 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f  er a.** collatio
0650: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  n function in th
0660: 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20  e best encoding 
0670: 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  but there may be
0680: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a   other versions.
0690: 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61  ** of this colla
06a0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66  tion function (f
06b0: 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e  or other text en
06c0: 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62  codings) availab
06d0: 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f  le. Use one.** o
06e0: 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20  f these instead 
06f0: 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41  if they exist. A
0700: 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e  void a UTF-8 <->
0710: 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69   UTF-16 conversi
0720: 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c  on if.** possibl
0730: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0740: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 73 71   synthCollSeq(sq
0750: 6c 69 74 65 33 20 2a 64 62 2c 20 43 6f 6c 6c 53  lite3 *db, CollS
0760: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f  eq *pColl){.  Co
0770: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20  llSeq *pColl2;. 
0780: 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c   char *z = pColl
0790: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ->zName;.  int n
07a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
07b0: 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
07c0: 63 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20  const u8 aEnc[] 
07d0: 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36  = { SQLITE_UTF16
07e0: 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  BE, SQLITE_UTF16
07f0: 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20  LE, SQLITE_UTF8 
0800: 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  };.  for(i=0; i<
0810: 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f  3; i++){.    pCo
0820: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ll2 = sqlite3Fin
0830: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e  dCollSeq(db, aEn
0840: 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a  c[i], z, n, 0);.
0850: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e      if( pColl2->
0860: 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  xCmp!=0 ){.     
0870: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70   memcpy(pColl, p
0880: 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f  Coll2, sizeof(Co
0890: 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72  llSeq));.      r
08a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
08b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
08c0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
08d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
08e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
08f0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 6f  onsible for invo
0900: 6b 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  king the collati
0910: 6f 6e 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  on factory callb
0920: 61 63 6b 0a 2a 2a 20 6f 72 20 73 75 62 73 74 69  ack.** or substi
0930: 74 75 74 69 6e 67 20 61 20 63 6f 6c 6c 61 74 69  tuting a collati
0940: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 61  on sequence of a
0950: 20 64 69 66 66 65 72 65 6e 74 20 65 6e 63 6f 64   different encod
0960: 69 6e 67 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ing when the.** 
0970: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
0980: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
0990: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
09b0: 74 69 76 65 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  tive.** encoding
09c0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 69 74 20 69  ..** .** If it i
09d0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
09e0: 20 70 43 6f 6c 6c 20 6d 75 73 74 20 70 6f 69 6e   pColl must poin
09f0: 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
0a00: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
0a10: 67 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20  g .** collation 
0a20: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 6e 61  sequence with na
0a30: 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  me zName, length
0a40: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   nName..**.** Th
0a50: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0a60: 73 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6c  s either the col
0a70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
0a80: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 64 61  to be used in da
0a90: 74 61 62 61 73 65 0a 2a 2a 20 64 62 20 66 6f 72  tabase.** db for
0aa0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
0ab0: 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  name zName, leng
0ac0: 74 68 20 6e 4e 61 6d 65 2c 20 6f 72 20 4e 55 4c  th nName, or NUL
0ad0: 4c 2c 20 69 66 20 6e 6f 20 63 6f 6c 6c 61 74 69  L, if no collati
0ae0: 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63  on.** sequence c
0af0: 61 6e 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  an be found..*/.
0b00: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
0b10: 47 65 74 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71  GetCollSeq(.  sq
0b20: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 43 6f  lite3* db, .  Co
0b30: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 0a 20  llSeq *pColl, . 
0b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0b50: 6d 65 2c 20 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  me, .  int nName
0b60: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
0b70: 3b 0a 0a 20 20 70 20 3d 20 70 43 6f 6c 6c 3b 0a  ;..  p = pColl;.
0b80: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
0b90: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  p = sqlite3FindC
0ba0: 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65  ollSeq(db, db->e
0bb0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
0bc0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
0bd0: 21 70 20 7c 7c 20 21 70 2d 3e 78 43 6d 70 20 29  !p || !p->xCmp )
0be0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c  {.    /* No coll
0bf0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
0c00: 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20  f this type for 
0c10: 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73  this encoding is
0c20: 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20   registered..   
0c30: 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c   ** Call the col
0c40: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74  lation factory t
0c50: 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20  o see if it can 
0c60: 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f  supply us with o
0c70: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ne..    */.    c
0c80: 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62  allCollNeeded(db
0c90: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
0ca0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
0cb0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0cc0: 64 62 2d 3e 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db->enc, zName, 
0cd0: 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  nName, 0);.  }. 
0ce0: 20 69 66 28 20 70 20 26 26 20 21 70 2d 3e 78 43   if( p && !p->xC
0cf0: 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53  mp && synthCollS
0d00: 65 71 28 64 62 2c 20 70 29 20 29 7b 0a 20 20 20  eq(db, p) ){.   
0d10: 20 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73   p = 0;.  }.  as
0d20: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 78  sert( !p || p->x
0d30: 43 6d 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cmp );.  return 
0d40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
0d50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0d60: 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f  ed on a collatio
0d70: 6e 20 73 65 71 75 65 6e 63 65 20 62 65 66 6f 72  n sequence befor
0d80: 65 20 69 74 20 69 73 20 75 73 65 64 20 74 6f 0a  e it is used to.
0d90: 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  ** check that it
0da0: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 41 6e 20   is defined. An 
0db0: 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  undefined collat
0dc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 65 78 69  ion sequence exi
0dd0: 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61  sts when.** a da
0de0: 74 61 62 61 73 65 20 69 73 20 6c 6f 61 64 65 64  tabase is loaded
0df0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 72   that contains r
0e00: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
0e10: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
0e20: 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6e 6f  .** that have no
0e30: 74 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 62  t been defined b
0e40: 79 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  y sqlite3_create
0e50: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63  _collation() etc
0e60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69  ..**.** If requi
0e70: 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
0e80: 65 20 63 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c  e calls the 'col
0e90: 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63  lation needed' c
0ea0: 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65  allback to.** re
0eb0: 71 75 65 73 74 20 61 20 64 65 66 69 6e 69 74 69  quest a definiti
0ec0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
0ed0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 49 66  ing sequence. If
0ee0: 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77 6f   this doesn't wo
0ef0: 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76  rk, .** an equiv
0f00: 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  alent collating 
0f10: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 75 73  sequence that us
0f20: 65 73 20 61 20 74 65 78 74 20 65 6e 63 6f 64 69  es a text encodi
0f30: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
0f40: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61  from the main da
0f50: 74 61 62 61 73 65 20 69 73 20 73 75 62 73 74 69  tabase is substi
0f60: 74 75 74 65 64 2c 20 69 66 20 6f 6e 65 20 69 73  tuted, if one is
0f70: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69   available..*/.i
0f80: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  nt sqlite3CheckC
0f90: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0fa0: 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
0fb0: 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f  Coll){.  if( pCo
0fc0: 6c 6c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ll ){.    const 
0fd0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 43  char *zName = pC
0fe0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
0ff0: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c  CollSeq *p = sql
1000: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
1010: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c  Parse->db, pColl
1020: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  , zName, -1);.  
1030: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
1040: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1050: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
1060: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1070: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1080: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
1090: 65 6e 63 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  ence: %s", zName
10a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
10c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
10e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
10f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
1100: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20  *.** Locate and 
1110: 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20  return an entry 
1120: 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c  from the db.aCol
1130: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e  lSeq hash table.
1140: 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a   If the entry.**
1150: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e   specified by zN
1160: 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73  ame and nName is
1170: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70   not found and p
1180: 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65  arameter 'create
1190: 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  ' is.** true, th
11a0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
11b0: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
11c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
11d0: 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72  .** Each pointer
11e0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
11f0: 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20  qlite3.aCollSeq 
1200: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
1210: 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20  ins an.** array 
1220: 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71  of three CollSeq
1230: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
1240: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f   first is the co
1250: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1260: 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66  .** prefferred f
1270: 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65  or UTF-8, the se
1280: 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61  cond UTF-16le, a
1290: 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46  nd the third UTF
12a0: 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f  -16be..**.** Sto
12b0: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  red immediately 
12c0: 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20  after the three 
12d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12e0: 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ces is a copy of
12f0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  .** the collatio
1300: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e  n sequence name.
1310: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
1320: 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f  is string is sto
1330: 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63  red in.** each c
1340: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1350: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1360: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
1370: 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79  findCollSeqEntry
1380: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1390: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13a0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
13b0: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
13c0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
13d0: 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  oll;.  if( nName
13e0: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
13f0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43  len(zName);.  pC
1400: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
1410: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
1420: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
1430: 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43  e);..  if( 0==pC
1440: 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b  oll && create ){
1450: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1460: 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a  iteMalloc( 3*siz
1470: 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e  eof(*pColl) + nN
1480: 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ame + 1 );.    i
1490: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
14a0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 44 65 6c 20    CollSeq *pDel 
14b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  = 0;.      pColl
14c0: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [0].zName = (cha
14d0: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
14e0: 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63      pColl[0].enc
14f0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
1500: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a        pColl[1].z
1510: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
1520: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
1530: 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51  Coll[1].enc = SQ
1540: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20  LITE_UTF16LE;.  
1550: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61      pColl[2].zNa
1560: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
1570: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
1580: 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[2].enc = SQLI
1590: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20  TE_UTF16BE;.    
15a0: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30    memcpy(pColl[0
15b0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ].zName, zName, 
15c0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  nName);.      pC
15d0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61  oll[0].zName[nNa
15e0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  me] = 0;.      p
15f0: 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Del = sqlite3Has
1600: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f  hInsert(&db->aCo
1610: 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e  llSeq, pColl[0].
1620: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43  zName, nName, pC
1630: 6f 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  oll);..      /* 
1640: 49 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  If a malloc() fa
1650: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 69 6e  ilure occured in
1660: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1670: 72 74 28 29 2c 20 69 74 20 77 69 6c 6c 20 0a 20  rt(), it will . 
1680: 20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74       ** return t
1690: 68 65 20 70 43 6f 6c 6c 20 70 6f 69 6e 74 65 72  he pColl pointer
16a0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 28   to be deleted (
16b0: 62 65 63 61 75 73 65 20 69 74 20 77 61 73 6e 27  because it wasn'
16c0: 74 20 61 64 64 65 64 0a 20 20 20 20 20 20 2a 2a  t added.      **
16d0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
16e0: 6c 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  le)..      */.  
16f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 44 65      assert( !pDe
1700: 6c 20 7c 7c 20 28 73 71 6c 69 74 65 33 54 68 72  l || (sqlite3Thr
1710: 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f  eadData()->mallo
1720: 63 46 61 69 6c 65 64 20 26 26 20 70 44 65 6c 3d  cFailed && pDel=
1730: 3d 70 43 6f 6c 6c 29 20 29 3b 0a 20 20 20 20 20  =pColl) );.     
1740: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 65 6c   sqliteFree(pDel
1750: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1760: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1770: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1780: 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20  zName points to 
1790: 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
17a0: 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74  string nName byt
17b0: 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75  es long..** Retu
17c0: 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20  rn the CollSeq* 
17d0: 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20  pointer for the 
17e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17f0: 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a  ce named zName.*
1800: 2a 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69  * for the encodi
1810: 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68  ng 'enc' from th
1820: 65 20 64 61 74 61 62 61 73 65 20 27 64 62 27 2e  e database 'db'.
1830: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e  .**.** If the en
1840: 74 72 79 20 73 70 65 63 69 66 69 65 64 20 69 73  try specified is
1850: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27   not found and '
1860: 63 72 65 61 74 65 27 20 69 73 20 74 72 75 65 2c  create' is true,
1870: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a   then create a.*
1880: 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74  * new entry.  Ot
1890: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
18a0: 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ULL..*/.CollSeq 
18b0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  *sqlite3FindColl
18c0: 53 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Seq(.  sqlite3 *
18d0: 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  db,.  u8 enc,.  
18e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
18f0: 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a  e,.  int nName,.
1900: 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a    int create.){.
1910: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1920: 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e   = findCollSeqEn
1930: 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  try(db, zName, n
1940: 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20  Name, create);. 
1950: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1960: 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54  UTF8==1 && SQLIT
1970: 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20  E_UTF16LE==2 && 
1980: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d  SQLITE_UTF16BE==
1990: 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  3 );.  assert( e
19a0: 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc>=SQLITE_UTF8 
19b0: 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55  && enc<=SQLITE_U
19c0: 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20  TF16BE );.  if( 
19d0: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d  pColl ) pColl +=
19e0: 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e   enc-1;.  return
19f0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1a00: 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66   Locate a user f
1a10: 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20  unction given a 
1a20: 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f  name, a number o
1a30: 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  f arguments and 
1a40: 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61  a flag.** indica
1a50: 74 69 6e 67 20 77 68 65 74 68 65 72 20 74 68 65  ting whether the
1a60: 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65 72   function prefer
1a70: 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55 54  s UTF-16 over UT
1a80: 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  F-8.  Return a.*
1a90: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
1aa0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
1ab0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  re that defines 
1ac0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  that function, o
1ad0: 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c  r return.** NULL
1ae0: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
1af0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
1b00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72  .**.** If the cr
1b10: 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e  eateFlag argumen
1b20: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
1b30: 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75  a new (blank) Fu
1b40: 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75  ncDef.** structu
1b50: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
1b60: 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65  d liked into the
1b70: 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65 20   "db" structure 
1b80: 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68  if a.** no match
1b90: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65  ing function pre
1ba0: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
1bb0: 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61    When createFla
1bc0: 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64  g is true.** and
1bd0: 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65   the nArg parame
1be0: 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20  ter is -1, then 
1bf0: 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20  only a function 
1c00: 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20  that accepts.** 
1c10: 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  any number of ar
1c20: 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  guments will be 
1c30: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c40: 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  If createFlag is
1c50: 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20   false and nArg 
1c60: 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  is -1, then the 
1c70: 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66  first valid.** f
1c80: 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73  unction found is
1c90: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75   returned.  A fu
1ca0: 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20  nction is valid 
1cb0: 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a  if either xFunc.
1cc0: 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e  ** or xStep is n
1cd0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  on-zero..**.** I
1ce0: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
1cf0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66 75  false, then a fu
1d00: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
1d10: 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61 6e  required name an
1d20: 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61  d.** number of a
1d30: 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 20  rguments may be 
1d40: 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69 66  returned even if
1d50: 20 74 68 65 20 65 54 65 78 74 52 65 70 20 66 6c   the eTextRep fl
1d60: 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d  ag does not.** m
1d70: 61 74 63 68 20 74 68 61 74 20 72 65 71 75 65 73  atch that reques
1d80: 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20  ted..*/.FuncDef 
1d90: 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63  *sqlite3FindFunc
1da0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
1db0: 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e  *db,       /* An
1dc0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a   open database *
1dd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1de0: 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f  zName, /* Name o
1df0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  f the function. 
1e00: 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e   Not null-termin
1e10: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ated */.  int nN
1e20: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ame,         /* 
1e30: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
1e40: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
1e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
1e80: 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e    -1 means any n
1e90: 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e  umber */.  u8 en
1ea0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
1eb0: 20 50 72 65 66 65 72 72 65 64 20 74 65 78 74 20   Preferred text 
1ec0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
1ed0: 74 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20  t createFlag    
1ee0: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65   /* Create new e
1ef0: 6e 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64  ntry if true and
1f00: 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77   does not otherw
1f10: 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a  ise exist */.){.
1f20: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20 20    FuncDef *p;   
1f30: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
1f40: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1f50: 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74 3b  FuncDef *pFirst;
1f60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75 6e      /* First fun
1f70: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20  ction with this 
1f80: 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  name */.  FuncDe
1f90: 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a  f *pBest = 0; /*
1fa0: 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75 6e   Best match foun
1fb0: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e  d so far */.  in
1fc0: 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30 3b  t bestmatch = 0;
1fd0: 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 65    ...  assert( e
1fe0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1ff0: 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  || enc==SQLITE_U
2000: 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53  TF16LE || enc==S
2010: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
2020: 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29  .  if( nArg<-1 )
2030: 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70   nArg = -1;..  p
2040: 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66  First = (FuncDef
2050: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2060: 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e  d(&db->aFunc, zN
2070: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66  ame, nName);.  f
2080: 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20  or(p=pFirst; p; 
2090: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
20a0: 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20 73   /* During the s
20b0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 62 65  earch for the be
20c0: 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  st function defi
20d0: 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63  nition, bestmatc
20e0: 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a 20  h is set.    ** 
20f0: 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e  as follows to in
2100: 64 69 63 61 74 65 20 74 68 65 20 71 75 61 6c 69  dicate the quali
2110: 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20  ty of the match 
2120: 77 69 74 68 20 74 68 65 20 64 65 66 69 6e 69 74  with the definit
2130: 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ion.    ** point
2140: 65 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a 0a  ed to by pBest:.
2150: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a      **.    ** 0:
2160: 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20   pBest is NULL. 
2170: 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65 65  No match has bee
2180: 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20  n found..    ** 
2190: 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61 72  1: A variable ar
21a0: 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e  guments function
21b0: 20 74 68 61 74 20 70 72 65 66 65 72 73 20 55 54   that prefers UT
21c0: 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31  F-8 when a UTF-1
21d0: 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f  6.    **    enco
21e0: 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74 65  ding is requeste
21f0: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
2200: 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76 61  ..    ** 2: A va
2210: 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73  riable arguments
2220: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75   function that u
2230: 73 65 73 20 55 54 46 2d 31 36 42 45 20 77 68 65  ses UTF-16BE whe
2240: 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20 20  n UTF-16LE is.  
2250: 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74 65    **    requeste
2260: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
2270: 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76 61  ..    ** 3: A va
2280: 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73  riable arguments
2290: 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20   function using 
22a0: 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e  the same text en
22b0: 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34  coding..    ** 4
22c0: 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  : A function wit
22d0: 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62  h the exact numb
22e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
22f0: 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20  requested that. 
2300: 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73     **    prefers
2310: 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54   UTF-8 when a UT
2320: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69 73  F-16 encoding is
2330: 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76   requested, or v
2340: 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a  ice versa..    *
2350: 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20  * 5: A function 
2360: 77 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e  with the exact n
2370: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2380: 74 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61  ts requested tha
2390: 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66  t.    **    pref
23a0: 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68 65  ers UTF-16LE whe
23b0: 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20 72 65  n UTF-16BE is re
23c0: 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65  quested, or vice
23d0: 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36   versa..    ** 6
23e0: 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68  : An exact match
23f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2400: 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20 6f  A larger value o
2410: 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69 6e  f 'matchqual' in
2420: 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20 64  dicates a more d
2430: 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a  esirable match..
2440: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2450: 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d  ->nArg==-1 || p-
2460: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e  >nArg==nArg || n
2470: 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  Arg==-1 ){.     
2480: 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b 20   int match = 1; 
2490: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 6c           /* Qual
24a0: 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74 63  ity of this matc
24b0: 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  h */.      if( p
24c0: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20  ->nArg==nArg || 
24d0: 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  nArg==-1 ){.    
24e0: 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20      match = 4;. 
24f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2500: 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e   enc==p->iPrefEn
2510: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74  c ){.        mat
2520: 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  ch += 2;.      }
2530: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
2540: 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  (enc==SQLITE_UTF
2550: 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65 66  16LE && p->iPref
2560: 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  Enc==SQLITE_UTF1
2570: 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  6BE) ||.        
2580: 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c         (enc==SQL
2590: 49 54 45 5f 55 54 46 31 36 42 45 20 26 26 20 70  ITE_UTF16BE && p
25a0: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49  ->iPrefEnc==SQLI
25b0: 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a 20  TE_UTF16LE) ){. 
25c0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20         match += 
25d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
25e0: 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73 74    if( match>best
25f0: 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  match ){.       
2600: 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20   pBest = p;.    
2610: 20 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d 20      bestmatch = 
2620: 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20  match;.      }. 
2630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
2640: 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67  f the createFlag
2650: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
2660: 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61 63  ue, and the seac
2670: 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61 6c  h did not reveal
2680: 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d   an.  ** exact m
2690: 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61 6d  atch for the nam
26a0: 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  e, number of arg
26b0: 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64  uments and encod
26c0: 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61 0a  ing, then add a.
26d0: 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20 74    ** new entry t
26e0: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
26f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 0a   and return it..
2700: 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74    */.  if( creat
2710: 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61 74  eFlag && bestmat
2720: 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20 28  ch<6 && .      (
2730: 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pBest = sqliteMa
2740: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42 65  lloc(sizeof(*pBe
2750: 73 74 29 2b 6e 4e 61 6d 65 29 29 21 3d 30 20 29  st)+nName))!=0 )
2760: 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72  {.    pBest->nAr
2770: 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42  g = nArg;.    pB
2780: 65 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69  est->pNext = pFi
2790: 72 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e  rst;.    pBest->
27a0: 69 50 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a  iPrefEnc = enc;.
27b0: 20 20 20 20 6d 65 6d 63 70 79 28 70 42 65 73 74      memcpy(pBest
27c0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
27d0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 42 65 73  nName);.    pBes
27e0: 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20  t->zName[nName] 
27f0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65  = 0;.    if( pBe
2800: 73 74 3d 3d 73 71 6c 69 74 65 33 48 61 73 68 49  st==sqlite3HashI
2810: 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63  nsert(&db->aFunc
2820: 2c 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e  ,pBest->zName,nN
2830: 61 6d 65 2c 28 76 6f 69 64 2a 29 70 42 65 73 74  ame,(void*)pBest
2840: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2850: 65 46 72 65 65 28 70 42 65 73 74 29 3b 0a 20 20  eFree(pBest);.  
2860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2870: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2880: 42 65 73 74 20 26 26 20 28 70 42 65 73 74 2d 3e  Best && (pBest->
2890: 78 53 74 65 70 20 7c 7c 20 70 42 65 73 74 2d 3e  xStep || pBest->
28a0: 78 46 75 6e 63 20 7c 7c 20 63 72 65 61 74 65 46  xFunc || createF
28b0: 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  lag) ){.    retu
28c0: 72 6e 20 70 42 65 73 74 3b 0a 20 20 7d 0a 20 20  rn pBest;.  }.  
28d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a              return 0;.}.