/ Hex Artifact Content
Login

Artifact 143436453bb93e831c9574fea0b9b9eb90e40ff3:


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 32 30 20  llback.c,v 1.20 
0210: 32 30 30 37 2f 30 38 2f 31 36 20 31 30 3a 30 39  2007/08/16 10:09
0220: 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :02 danielk1977 
0230: 45 78 70 20 24 0a 2a 2f 0a 0a 23 69 6e 63 6c 75  Exp $.*/..#inclu
0240: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0250: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0260: 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  he 'collation ne
0270: 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74  eded' callback t
0280: 6f 20 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c  o request a coll
0290: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ation sequence.*
02a0: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
02b0: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
02c0: 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c  of name zName, l
02d0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20  ength nName..** 
02e0: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
02f0: 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61   sequence.*/.sta
0300: 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c  tic void callCol
0310: 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65 33 20  lNeeded(sqlite3 
0320: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
0330: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
0340: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64  e){.  assert( !d
0350: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c  b->xCollNeeded |
0360: 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  | !db->xCollNeed
0370: 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e  ed16 );.  if( nN
0380: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
0390: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
03a0: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
03b0: 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72  eded ){.    char
03c0: 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71   *zExternal = sq
03d0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
03e0: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  b, zName, nName)
03f0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65  ;.    if( !zExte
0400: 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  rnal ) return;. 
0410: 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64     db->xCollNeed
0420: 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  ed(db->pCollNeed
0430: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
0440: 45 4e 43 28 64 62 29 2c 20 7a 45 78 74 65 72 6e  ENC(db), zExtern
0450: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
0460: 5f 66 72 65 65 28 7a 45 78 74 65 72 6e 61 6c 29  _free(zExternal)
0470: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
0480: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
0490: 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e    if( db->xCollN
04a0: 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63  eeded16 ){.    c
04b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65  har const *zExte
04c0: 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  rnal;.    sqlite
04d0: 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20  3_value *pTmp = 
04e0: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
04f0: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
0500: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2c 20  ValueSetStr(db, 
0510: 70 54 6d 70 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  pTmp, nName, zNa
0520: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
0530: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
0540: 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d  .    zExternal =
0550: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
0560: 74 28 64 62 2c 20 70 54 6d 70 2c 20 53 51 4c 49  t(db, pTmp, SQLI
0570: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
0580: 0a 20 20 20 20 69 66 28 20 7a 45 78 74 65 72 6e  .    if( zExtern
0590: 61 6c 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  al ){.      db->
05a0: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62  xCollNeeded16(db
05b0: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
05c0: 2c 20 64 62 2c 20 28 69 6e 74 29 45 4e 43 28 64  , db, (int)ENC(d
05d0: 62 29 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  b), zExternal);.
05e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
05f0: 33 56 61 6c 75 65 46 72 65 65 28 70 54 6d 70 29  3ValueFree(pTmp)
0600: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
0610: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0620: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  ne is called if 
0630: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
0640: 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64  ctory fails to d
0650: 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c  eliver a.** coll
0660: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
0670: 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64  n the best encod
0680: 69 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61  ing but there ma
0690: 79 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69  y be other versi
06a0: 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63  ons.** of this c
06b0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
06c0: 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78  n (for other tex
06d0: 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61  t encodings) ava
06e0: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a  ilable. Use one.
06f0: 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74  ** of these inst
0700: 65 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73  ead if they exis
0710: 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38  t. Avoid a UTF-8
0720: 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76   <-> UTF-16 conv
0730: 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73  ersion if.** pos
0740: 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  sible..*/.static
0750: 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65   int synthCollSe
0760: 71 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 43  q(sqlite3 *db, C
0770: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
0780: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
0790: 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70  2;.  char *z = p
07a0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69  Coll->zName;.  i
07b0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
07c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
07d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
07e0: 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55  c[] = { SQLITE_U
07f0: 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55  TF16BE, SQLITE_U
0800: 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55  TF16LE, SQLITE_U
0810: 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30  TF8 };.  for(i=0
0820: 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
0830: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
0840: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0850: 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20   aEnc[i], z, n, 
0860: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
0870: 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20  l2->xCmp!=0 ){. 
0880: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
0890: 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f  l, pColl2, sizeo
08a0: 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20  f(CollSeq));.   
08b0: 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d     pColl->xDel =
08c0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44   0;         /* D
08d0: 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 64  o not copy the d
08e0: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 20  estructor */.   
08f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0900: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
0910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
0920: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
0930: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
0940: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
0950: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 6c  invoking the col
0960: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 63  lation factory c
0970: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 72 20 73 75  allback.** or su
0980: 62 73 74 69 74 75 74 69 6e 67 20 61 20 63 6f 6c  bstituting a col
0990: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
09a0: 6f 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 65  of a different e
09b0: 6e 63 6f 64 69 6e 67 20 77 68 65 6e 20 74 68 65  ncoding when the
09c0: 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 63 6f  .** requested co
09d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
09e0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
09f0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
0a00: 65 20 6e 61 74 69 76 65 0a 2a 2a 20 65 6e 63 6f  e native.** enco
0a10: 64 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ding..** .** If 
0a20: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
0a30: 74 68 65 6e 20 70 43 6f 6c 6c 20 6d 75 73 74 20  then pColl must 
0a40: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 64 61 74  point to the dat
0a50: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
0a60: 6f 64 69 6e 67 20 0a 2a 2a 20 63 6f 6c 6c 61 74  oding .** collat
0a70: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
0a80: 68 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65  h name zName, le
0a90: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
0aa0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
0ab0: 75 65 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ue is either the
0ac0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0ad0: 6e 63 65 20 74 6f 20 62 65 20 75 73 65 64 20 69  nce to be used i
0ae0: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 64 62  n database.** db
0af0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 74   for collation t
0b00: 79 70 65 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20  ype name zName, 
0b10: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2c 20 6f 72  length nName, or
0b20: 20 4e 55 4c 4c 2c 20 69 66 20 6e 6f 20 63 6f 6c   NULL, if no col
0b30: 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
0b40: 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2e  ce can be found.
0b50: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
0b60: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 0a  ite3GetCollSeq(.
0b70: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
0b80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
0b90: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0ba0: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 6e  *zName, .  int n
0bb0: 4e 61 6d 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name.){.  CollSe
0bc0: 71 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 70 43 6f  q *p;..  p = pCo
0bd0: 6c 6c 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ll;.  if( !p ){.
0be0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46      p = sqlite3F
0bf0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
0c00: 4e 43 28 64 62 29 2c 20 7a 4e 61 6d 65 2c 20 6e  NC(db), zName, n
0c10: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
0c20: 69 66 28 20 21 70 20 7c 7c 20 21 70 2d 3e 78 43  if( !p || !p->xC
0c30: 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  mp ){.    /* No 
0c40: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0c50: 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ce of this type 
0c60: 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e  for this encodin
0c70: 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  g is registered.
0c80: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  .    ** Call the
0c90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
0ca0: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
0cb0: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
0cc0: 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  th one..    */. 
0cd0: 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65     callCollNeede
0ce0: 64 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  d(db, zName, nNa
0cf0: 6d 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  me);.    p = sql
0d00: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
0d10: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 4e 61  db, ENC(db), zNa
0d20: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  me, nName, 0);. 
0d30: 20 7d 0a 20 20 69 66 28 20 70 20 26 26 20 21 70   }.  if( p && !p
0d40: 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74 68 43  ->xCmp && synthC
0d50: 6f 6c 6c 53 65 71 28 64 62 2c 20 70 29 20 29 7b  ollSeq(db, p) ){
0d60: 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a  .    p = 0;.  }.
0d70: 20 20 61 73 73 65 72 74 28 20 21 70 20 7c 7c 20    assert( !p || 
0d80: 70 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 72 65 74  p->xCmp );.  ret
0d90: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
0da0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0db0: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c  called on a coll
0dc0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62  ation sequence b
0dd0: 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64  efore it is used
0de0: 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61   to.** check tha
0df0: 74 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e  t it is defined.
0e00: 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f   An undefined co
0e10: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e20: 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20   exists when.** 
0e30: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  a database is lo
0e40: 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69  aded that contai
0e50: 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ns references to
0e60: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0e70: 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nces.** that hav
0e80: 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e  e not been defin
0e90: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72  ed by sqlite3_cr
0ea0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  eate_collation()
0eb0: 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72   etc..**.** If r
0ec0: 65 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  equired, this ro
0ed0: 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20  utine calls the 
0ee0: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
0ef0: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a  d' callback to.*
0f00: 2a 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69  * request a defi
0f10: 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  nition of the co
0f20: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0f30: 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27  . If this doesn'
0f40: 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65  t work, .** an e
0f50: 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74  quivalent collat
0f60: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61  ing sequence tha
0f70: 74 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e  t uses a text en
0f80: 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74  coding different
0f90: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  .** from the mai
0fa0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75  n database is su
0fb0: 62 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e  bstituted, if on
0fc0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  e is available..
0fd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
0fe0: 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  eckCollSeq(Parse
0ff0: 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
1000: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28  q *pColl){.  if(
1010: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 63 6f   pColl ){.    co
1020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
1030: 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
1040: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
1050: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
1060: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  eq(pParse->db, p
1070: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  Coll, zName, -1)
1080: 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a  ;.    if( !p ){.
1090: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
10a0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
10b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
10d0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
10e0: 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 20 7a  sequence: %s", z
10f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1100: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1110: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
1120: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1130: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1140: 28 20 70 3d 3d 70 43 6f 6c 6c 20 29 3b 0a 20 20  ( p==pColl );.  
1150: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1160: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
1170: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
1180: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
1190: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
11a0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
11b0: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
11c0: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
11d0: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
11e0: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
11f0: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
1200: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
1210: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
1220: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
1230: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
1240: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
1250: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
1260: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
1270: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
1280: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
1290: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
12a0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
12b0: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
12c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
12d0: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
12e0: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
12f0: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
1300: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
1310: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
1320: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1330: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
1340: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
1350: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
1360: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1370: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
1380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
1390: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
13a0: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
13b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
13c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
13d0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 66 69 6e 64  ic CollSeq *find
13e0: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20  CollSeqEntry(.  
13f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
1400: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1410: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
1420: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
1430: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1440: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
1450: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
1460: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
1470: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1480: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
1490: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
14a0: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
14b0: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
14c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
14e0: 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c   3*sizeof(*pColl
14f0: 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b  ) + nName + 1 );
1500: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1510: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1520: 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pDel = 0;.     
1530: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20   pColl[0].zName 
1540: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
1550: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
1560: 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  0].enc = SQLITE_
1570: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c  UTF8;.      pCol
1580: 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[1].zName = (ch
1590: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
15a0: 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e       pColl[1].en
15b0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
15c0: 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  LE;.      pColl[
15d0: 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  2].zName = (char
15e0: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
15f0: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20     pColl[2].enc 
1600: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
1610: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1620: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a  Coll[0].zName, z
1630: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
1640: 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61      pColl[0].zNa
1650: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
1660: 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71 6c 69       pDel = sqli
1670: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
1680: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f  b->aCollSeq, pCo
1690: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61  ll[0].zName, nNa
16a0: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 0a 20 20 20  me, pColl);..   
16b0: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
16c0: 63 28 29 20 66 61 69 6c 75 72 65 20 6f 63 63 75  c() failure occu
16d0: 72 65 64 20 69 6e 20 73 71 6c 69 74 65 33 48 61  red in sqlite3Ha
16e0: 73 68 49 6e 73 65 72 74 28 29 2c 20 69 74 20 77  shInsert(), it w
16f0: 69 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ill .      ** re
1700: 74 75 72 6e 20 74 68 65 20 70 43 6f 6c 6c 20 70  turn the pColl p
1710: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 64 65 6c  ointer to be del
1720: 65 74 65 64 20 28 62 65 63 61 75 73 65 20 69 74  eted (because it
1730: 20 77 61 73 6e 27 74 20 61 64 64 65 64 0a 20 20   wasn't added.  
1740: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61      ** to the ha
1750: 73 68 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 20  sh table)..     
1760: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1770: 28 20 21 70 44 65 6c 20 7c 7c 20 28 64 62 2d 3e  ( !pDel || (db->
1780: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1790: 70 44 65 6c 3d 3d 70 43 6f 6c 6c 29 20 29 3b 0a  pDel==pColl) );.
17a0: 20 20 20 20 20 20 69 66 28 20 70 44 65 6c 20 29        if( pDel )
17b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17c0: 33 5f 66 72 65 65 28 70 44 65 6c 29 3b 0a 20 20  3_free(pDel);.  
17d0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b        pColl = 0;
17e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1800: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  l;.}../*.** Para
1810: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
1820: 74 73 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e  ts to a UTF-8 en
1830: 63 6f 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61  coded string nNa
1840: 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a  me bytes long..*
1850: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c  * Return the Col
1860: 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f  lSeq* pointer fo
1870: 72 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  r the collation 
1880: 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a  sequence named z
1890: 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20  Name.** for the 
18a0: 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66  encoding 'enc' f
18b0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18c0: 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   'db'..**.** If 
18d0: 74 68 65 20 65 6e 74 72 79 20 73 70 65 63 69 66  the entry specif
18e0: 69 65 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ied is not found
18f0: 20 61 6e 64 20 27 63 72 65 61 74 65 27 20 69 73   and 'create' is
1900: 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61   true, then crea
1910: 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72  te a.** new entr
1920: 79 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  y.  Otherwise re
1930: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
1940: 20 41 20 73 65 70 61 72 61 74 65 20 66 75 6e 63   A separate func
1950: 74 69 6f 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61  tion sqlite3Loca
1960: 74 65 43 6f 6c 6c 53 65 71 28 29 20 69 73 20 61  teCollSeq() is a
1970: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a   wrapper around.
1980: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1990: 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43    sqlite3LocateC
19a0: 6f 6c 6c 53 65 71 28 29 20 69 6e 76 6f 6b 65 73  ollSeq() invokes
19b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
19c0: 61 63 74 6f 72 79 0a 2a 2a 20 69 66 20 6e 65 63  actory.** if nec
19d0: 65 73 73 61 72 79 20 61 6e 64 20 67 65 6e 65 72  essary and gener
19e0: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
19f0: 73 73 61 67 65 20 69 66 20 74 68 65 20 63 6f 6c  ssage if the col
1a00: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
1a10: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
1a20: 6e 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  nd..*/.CollSeq *
1a30: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
1a40: 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  eq(.  sqlite3 *d
1a50: 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63  b,.  u8 enc,.  c
1a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1a70: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
1a80: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
1a90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1aa0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
1ab0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 66 69 6e 64      pColl = find
1ac0: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c  CollSeqEntry(db,
1ad0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63   zName, nName, c
1ae0: 72 65 61 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  reate);.  }else{
1af0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  .    pColl = db-
1b00: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a  >pDfltColl;.  }.
1b10: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1b20: 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49  _UTF8==1 && SQLI
1b30: 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26  TE_UTF16LE==2 &&
1b40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d   SQLITE_UTF16BE=
1b50: 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
1b60: 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc>=SQLITE_UTF8
1b70: 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f   && enc<=SQLITE_
1b80: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
1b90: 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b   pColl ) pColl +
1ba0: 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72  = enc-1;.  retur
1bb0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
1bc0: 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20  * Locate a user 
1bd0: 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61  function given a
1be0: 20 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20   name, a number 
1bf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  of arguments and
1c00: 20 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63   a flag.** indic
1c10: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 74 68  ating whether th
1c20: 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65  e function prefe
1c30: 72 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55  rs UTF-16 over U
1c40: 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a  TF-8.  Return a.
1c50: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
1c60: 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  e FuncDef struct
1c70: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
1c80: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20   that function, 
1c90: 6f 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c  or return.** NUL
1ca0: 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  L if the functio
1cb0: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1cc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1cd0: 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65  reateFlag argume
1ce0: 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
1cf0: 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46   a new (blank) F
1d00: 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
1d10: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
1d20: 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68  nd liked into th
1d30: 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65  e "db" structure
1d40: 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63   if a.** no matc
1d50: 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72  hing function pr
1d60: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
1d70: 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c  .  When createFl
1d80: 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e  ag is true.** an
1d90: 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d  d the nArg param
1da0: 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e  eter is -1, then
1db0: 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e   only a function
1dc0: 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a   that accepts.**
1dd0: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61   any number of a
1de0: 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  rguments will be
1df0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1e00: 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
1e10: 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67  s false and nArg
1e20: 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65   is -1, then the
1e30: 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20   first valid.** 
1e40: 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
1e50: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66  s returned.  A f
1e60: 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64  unction is valid
1e70: 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63   if either xFunc
1e80: 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20  .** or xStep is 
1e90: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
1ea0: 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  If createFlag is
1eb0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66   false, then a f
1ec0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
1ed0: 20 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61   required name a
1ee0: 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  nd.** number of 
1ef0: 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65  arguments may be
1f00: 20 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69   returned even i
1f10: 66 20 74 68 65 20 65 54 65 78 74 52 65 70 20 66  f the eTextRep f
1f20: 6c 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  lag does not.** 
1f30: 6d 61 74 63 68 20 74 68 61 74 20 72 65 71 75 65  match that reque
1f40: 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  sted..*/.FuncDef
1f50: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e   *sqlite3FindFun
1f60: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
1f70: 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41   *db,       /* A
1f80: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
1f90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fa0: 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20  *zName, /* Name 
1fb0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  of the function.
1fc0: 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69    Not null-termi
1fd0: 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  nated */.  int n
1fe0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Name,         /*
1ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
2000: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
2010: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2030: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2040: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20  .  -1 means any 
2050: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
2060: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc,            /
2070: 2a 20 50 72 65 66 65 72 72 65 64 20 74 65 78 74  * Preferred text
2080: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
2090: 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20 20 20  nt createFlag   
20a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20    /* Create new 
20b0: 65 6e 74 72 79 20 69 66 20 74 72 75 65 20 61 6e  entry if true an
20c0: 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72  d does not other
20d0: 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b  wise exist */.){
20e0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20  .  FuncDef *p;  
20f0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2100: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2110: 20 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74   FuncDef *pFirst
2120: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75  ;    /* First fu
2130: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73  nction with this
2140: 20 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44   name */.  FuncD
2150: 65 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f  ef *pBest = 0; /
2160: 2a 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75  * Best match fou
2170: 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  nd so far */.  i
2180: 6e 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30  nt bestmatch = 0
2190: 3b 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20  ;  ...  assert( 
21a0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
21b0: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
21c0: 55 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d  UTF16LE || enc==
21d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
21e0: 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20  ;.  if( nArg<-1 
21f0: 29 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20  ) nArg = -1;..  
2200: 70 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65  pFirst = (FuncDe
2210: 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  f*)sqlite3HashFi
2220: 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a  nd(&db->aFunc, z
2230: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
2240: 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b  for(p=pFirst; p;
2250: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
2260: 20 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20    /* During the 
2270: 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 62  search for the b
2280: 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  est function def
2290: 69 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74  inition, bestmat
22a0: 63 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a  ch is set.    **
22b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69   as follows to i
22c0: 6e 64 69 63 61 74 65 20 74 68 65 20 71 75 61 6c  ndicate the qual
22d0: 69 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ity of the match
22e0: 20 77 69 74 68 20 74 68 65 20 64 65 66 69 6e 69   with the defini
22f0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  tion.    ** poin
2300: 74 65 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a  ted to by pBest:
2310: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30  .    **.    ** 0
2320: 3a 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e  : pBest is NULL.
2330: 20 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65   No match has be
2340: 65 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a  en found..    **
2350: 20 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   1: A variable a
2360: 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
2370: 6e 20 74 68 61 74 20 70 72 65 66 65 72 73 20 55  n that prefers U
2380: 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d  TF-8 when a UTF-
2390: 31 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63  16.    **    enc
23a0: 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74  oding is request
23b0: 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
23c0: 61 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76  a..    ** 2: A v
23d0: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
23e0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
23f0: 75 73 65 73 20 55 54 46 2d 31 36 42 45 20 77 68  uses UTF-16BE wh
2400: 65 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20  en UTF-16LE is. 
2410: 20 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74     **    request
2420: 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
2430: 61 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76  a..    ** 3: A v
2440: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
2450: 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  s function using
2460: 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65   the same text e
2470: 6e 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20  ncoding..    ** 
2480: 34 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69  4: A function wi
2490: 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d  th the exact num
24a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
24b0: 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a   requested that.
24c0: 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72      **    prefer
24d0: 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55  s UTF-8 when a U
24e0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69  TF-16 encoding i
24f0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
2500: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
2510: 2a 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e  ** 5: A function
2520: 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74 20   with the exact 
2530: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
2540: 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74 68  nts requested th
2550: 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65  at.    **    pre
2560: 66 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68  fers UTF-16LE wh
2570: 65 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20 72  en UTF-16BE is r
2580: 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63  equested, or vic
2590: 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20  e versa..    ** 
25a0: 36 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63  6: An exact matc
25b0: 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
25c0: 20 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20   A larger value 
25d0: 6f 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69  of 'matchqual' i
25e0: 6e 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20  ndicates a more 
25f0: 64 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e  desirable match.
2600: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2610: 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70  p->nArg==-1 || p
2620: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20  ->nArg==nArg || 
2630: 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  nArg==-1 ){.    
2640: 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b    int match = 1;
2650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2660: 6c 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74  lity of this mat
2670: 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ch */.      if( 
2680: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c  p->nArg==nArg ||
2690: 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20   nArg==-1 ){.   
26a0: 20 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a       match = 4;.
26b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26c0: 28 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45  ( enc==p->iPrefE
26d0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  nc ){.        ma
26e0: 74 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  tch += 2;.      
26f0: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
2700: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
2710: 46 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65  F16LE && p->iPre
2720: 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
2730: 31 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20  16BE) ||.       
2740: 20 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51          (enc==SQ
2750: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 26 26 20  LITE_UTF16BE && 
2760: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c  p->iPrefEnc==SQL
2770: 49 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a  ITE_UTF16LE) ){.
2780: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d          match +=
2790: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
27a0: 20 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73     if( match>bes
27b0: 74 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  tmatch ){.      
27c0: 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20    pBest = p;.   
27d0: 20 20 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d       bestmatch =
27e0: 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a   match;.      }.
27f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2800: 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61  If the createFla
2810: 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  g parameter is t
2820: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61  rue, and the sea
2830: 63 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61  ch did not revea
2840: 6c 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20  l an.  ** exact 
2850: 6d 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61  match for the na
2860: 6d 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  me, number of ar
2870: 67 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f  guments and enco
2880: 64 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61  ding, then add a
2890: 0a 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20  .  ** new entry 
28a0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
28b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e  e and return it.
28c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61  .  */.  if( crea
28d0: 74 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61  teFlag && bestma
28e0: 74 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20  tch<6 && .      
28f0: 28 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33  (pBest = sqlite3
2900: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2910: 20 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b   sizeof(*pBest)+
2920: 6e 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20  nName))!=0 ){.  
2930: 20 20 70 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20    pBest->nArg = 
2940: 6e 41 72 67 3b 0a 20 20 20 20 70 42 65 73 74 2d  nArg;.    pBest-
2950: 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  >pNext = pFirst;
2960: 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50 72 65  .    pBest->iPre
2970: 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20  fEnc = enc;.    
2980: 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e  memcpy(pBest->zN
2990: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
29a0: 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a  e);.    pBest->z
29b0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
29c0: 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 3d 3d  .    if( pBest==
29d0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
29e0: 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65  t(&db->aFunc,pBe
29f0: 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c  st->zName,nName,
2a00: 28 76 6f 69 64 2a 29 70 42 65 73 74 29 20 29 7b  (void*)pBest) ){
2a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2a20: 72 65 65 28 70 42 65 73 74 29 3b 0a 20 20 20 20  ree(pBest);.    
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2a40: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65  }.  }..  if( pBe
2a50: 73 74 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53  st && (pBest->xS
2a60: 74 65 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46  tep || pBest->xF
2a70: 75 6e 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61  unc || createFla
2a80: 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
2a90: 20 70 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65   pBest;.  }.  re
2aa0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2ab0: 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   Free all resour
2ac0: 63 65 73 20 68 65 6c 64 20 62 79 20 74 68 65 20  ces held by the 
2ad0: 73 63 68 65 6d 61 20 73 74 72 75 63 74 75 72 65  schema structure
2ae0: 2e 20 54 68 65 20 76 6f 69 64 2a 20 61 72 67 75  . The void* argu
2af0: 6d 65 6e 74 20 70 6f 69 6e 74 73 0a 2a 2a 20 61  ment points.** a
2b00: 74 20 61 20 53 63 68 65 6d 61 20 73 74 72 75 63  t a Schema struc
2b10: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
2b20: 20 64 6f 65 73 20 6e 6f 74 20 63 61 6c 6c 20 73   does not call s
2b30: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
2b40: 20 74 68 65 20 0a 2a 2a 20 70 6f 69 6e 74 65 72   the .** pointer
2b50: 20 69 74 73 65 6c 66 2c 20 69 74 20 6a 75 73 74   itself, it just
2b60: 20 63 6c 65 61 6e 73 20 75 70 20 73 75 62 73 69   cleans up subsi
2b70: 64 75 61 72 79 20 72 65 73 6f 75 72 63 65 73 20  duary resources 
2b80: 28 69 2e 65 2e 20 74 68 65 20 63 6f 6e 74 65 6e  (i.e. the conten
2b90: 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 73 63 68  ts.** of the sch
2ba0: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 29  ema hash tables)
2bb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2bc0: 33 53 63 68 65 6d 61 46 72 65 65 28 76 6f 69 64  3SchemaFree(void
2bd0: 20 2a 70 29 7b 0a 20 20 48 61 73 68 20 74 65 6d   *p){.  Hash tem
2be0: 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32  p1;.  Hash temp2
2bf0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  ;.  HashElem *pE
2c00: 6c 65 6d 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70  lem;.  Schema *p
2c10: 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61  Schema = (Schema
2c20: 20 2a 29 70 3b 0a 0a 20 20 74 65 6d 70 31 20 3d   *)p;..  temp1 =
2c30: 20 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73   pSchema->tblHas
2c40: 68 3b 0a 20 20 74 65 6d 70 32 20 3d 20 70 53 63  h;.  temp2 = pSc
2c50: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a  hema->trigHash;.
2c60: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
2c70: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  t(&pSchema->trig
2c80: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2c90: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2ca0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2cb0: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
2cc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  );.  sqlite3Hash
2cd0: 43 6c 65 61 72 28 26 70 53 63 68 65 6d 61 2d 3e  Clear(&pSchema->
2ce0: 69 64 78 48 61 73 68 29 3b 0a 20 20 66 6f 72 28  idxHash);.  for(
2cf0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2d00: 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70  First(&temp2); p
2d10: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2d20: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2d30: 29 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  )){.    sqlite3D
2d40: 65 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72  eleteTrigger((Tr
2d50: 69 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73  igger*)sqliteHas
2d60: 68 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20  hData(pElem));. 
2d70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
2d80: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
2d90: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2da0: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
2db0: 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  sh, SQLITE_HASH_
2dc0: 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 66 6f  STRING, 0);.  fo
2dd0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2de0: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
2df0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
2e00: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
2e10: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
2e20: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
2e30: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
2e40: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
2e50: 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 7d  Table(pTab);.  }
2e60: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
2e70: 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 70  ear(&temp1);.  p
2e80: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
2e90: 3d 20 30 3b 0a 20 20 70 53 63 68 65 6d 61 2d 3e  = 0;.  pSchema->
2ea0: 66 6c 61 67 73 20 26 3d 20 7e 44 42 5f 53 63 68  flags &= ~DB_Sch
2eb0: 65 6d 61 4c 6f 61 64 65 64 3b 0a 7d 0a 0a 2f 2a  emaLoaded;.}../*
2ec0: 0a 2a 2a 20 46 69 6e 64 20 61 6e 64 20 72 65 74  .** Find and ret
2ed0: 75 72 6e 20 74 68 65 20 73 63 68 65 6d 61 20 61  urn the schema a
2ee0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
2ef0: 20 42 54 72 65 65 2e 20 20 43 72 65 61 74 65 0a   BTree.  Create.
2f00: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  ** a new one if 
2f10: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 53 63  necessary..*/.Sc
2f20: 68 65 6d 61 20 2a 73 71 6c 69 74 65 33 53 63 68  hema *sqlite3Sch
2f30: 65 6d 61 47 65 74 28 73 71 6c 69 74 65 33 20 2a  emaGet(sqlite3 *
2f40: 64 62 2c 20 42 74 72 65 65 20 2a 70 42 74 29 7b  db, Btree *pBt){
2f50: 0a 20 20 53 63 68 65 6d 61 20 2a 20 70 3b 0a 20  .  Schema * p;. 
2f60: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
2f70: 70 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 73 71  p = (Schema *)sq
2f80: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
2f90: 28 70 42 74 2c 73 69 7a 65 6f 66 28 53 63 68 65  (pBt,sizeof(Sche
2fa0: 6d 61 29 2c 73 71 6c 69 74 65 33 53 63 68 65 6d  ma),sqlite3Schem
2fb0: 61 46 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  aFree);.  }else{
2fc0: 0a 20 20 20 20 70 20 3d 20 28 53 63 68 65 6d 61  .    p = (Schema
2fd0: 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
2fe0: 6f 63 5a 65 72 6f 28 64 62 2c 73 69 7a 65 6f 66  ocZero(db,sizeof
2ff0: 28 53 63 68 65 6d 61 29 29 3b 0a 20 20 7d 0a 20  (Schema));.  }. 
3000: 20 69 66 28 20 70 20 26 26 20 30 3d 3d 70 2d 3e   if( p && 0==p->
3010: 66 69 6c 65 5f 66 6f 72 6d 61 74 20 29 7b 0a 20  file_format ){. 
3020: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
3030: 69 74 28 26 70 2d 3e 74 62 6c 48 61 73 68 2c 20  it(&p->tblHash, 
3040: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
3050: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
3060: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 2d 3e  te3HashInit(&p->
3070: 69 64 78 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  idxHash, SQLITE_
3080: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
3090: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
30a0: 49 6e 69 74 28 26 70 2d 3e 74 72 69 67 48 61 73  Init(&p->trigHas
30b0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
30c0: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
30d0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
30e0: 70 2d 3e 61 46 4b 65 79 2c 20 53 51 4c 49 54 45  p->aFKey, SQLITE
30f0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29  _HASH_STRING, 1)
3100: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 53  ;.    p->enc = S
3110: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 7d 0a  QLITE_UTF8;.  }.
3120: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a          return p;.}.