/ Hex Artifact Content
Login

Artifact a542236a68060caad378efa30006ca46cf77b1b2:


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 32 20  llback.c,v 1.22 
0210: 32 30 30 37 2f 30 38 2f 32 32 20 32 30 3a 31 38  2007/08/22 20:18
0220: 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :22 drh Exp $.*/
0230: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0240: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0250: 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c  Invoke the 'coll
0260: 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61  ation needed' ca
0270: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73  llback to reques
0280: 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  t a collation se
0290: 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65  quence.** in the
02a0: 20 64 61 74 61 62 61 73 65 20 74 65 78 74 20 65   database text e
02b0: 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20  ncoding of name 
02c0: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
02d0: 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ame..** If the c
02e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
02f0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
0300: 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28   callCollNeeded(
0310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
0320: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0330: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73  int nName){.  as
0340: 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c  sert( !db->xColl
0350: 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78  Needed || !db->x
0360: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a  CollNeeded16 );.
0370: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20    if( nName<0 ) 
0380: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
0390: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d  Name);.  if( db-
03a0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a  >xCollNeeded ){.
03b0: 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 65 72      char *zExter
03c0: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  nal = sqlite3DbS
03d0: 74 72 4e 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  trNDup(db, 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 45 4e 43 28 64 62 29 2c  b, (int)ENC(db),
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 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
0460: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 23 69  xternal);.  }.#i
0470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0480: 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20 64 62  T_UTF16.  if( db
0490: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
04a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
04b0: 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20  t *zExternal;.  
04c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
04d0: 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  *pTmp = sqlite3V
04e0: 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
04f0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
0500: 53 74 72 28 70 54 6d 70 2c 20 6e 4e 61 6d 65 2c  Str(pTmp, nName,
0510: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
0520: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
0530: 49 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e  IC);.    zExtern
0540: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
0550: 65 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49  eText(pTmp, SQLI
0560: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
0570: 0a 20 20 20 20 69 66 28 20 7a 45 78 74 65 72 6e  .    if( zExtern
0580: 61 6c 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  al ){.      db->
0590: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62  xCollNeeded16(db
05a0: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
05b0: 2c 20 64 62 2c 20 28 69 6e 74 29 45 4e 43 28 64  , db, (int)ENC(d
05c0: 62 29 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  b), zExternal);.
05d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
05e0: 33 56 61 6c 75 65 46 72 65 65 28 70 54 6d 70 29  3ValueFree(pTmp)
05f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
0600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0610: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  ne is called if 
0620: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
0630: 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64  ctory fails to d
0640: 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c  eliver a.** coll
0650: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
0660: 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64  n the best encod
0670: 69 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61  ing but there ma
0680: 79 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69  y be other versi
0690: 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63  ons.** of this c
06a0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
06b0: 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78  n (for other tex
06c0: 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61  t encodings) ava
06d0: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a  ilable. Use one.
06e0: 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74  ** of these inst
06f0: 65 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73  ead if they exis
0700: 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38  t. Avoid a UTF-8
0710: 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76   <-> UTF-16 conv
0720: 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73  ersion if.** pos
0730: 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  sible..*/.static
0740: 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65   int synthCollSe
0750: 71 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 43  q(sqlite3 *db, C
0760: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
0770: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
0780: 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70  2;.  char *z = p
0790: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69  Coll->zName;.  i
07a0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
07b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
07c0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
07d0: 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55  c[] = { SQLITE_U
07e0: 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55  TF16BE, SQLITE_U
07f0: 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55  TF16LE, SQLITE_U
0800: 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30  TF8 };.  for(i=0
0810: 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
0820: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
0830: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
0840: 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20   aEnc[i], z, n, 
0850: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
0860: 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20  l2->xCmp!=0 ){. 
0870: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
0880: 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f  l, pColl2, sizeo
0890: 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20  f(CollSeq));.   
08a0: 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d     pColl->xDel =
08b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44   0;         /* D
08c0: 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 64  o not copy the d
08d0: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 20  estructor */.   
08e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
08f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
0900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
0910: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
0920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
0930: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
0940: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 6c  invoking the col
0950: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 63  lation factory c
0960: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 72 20 73 75  allback.** or su
0970: 62 73 74 69 74 75 74 69 6e 67 20 61 20 63 6f 6c  bstituting a col
0980: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
0990: 6f 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 65  of a different e
09a0: 6e 63 6f 64 69 6e 67 20 77 68 65 6e 20 74 68 65  ncoding when the
09b0: 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 63 6f  .** requested co
09c0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
09d0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
09e0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
09f0: 65 20 6e 61 74 69 76 65 0a 2a 2a 20 65 6e 63 6f  e native.** enco
0a00: 64 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ding..** .** If 
0a10: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
0a20: 74 68 65 6e 20 70 43 6f 6c 6c 20 6d 75 73 74 20  then pColl must 
0a30: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 64 61 74  point to the dat
0a40: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
0a50: 6f 64 69 6e 67 20 0a 2a 2a 20 63 6f 6c 6c 61 74  oding .** collat
0a60: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
0a70: 68 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65  h name zName, le
0a80: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
0a90: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
0aa0: 75 65 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ue is either the
0ab0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0ac0: 6e 63 65 20 74 6f 20 62 65 20 75 73 65 64 20 69  nce to be used i
0ad0: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 64 62  n database.** db
0ae0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 74   for collation t
0af0: 79 70 65 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20  ype name zName, 
0b00: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2c 20 6f 72  length nName, or
0b10: 20 4e 55 4c 4c 2c 20 69 66 20 6e 6f 20 63 6f 6c   NULL, if no col
0b20: 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
0b30: 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2e  ce can be found.
0b40: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
0b50: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 0a  ite3GetCollSeq(.
0b60: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
0b70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
0b80: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0b90: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 6e  *zName, .  int n
0ba0: 4e 61 6d 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name.){.  CollSe
0bb0: 71 20 2a 70 3b 0a 0a 20 20 70 20 3d 20 70 43 6f  q *p;..  p = pCo
0bc0: 6c 6c 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ll;.  if( !p ){.
0bd0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46      p = sqlite3F
0be0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
0bf0: 4e 43 28 64 62 29 2c 20 7a 4e 61 6d 65 2c 20 6e  NC(db), zName, n
0c00: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
0c10: 69 66 28 20 21 70 20 7c 7c 20 21 70 2d 3e 78 43  if( !p || !p->xC
0c20: 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  mp ){.    /* No 
0c30: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0c40: 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ce of this type 
0c50: 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e  for this encodin
0c60: 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  g is registered.
0c70: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  .    ** Call the
0c80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
0c90: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
0ca0: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
0cb0: 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  th one..    */. 
0cc0: 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65     callCollNeede
0cd0: 64 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  d(db, zName, nNa
0ce0: 6d 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  me);.    p = sql
0cf0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
0d00: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 4e 61  db, ENC(db), zNa
0d10: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  me, nName, 0);. 
0d20: 20 7d 0a 20 20 69 66 28 20 70 20 26 26 20 21 70   }.  if( p && !p
0d30: 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74 68 43  ->xCmp && synthC
0d40: 6f 6c 6c 53 65 71 28 64 62 2c 20 70 29 20 29 7b  ollSeq(db, p) ){
0d50: 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a  .    p = 0;.  }.
0d60: 20 20 61 73 73 65 72 74 28 20 21 70 20 7c 7c 20    assert( !p || 
0d70: 70 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 72 65 74  p->xCmp );.  ret
0d80: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
0d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0da0: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c  called on a coll
0db0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62  ation sequence b
0dc0: 65 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64  efore it is used
0dd0: 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61   to.** check tha
0de0: 74 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e  t it is defined.
0df0: 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f   An undefined co
0e00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e10: 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20   exists when.** 
0e20: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  a database is lo
0e30: 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69  aded that contai
0e40: 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ns references to
0e50: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0e60: 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nces.** that hav
0e70: 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e  e not been defin
0e80: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72  ed by sqlite3_cr
0e90: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  eate_collation()
0ea0: 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72   etc..**.** If r
0eb0: 65 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  equired, this ro
0ec0: 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20  utine calls the 
0ed0: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
0ee0: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a  d' callback to.*
0ef0: 2a 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69  * request a defi
0f00: 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  nition of the co
0f10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0f20: 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27  . If this doesn'
0f30: 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65  t work, .** an e
0f40: 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74  quivalent collat
0f50: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61  ing sequence tha
0f60: 74 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e  t uses a text en
0f70: 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74  coding different
0f80: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  .** from the mai
0f90: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75  n database is su
0fa0: 62 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e  bstituted, if on
0fb0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  e is available..
0fc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
0fd0: 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  eckCollSeq(Parse
0fe0: 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
0ff0: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28  q *pColl){.  if(
1000: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 63 6f   pColl ){.    co
1010: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
1020: 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  = pColl->zName;.
1030: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
1040: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
1050: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  eq(pParse->db, p
1060: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  Coll, zName, -1)
1070: 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a  ;.    if( !p ){.
1080: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1090: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
10a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
10c0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
10d0: 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 20 7a  sequence: %s", z
10e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
10f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1100: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
1110: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1120: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1130: 28 20 70 3d 3d 70 43 6f 6c 6c 20 29 3b 0a 20 20  ( p==pColl );.  
1140: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1150: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
1160: 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75   Locate and retu
1170: 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  rn an entry from
1180: 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71   the db.aCollSeq
1190: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
11a0: 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65  the entry.** spe
11b0: 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20  cified by zName 
11c0: 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74  and nName is not
11d0: 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d   found and param
11e0: 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73  eter 'create' is
11f0: 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63  .** true, then c
1200: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  reate a new entr
1210: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  y. Otherwise ret
1220: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
1230: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f  Each pointer sto
1240: 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  red in the sqlit
1250: 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  e3.aCollSeq hash
1260: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
1270: 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74  an.** array of t
1280: 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72  hree CollSeq str
1290: 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72  uctures. The fir
12a0: 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74  st is the collat
12b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ion sequence.** 
12c0: 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55  prefferred for U
12d0: 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64  TF-8, the second
12e0: 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74   UTF-16le, and t
12f0: 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62  he third UTF-16b
1300: 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20  e..**.** Stored 
1310: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1320: 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c  r the three coll
1330: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
1340: 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  is a copy of.** 
1350: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1360: 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70  quence name. A p
1370: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73  ointer to this s
1380: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
1390: 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61  in.** each colla
13a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74  tion sequence st
13b0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
13c0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 66 69 6e 64  ic CollSeq *find
13d0: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20  CollSeqEntry(.  
13e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
13f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1400: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
1410: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
1420: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1430: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
1440: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
1450: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
1460: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1470: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
1480: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
1490: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
14a0: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
14b0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
14d0: 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c   3*sizeof(*pColl
14e0: 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b  ) + nName + 1 );
14f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1500: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1510: 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pDel = 0;.     
1520: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20   pColl[0].zName 
1530: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
1540: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
1550: 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  0].enc = SQLITE_
1560: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c  UTF8;.      pCol
1570: 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[1].zName = (ch
1580: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
1590: 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e       pColl[1].en
15a0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
15b0: 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  LE;.      pColl[
15c0: 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  2].zName = (char
15d0: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
15e0: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20     pColl[2].enc 
15f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
1600: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1610: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a  Coll[0].zName, z
1620: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
1630: 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61      pColl[0].zNa
1640: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
1650: 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71 6c 69       pDel = sqli
1660: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
1670: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f  b->aCollSeq, pCo
1680: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61  ll[0].zName, nNa
1690: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 0a 20 20 20  me, pColl);..   
16a0: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
16b0: 63 28 29 20 66 61 69 6c 75 72 65 20 6f 63 63 75  c() failure occu
16c0: 72 65 64 20 69 6e 20 73 71 6c 69 74 65 33 48 61  red in sqlite3Ha
16d0: 73 68 49 6e 73 65 72 74 28 29 2c 20 69 74 20 77  shInsert(), it w
16e0: 69 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ill .      ** re
16f0: 74 75 72 6e 20 74 68 65 20 70 43 6f 6c 6c 20 70  turn the pColl p
1700: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 64 65 6c  ointer to be del
1710: 65 74 65 64 20 28 62 65 63 61 75 73 65 20 69 74  eted (because it
1720: 20 77 61 73 6e 27 74 20 61 64 64 65 64 0a 20 20   wasn't added.  
1730: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61      ** to the ha
1740: 73 68 20 74 61 62 6c 65 29 2e 0a 20 20 20 20 20  sh table)..     
1750: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1760: 28 20 70 44 65 6c 3d 3d 30 20 7c 7c 20 70 44 65  ( pDel==0 || pDe
1770: 6c 3d 3d 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  l==pColl );.    
1780: 20 20 69 66 28 20 70 44 65 6c 21 3d 30 20 29 7b    if( pDel!=0 ){
1790: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  .        db->mal
17a0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
17b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
17c0: 72 65 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20  ree(pDel);.     
17d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
17e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17f0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1800: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
1810: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
1820: 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64  to a UTF-8 encod
1830: 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20  ed string nName 
1840: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52  bytes long..** R
1850: 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65  eturn the CollSe
1860: 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74  q* pointer for t
1870: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1880: 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d  uence named zNam
1890: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63  e.** for the enc
18a0: 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d  oding 'enc' from
18b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27 64   the database 'd
18c0: 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  b'..**.** If the
18d0: 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64   entry specified
18e0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
18f0: 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74 72  d 'create' is tr
1900: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
1910: 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20  a.** new entry. 
1920: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
1930: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  n NULL..**.** A 
1940: 73 65 70 61 72 61 74 65 20 66 75 6e 63 74 69 6f  separate functio
1950: 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  n sqlite3LocateC
1960: 6f 6c 6c 53 65 71 28 29 20 69 73 20 61 20 77 72  ollSeq() is a wr
1970: 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20  apper around.** 
1980: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 73  this routine.  s
1990: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
19a0: 53 65 71 28 29 20 69 6e 76 6f 6b 65 73 20 74 68  Seq() invokes th
19b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
19c0: 6f 72 79 0a 2a 2a 20 69 66 20 6e 65 63 65 73 73  ory.** if necess
19d0: 61 72 79 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ary and generate
19e0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
19f0: 67 65 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74  ge if the collat
1a00: 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
1a10: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
1a20: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
1a30: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
1a50: 20 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73    u8 enc,.  cons
1a60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
1a70: 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e   int nName,.  in
1a80: 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f  t create.){.  Co
1a90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1aa0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1ab0: 20 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c   pColl = findCol
1ac0: 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e  lSeqEntry(db, zN
1ad0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61  ame, nName, crea
1ae0: 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1af0: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
1b00: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 61  fltColl;.  }.  a
1b10: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55 54  ssert( SQLITE_UT
1b20: 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f  F8==1 && SQLITE_
1b30: 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53 51  UTF16LE==2 && SQ
1b40: 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33 20  LITE_UTF16BE==3 
1b50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63  );.  assert( enc
1b60: 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26  >=SQLITE_UTF8 &&
1b70: 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54 46   enc<=SQLITE_UTF
1b80: 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70 43  16BE );.  if( pC
1b90: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20 65  oll ) pColl += e
1ba0: 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  nc-1;.  return p
1bb0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Coll;.}../*.** L
1bc0: 6f 63 61 74 65 20 61 20 75 73 65 72 20 66 75 6e  ocate a user fun
1bd0: 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61  ction given a na
1be0: 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f 66 20  me, a number of 
1bf0: 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 61 20  arguments and a 
1c00: 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61 74 69  flag.** indicati
1c10: 6e 67 20 77 68 65 74 68 65 72 20 74 68 65 20 66  ng whether the f
1c20: 75 6e 63 74 69 6f 6e 20 70 72 65 66 65 72 73 20  unction prefers 
1c30: 55 54 46 2d 31 36 20 6f 76 65 72 20 55 54 46 2d  UTF-16 over UTF-
1c40: 38 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20  8.  Return a.** 
1c50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
1c60: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
1c70: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1c80: 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20  at function, or 
1c90: 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69  return.** NULL i
1ca0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
1cb0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
1cc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61  *.** If the crea
1cd0: 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  teFlag argument 
1ce0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
1cf0: 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63  new (blank) Func
1d00: 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  Def.** structure
1d10: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1d20: 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22  liked into the "
1d30: 64 62 22 20 73 74 72 75 63 74 75 72 65 20 69 66  db" structure if
1d40: 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e   a.** no matchin
1d50: 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69  g function previ
1d60: 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20  ously existed.  
1d70: 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20  When createFlag 
1d80: 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74  is true.** and t
1d90: 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65  he nArg paramete
1da0: 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e  r is -1, then on
1db0: 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  ly a function th
1dc0: 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e  at accepts.** an
1dd0: 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  y number of argu
1de0: 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65  ments will be re
1df0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1e00: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66   createFlag is f
1e10: 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73  alse and nArg is
1e20: 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69   -1, then the fi
1e30: 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e  rst valid.** fun
1e40: 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72  ction found is r
1e50: 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63  eturned.  A func
1e60: 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66  tion is valid if
1e70: 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a   either xFunc.**
1e80: 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e   or xStep is non
1e90: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -zero..**.** If 
1ea0: 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61  createFlag is fa
1eb0: 6c 73 65 2c 20 74 68 65 6e 20 61 20 66 75 6e 63  lse, then a func
1ec0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
1ed0: 71 75 69 72 65 64 20 6e 61 6d 65 20 61 6e 64 0a  quired name and.
1ee0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ** number of arg
1ef0: 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 72 65  uments may be re
1f00: 74 75 72 6e 65 64 20 65 76 65 6e 20 69 66 20 74  turned even if t
1f10: 68 65 20 65 54 65 78 74 52 65 70 20 66 6c 61 67  he eTextRep flag
1f20: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74   does not.** mat
1f30: 63 68 20 74 68 61 74 20 72 65 71 75 65 73 74 65  ch that requeste
1f40: 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73  d..*/.FuncDef *s
1f50: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1f60: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
1f70: 62 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  b,       /* An o
1f80: 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
1f90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1fa0: 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame, /* Name of 
1fb0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e  the function.  N
1fc0: 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  ot null-terminat
1fd0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ed */.  int nNam
1fe0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e,         /* Nu
1ff0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
2000: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
2010: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2020: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2030: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
2040: 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d  -1 means any num
2050: 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c  ber */.  u8 enc,
2060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2070: 72 65 66 65 72 72 65 64 20 74 65 78 74 20 65 6e  referred text en
2080: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
2090: 63 72 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f  createFlag     /
20a0: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74  * Create new ent
20b0: 72 79 20 69 66 20 74 72 75 65 20 61 6e 64 20 64  ry if true and d
20c0: 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73  oes not otherwis
20d0: 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  e exist */.){.  
20e0: 46 75 6e 63 44 65 66 20 2a 70 3b 20 20 20 20 20  FuncDef *p;     
20f0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2100: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 75  variable */.  Fu
2110: 6e 63 44 65 66 20 2a 70 46 69 72 73 74 3b 20 20  ncDef *pFirst;  
2120: 20 20 2f 2a 20 46 69 72 73 74 20 66 75 6e 63 74    /* First funct
2130: 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20 6e 61  ion with this na
2140: 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20  me */.  FuncDef 
2150: 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a 20 42  *pBest = 0; /* B
2160: 65 73 74 20 6d 61 74 63 68 20 66 6f 75 6e 64 20  est match found 
2170: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20  so far */.  int 
2180: 62 65 73 74 6d 61 74 63 68 20 3d 20 30 3b 20 20  bestmatch = 0;  
2190: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63  ...  assert( enc
21a0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
21b0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
21c0: 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c  16LE || enc==SQL
21d0: 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20  ITE_UTF16BE );. 
21e0: 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29 20 6e   if( nArg<-1 ) n
21f0: 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46 69  Arg = -1;..  pFi
2200: 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  rst = (FuncDef*)
2210: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2220: 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d  &db->aFunc, zNam
2230: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  e, nName);.  for
2240: 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20 70 3d  (p=pFirst; p; p=
2250: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  p->pNext){.    /
2260: 2a 20 44 75 72 69 6e 67 20 74 68 65 20 73 65 61  * During the sea
2270: 72 63 68 20 66 6f 72 20 74 68 65 20 62 65 73 74  rch for the best
2280: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
2290: 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63 68 20  tion, bestmatch 
22a0: 69 73 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 73  is set.    ** as
22b0: 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e 64 69   follows to indi
22c0: 63 61 74 65 20 74 68 65 20 71 75 61 6c 69 74 79  cate the quality
22d0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20 77 69   of the match wi
22e0: 74 68 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  th the definitio
22f0: 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  n.    ** pointed
2300: 20 74 6f 20 62 79 20 70 42 65 73 74 3a 0a 20 20   to by pBest:.  
2310: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a 20 70    **.    ** 0: p
2320: 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f  Best is NULL. No
2330: 20 6d 61 74 63 68 20 68 61 73 20 62 65 65 6e 20   match has been 
2340: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20 31 3a  found..    ** 1:
2350: 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75   A variable argu
2360: 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 74  ments function t
2370: 68 61 74 20 70 72 65 66 65 72 73 20 55 54 46 2d  hat prefers UTF-
2380: 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 0a  8 when a UTF-16.
2390: 20 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f 64 69      **    encodi
23a0: 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ng is requested,
23b0: 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
23c0: 20 20 20 20 2a 2a 20 32 3a 20 41 20 76 61 72 69      ** 2: A vari
23d0: 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66  able arguments f
23e0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65  unction that use
23f0: 73 20 55 54 46 2d 31 36 42 45 20 77 68 65 6e 20  s UTF-16BE when 
2400: 55 54 46 2d 31 36 4c 45 20 69 73 0a 20 20 20 20  UTF-16LE is.    
2410: 2a 2a 20 20 20 20 72 65 71 75 65 73 74 65 64 2c  **    requested,
2420: 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
2430: 20 20 20 20 2a 2a 20 33 3a 20 41 20 76 61 72 69      ** 3: A vari
2440: 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66  able arguments f
2450: 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  unction using th
2460: 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63 6f  e same text enco
2470: 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34 3a 20  ding..    ** 4: 
2480: 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  A function with 
2490: 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72  the exact number
24a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65   of arguments re
24b0: 71 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20  quested that.   
24c0: 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55   **    prefers U
24d0: 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d  TF-8 when a UTF-
24e0: 31 36 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  16 encoding is r
24f0: 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63  equested, or vic
2500: 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20  e versa..    ** 
2510: 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69  5: A function wi
2520: 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d  th the exact num
2530: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2540: 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a   requested that.
2550: 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72      **    prefer
2560: 73 20 55 54 46 2d 31 36 4c 45 20 77 68 65 6e 20  s UTF-16LE when 
2570: 55 54 46 2d 31 36 42 45 20 69 73 20 72 65 71 75  UTF-16BE is requ
2580: 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76  ested, or vice v
2590: 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36 3a 20  ersa..    ** 6: 
25a0: 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2e 0a  An exact match..
25b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
25c0: 6c 61 72 67 65 72 20 76 61 6c 75 65 20 6f 66 20  larger value of 
25d0: 27 6d 61 74 63 68 71 75 61 6c 27 20 69 6e 64 69  'matchqual' indi
25e0: 63 61 74 65 73 20 61 20 6d 6f 72 65 20 64 65 73  cates a more des
25f0: 69 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a 20 20  irable match..  
2600: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
2610: 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e  nArg==-1 || p->n
2620: 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72  Arg==nArg || nAr
2630: 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  g==-1 ){.      i
2640: 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b 20 20 20  nt match = 1;   
2650: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 6c 69 74         /* Qualit
2660: 79 20 6f 66 20 74 68 69 73 20 6d 61 74 63 68 20  y of this match 
2670: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
2680: 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41  nArg==nArg || nA
2690: 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  rg==-1 ){.      
26a0: 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20 20 20    match = 4;.   
26b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
26c0: 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e 63 20  nc==p->iPrefEnc 
26d0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68  ){.        match
26e0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20   += 2;.      }. 
26f0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 65       else if( (e
2700: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
2710: 4c 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e  LE && p->iPrefEn
2720: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
2730: 45 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  E) ||.          
2740: 20 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c 49 54       (enc==SQLIT
2750: 45 5f 55 54 46 31 36 42 45 20 26 26 20 70 2d 3e  E_UTF16BE && p->
2760: 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45  iPrefEnc==SQLITE
2770: 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a 20 20 20  _UTF16LE) ){.   
2780: 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 31 3b       match += 1;
2790: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27a0: 69 66 28 20 6d 61 74 63 68 3e 62 65 73 74 6d 61  if( match>bestma
27b0: 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tch ){.        p
27c0: 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Best = p;.      
27d0: 20 20 62 65 73 74 6d 61 74 63 68 20 3d 20 6d 61    bestmatch = ma
27e0: 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tch;.      }.   
27f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2800: 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 70  the createFlag p
2810: 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
2820: 2c 20 61 6e 64 20 74 68 65 20 73 65 61 63 68 20  , and the seach 
2830: 64 69 64 20 6e 6f 74 20 72 65 76 65 61 6c 20 61  did not reveal a
2840: 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d 61 74  n.  ** exact mat
2850: 63 68 20 66 6f 72 20 74 68 65 20 6e 61 6d 65 2c  ch for the name,
2860: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
2870: 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64 69 6e  ents and encodin
2880: 67 2c 20 74 68 65 6e 20 61 64 64 20 61 0a 20 20  g, then add a.  
2890: 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20  ** new entry to 
28a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61  the hash table a
28b0: 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 0a 20 20  nd return it..  
28c0: 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74 65 46  */.  if( createF
28d0: 6c 61 67 20 26 26 20 62 65 73 74 6d 61 74 63 68  lag && bestmatch
28e0: 3c 36 20 26 26 20 0a 20 20 20 20 20 20 28 70 42  <6 && .      (pB
28f0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  est = sqlite3DbM
2900: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2910: 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e 61  zeof(*pBest)+nNa
2920: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  me))!=0 ){.    p
2930: 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72  Best->nArg = nAr
2940: 67 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e  g;.    pBest->pN
2950: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
2960: 20 20 70 42 65 73 74 2d 3e 69 50 72 65 66 45 6e    pBest->iPrefEn
2970: 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20 6d 65 6d  c = enc;.    mem
2980: 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e 61 6d 65  cpy(pBest->zName
2990: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
29a0: 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  .    pBest->zNam
29b0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
29c0: 20 20 69 66 28 20 70 42 65 73 74 3d 3d 73 71 6c    if( pBest==sql
29d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
29e0: 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65 73 74 2d  db->aFunc,pBest-
29f0: 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c 28 76 6f  >zName,nName,(vo
2a00: 69 64 2a 29 70 42 65 73 74 29 20 29 7b 0a 20 20  id*)pBest) ){.  
2a10: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
2a20: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
2a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 65  sqlite3_free(pBe
2a40: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
2a50: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
2a60: 20 20 69 66 28 20 70 42 65 73 74 20 26 26 20 28    if( pBest && (
2a70: 70 42 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20  pBest->xStep || 
2a80: 70 42 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20  pBest->xFunc || 
2a90: 63 72 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20  createFlag) ){. 
2aa0: 20 20 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b     return pBest;
2ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
2ad0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c  ll resources hel
2ae0: 64 20 62 79 20 74 68 65 20 73 63 68 65 6d 61 20  d by the schema 
2af0: 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 76  structure. The v
2b00: 6f 69 64 2a 20 61 72 67 75 6d 65 6e 74 20 70 6f  oid* argument po
2b10: 69 6e 74 73 0a 2a 2a 20 61 74 20 61 20 53 63 68  ints.** at a Sch
2b20: 65 6d 61 20 73 74 72 75 63 74 2e 20 54 68 69 73  ema struct. This
2b30: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2b40: 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ot call sqlite3_
2b50: 66 72 65 65 28 29 20 6f 6e 20 74 68 65 20 0a 2a  free() on the .*
2b60: 2a 20 70 6f 69 6e 74 65 72 20 69 74 73 65 6c 66  * pointer itself
2b70: 2c 20 69 74 20 6a 75 73 74 20 63 6c 65 61 6e 73  , it just cleans
2b80: 20 75 70 20 73 75 62 73 69 64 75 61 72 79 20 72   up subsiduary r
2b90: 65 73 6f 75 72 63 65 73 20 28 69 2e 65 2e 20 74  esources (i.e. t
2ba0: 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
2bb0: 66 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  f the schema has
2bc0: 68 20 74 61 62 6c 65 73 29 2e 0a 2a 2f 0a 76 6f  h tables)..*/.vo
2bd0: 69 64 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  id sqlite3Schema
2be0: 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Free(void *p){. 
2bf0: 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48   Hash temp1;.  H
2c00: 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 48 61 73  ash temp2;.  Has
2c10: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
2c20: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
2c30: 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 3b 0a 0a  = (Schema *)p;..
2c40: 20 20 74 65 6d 70 31 20 3d 20 70 53 63 68 65 6d    temp1 = pSchem
2c50: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 74 65  a->tblHash;.  te
2c60: 6d 70 32 20 3d 20 70 53 63 68 65 6d 61 2d 3e 74  mp2 = pSchema->t
2c70: 72 69 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74  rigHash;.  sqlit
2c80: 65 33 48 61 73 68 49 6e 69 74 28 26 70 53 63 68  e3HashInit(&pSch
2c90: 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 2c 20 53  ema->trigHash, S
2ca0: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2cb0: 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  G, 0);.  sqlite3
2cc0: 48 61 73 68 43 6c 65 61 72 28 26 70 53 63 68 65  HashClear(&pSche
2cd0: 6d 61 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 73 71  ma->aFKey);.  sq
2ce0: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2cf0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2d00: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2d10: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2d20: 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70  temp2); pElem; p
2d30: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
2d40: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
2d50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
2d60: 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a 29  igger((Trigger*)
2d70: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2d80: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 73 71  Elem));.  }.  sq
2d90: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2da0: 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  temp2);.  sqlite
2db0: 33 48 61 73 68 49 6e 69 74 28 26 70 53 63 68 65  3HashInit(&pSche
2dc0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  ma->tblHash, SQL
2dd0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
2de0: 20 30 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d   0);.  for(pElem
2df0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2e00: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
2e10: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2e20: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2e30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2e40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
2e50: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  pElem);.    sqli
2e60: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
2e70: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Tab);.  }.  sqli
2e80: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
2e90: 6d 70 31 29 3b 0a 20 20 70 53 63 68 65 6d 61 2d  mp1);.  pSchema-
2ea0: 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20 20  >pSeqTab = 0;.  
2eb0: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 26  pSchema->flags &
2ec0: 3d 20 7e 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  = ~DB_SchemaLoad
2ed0: 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ed;.}../*.** Fin
2ee0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
2ef0: 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
2f00: 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
2f10: 20 20 43 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65    Create.** a ne
2f20: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
2f30: 72 79 2e 0a 2a 2f 0a 53 63 68 65 6d 61 20 2a 73  ry..*/.Schema *s
2f40: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
2f50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 72  sqlite3 *db, Btr
2f60: 65 65 20 2a 70 42 74 29 7b 0a 20 20 53 63 68 65  ee *pBt){.  Sche
2f70: 6d 61 20 2a 20 70 3b 0a 20 20 69 66 28 20 70 42  ma * p;.  if( pB
2f80: 74 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 53 63  t ){.    p = (Sc
2f90: 68 65 6d 61 20 2a 29 73 71 6c 69 74 65 33 42 74  hema *)sqlite3Bt
2fa0: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2c 73 69  reeSchema(pBt,si
2fb0: 7a 65 6f 66 28 53 63 68 65 6d 61 29 2c 73 71 6c  zeof(Schema),sql
2fc0: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 29 3b  ite3SchemaFree);
2fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
2fe0: 3d 20 28 53 63 68 65 6d 61 20 2a 29 73 71 6c 69  = (Schema *)sqli
2ff0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3000: 64 62 2c 73 69 7a 65 6f 66 28 53 63 68 65 6d 61  db,sizeof(Schema
3010: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  ));.  }.  if( p 
3020: 26 26 20 30 3d 3d 70 2d 3e 66 69 6c 65 5f 66 6f  && 0==p->file_fo
3030: 72 6d 61 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rmat ){.    sqli
3040: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 2d 3e  te3HashInit(&p->
3050: 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  tblHash, SQLITE_
3060: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
3070: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
3080: 49 6e 69 74 28 26 70 2d 3e 69 64 78 48 61 73 68  Init(&p->idxHash
3090: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
30a0: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
30b0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
30c0: 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49  ->trigHash, SQLI
30d0: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
30e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  0);.    sqlite3H
30f0: 61 73 68 49 6e 69 74 28 26 70 2d 3e 61 46 4b 65  ashInit(&p->aFKe
3100: 79 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  y, SQLITE_HASH_S
3110: 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20 20 20 70  TRING, 1);.    p
3120: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
3130: 54 46 38 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TF8;.  }.  retur
3140: 6e 20 70 3b 0a 7d 0a                             n p;.}.