/ Hex Artifact Content
Login

Artifact 635775226d07c743c770888a9dd5175afc6e67d3e28a4032b7fedc3bcaa92e65:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4d 61 79 20 36  /*.** 2007 May 6
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 24 49 64 3a 20 69 63 75 2e 63 2c 76 20  ** $Id: icu.c,v 
0180: 31 2e 37 20 32 30 30 37 2f 31 32 2f 31 33 20 32  1.7 2007/12/13 2
0190: 31 3a 35 34 3a 31 31 20 64 72 68 20 45 78 70 20  1:54:11 drh Exp 
01a0: 24 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  $.**.** This fil
01b0: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  e implements an 
01c0: 69 6e 74 65 67 72 61 74 69 6f 6e 20 62 65 74 77  integration betw
01d0: 65 65 6e 20 74 68 65 20 49 43 55 20 6c 69 62 72  een the ICU libr
01e0: 61 72 79 20 0a 2a 2a 20 28 22 49 6e 74 65 72 6e  ary .** ("Intern
01f0: 61 74 69 6f 6e 61 6c 20 43 6f 6d 70 6f 6e 65 6e  ational Componen
0200: 74 73 20 66 6f 72 20 55 6e 69 63 6f 64 65 22 2c  ts for Unicode",
0210: 20 61 6e 20 6f 70 65 6e 2d 73 6f 75 72 63 65 20   an open-source 
0220: 6c 69 62 72 61 72 79 20 0a 2a 2a 20 66 6f 72 20  library .** for 
0230: 68 61 6e 64 6c 69 6e 67 20 75 6e 69 63 6f 64 65  handling unicode
0240: 20 64 61 74 61 29 20 61 6e 64 20 53 51 4c 69 74   data) and SQLit
0250: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 61 74 69  e. The integrati
0260: 6f 6e 20 75 73 65 73 20 0a 2a 2a 20 49 43 55 20  on uses .** ICU 
0270: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 66  to provide the f
0280: 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 53 51 4c 69  ollowing to SQLi
0290: 74 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  te:.**.**   * An
02a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
02b0: 6f 66 20 74 68 65 20 53 51 4c 20 72 65 67 65 78  of the SQL regex
02c0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 61 6e  p() function (an
02d0: 64 20 68 65 6e 63 65 20 52 45 47 45 58 50 0a 2a  d hence REGEXP.*
02e0: 2a 20 20 20 20 20 6f 70 65 72 61 74 6f 72 29 20  *     operator) 
02f0: 75 73 69 6e 67 20 74 68 65 20 49 43 55 20 75 72  using the ICU ur
0300: 65 67 65 78 5f 58 58 28 29 20 41 50 49 73 2e 0a  egex_XX() APIs..
0310: 2a 2a 0a 2a 2a 20 20 20 2a 20 49 6d 70 6c 65 6d  **.**   * Implem
0320: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
0330: 20 53 51 4c 20 73 63 61 6c 61 72 20 75 70 70 65   SQL scalar uppe
0340: 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29 20  r() and lower() 
0350: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  functions.**    
0360: 20 66 6f 72 20 63 61 73 65 20 6d 61 70 70 69 6e   for case mappin
0370: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 6e 74  g..**.**   * Int
0380: 65 67 72 61 74 69 6f 6e 20 6f 66 20 49 43 55 20  egration of ICU 
0390: 61 6e 64 20 53 51 4c 69 74 65 20 63 6f 6c 6c 61  and SQLite colla
03a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e 0a  tion sequences..
03b0: 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6d 70  **.**   * An imp
03c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
03d0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
03e0: 20 74 68 61 74 20 75 73 65 73 20 49 43 55 20 74   that uses ICU t
03f0: 6f 20 0a 2a 2a 20 20 20 20 20 70 72 6f 76 69 64  o .**     provid
0400: 65 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  e case-independe
0410: 6e 74 20 6d 61 74 63 68 69 6e 67 2e 0a 2a 2f 0a  nt matching..*/.
0420: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0430: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0440: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0450: 42 4c 45 5f 49 43 55 29 0a 0a 2f 2a 20 49 6e 63  BLE_ICU)../* Inc
0460: 6c 75 64 65 20 49 43 55 20 68 65 61 64 65 72 73  lude ICU headers
0470: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e   */.#include <un
0480: 69 63 6f 64 65 2f 75 74 79 70 65 73 2e 68 3e 0a  icode/utypes.h>.
0490: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 63 6f 64  #include <unicod
04a0: 65 2f 75 72 65 67 65 78 2e 68 3e 0a 23 69 6e 63  e/uregex.h>.#inc
04b0: 6c 75 64 65 20 3c 75 6e 69 63 6f 64 65 2f 75 73  lude <unicode/us
04c0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
04d0: 65 20 3c 75 6e 69 63 6f 64 65 2f 75 63 6f 6c 2e  e <unicode/ucol.
04e0: 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  h>..#include <as
04f0: 73 65 72 74 2e 68 3e 0a 0a 23 69 66 6e 64 65 66  sert.h>..#ifndef
0500: 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 23   SQLITE_CORE.  #
0510: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0520: 65 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f  ext.h".  SQLITE_
0530: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
0540: 23 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65  #else.  #include
0550: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e   "sqlite3.h".#en
0560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0570: 75 6d 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79  um length (in by
0580: 74 65 73 29 20 6f 66 20 74 68 65 20 70 61 74 74  tes) of the patt
0590: 65 72 6e 20 69 6e 20 61 20 4c 49 4b 45 20 6f 72  ern in a LIKE or
05a0: 20 47 4c 4f 42 0a 2a 2a 20 6f 70 65 72 61 74 6f   GLOB.** operato
05b0: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r..*/.#ifndef SQ
05c0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
05d0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 0a 23 20 64  TTERN_LENGTH.# d
05e0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58  efine SQLITE_MAX
05f0: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
0600: 4e 47 54 48 20 35 30 30 30 30 0a 23 65 6e 64 69  NGTH 50000.#endi
0610: 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e  f../*.** Version
0620: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65   of sqlite3_free
0630: 28 29 20 74 68 61 74 20 69 73 20 61 6c 77 61 79  () that is alway
0640: 73 20 61 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 65  s a function, ne
0650: 76 65 72 20 61 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ver a macro..*/.
0660: 73 74 61 74 69 63 20 76 6f 69 64 20 78 46 72 65  static void xFre
0670: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  e(void *p){.  sq
0680: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
0690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 6f  ../*.** This loo
06a0: 6b 75 70 20 74 61 62 6c 65 20 69 73 20 75 73 65  kup table is use
06b0: 64 20 74 6f 20 68 65 6c 70 20 64 65 63 6f 64 65  d to help decode
06c0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
06d0: 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69 2d 62 79  of.** a multi-by
06e0: 74 65 20 55 54 46 38 20 63 68 61 72 61 63 74 65  te UTF8 characte
06f0: 72 2e 20 49 74 20 69 73 20 63 6f 70 69 65 64 20  r. It is copied 
0700: 68 65 72 65 20 66 72 6f 6d 20 53 51 4c 69 74 65  here from SQLite
0710: 20 73 6f 75 72 63 65 0a 2a 2a 20 63 6f 64 65 20   source.** code 
0720: 66 69 6c 65 20 75 74 66 38 2e 63 2e 0a 2a 2f 0a  file utf8.c..*/.
0730: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
0740: 69 67 6e 65 64 20 63 68 61 72 20 69 63 75 55 74  igned char icuUt
0750: 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20  f8Trans1[] = {. 
0760: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
0770: 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  2, 0x03, 0x04, 0
0780: 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c  x05, 0x06, 0x07,
0790: 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30  .  0x08, 0x09, 0
07a0: 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c  x0a, 0x0b, 0x0c,
07b0: 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30   0x0d, 0x0e, 0x0
07c0: 66 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c  f,.  0x10, 0x11,
07d0: 20 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31   0x12, 0x13, 0x1
07e0: 34 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30  4, 0x15, 0x16, 0
07f0: 78 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31  x17,.  0x18, 0x1
0800: 39 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30  9, 0x1a, 0x1b, 0
0810: 78 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c  x1c, 0x1d, 0x1e,
0820: 20 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x1f,.  0x00, 0
0830: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
0840: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
0850: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c  6, 0x07,.  0x08,
0860: 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30   0x09, 0x0a, 0x0
0870: 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30  b, 0x0c, 0x0d, 0
0880: 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30  x0e, 0x0f,.  0x0
0890: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
08a0: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
08b0: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
08c0: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
08d0: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
08e0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d  1, 0x00, 0x00,.}
08f0: 3b 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  ;..#define SQLIT
0900: 45 5f 49 43 55 5f 52 45 41 44 5f 55 54 46 38 28  E_ICU_READ_UTF8(
0910: 7a 49 6e 2c 20 63 29 20 20 20 20 20 20 20 20 20  zIn, c)         
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0930: 20 20 63 20 3d 20 2a 28 7a 49 6e 2b 2b 29 3b 20    c = *(zIn++); 
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
0970: 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 20 20 20  f( c>=0xc0 ){   
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 20          \.    c 
09b0: 3d 20 69 63 75 55 74 66 38 54 72 61 6e 73 31 5b  = icuUtf8Trans1[
09c0: 63 2d 30 78 63 30 5d 3b 20 20 20 20 20 20 20 20  c-0xc0];        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 5c 0a 20 20 20 20 77 68 69 6c 65       \.    while
09f0: 28 20 28 2a 7a 49 6e 20 26 20 30 78 63 30 29 3d  ( (*zIn & 0xc0)=
0a00: 3d 30 78 38 30 20 29 7b 20 20 20 20 20 20 20 20  =0x80 ){        
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 5c 0a 20 20 20 20 20 20 63 20 3d 20 28 63    \.      c = (c
0a30: 3c 3c 36 29 20 2b 20 28 30 78 33 66 20 26 20 2a  <<6) + (0x3f & *
0a40: 28 7a 49 6e 2b 2b 29 29 3b 20 20 20 20 20 20 20  (zIn++));       
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0a60: 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20  .    }          
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0aa0: 7d 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  }..#define SQLIT
0ab0: 45 5f 49 43 55 5f 53 4b 49 50 5f 55 54 46 38 28  E_ICU_SKIP_UTF8(
0ac0: 7a 49 6e 29 20 20 20 20 20 20 20 20 20 20 20 20  zIn)            
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0ae0: 20 20 61 73 73 65 72 74 28 20 2a 7a 49 6e 20 29    assert( *zIn )
0af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
0b20: 66 28 20 2a 28 7a 49 6e 2b 2b 29 3e 3d 30 78 63  f( *(zIn++)>=0xc
0b30: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 77 68          \.    wh
0b60: 69 6c 65 28 20 28 2a 7a 49 6e 20 26 20 30 78 63  ile( (*zIn & 0xc
0b70: 30 29 3d 3d 30 78 38 30 20 29 7b 7a 49 6e 2b 2b  0)==0x80 ){zIn++
0b80: 3b 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;}              
0b90: 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 0a 2f 2a 0a       \.  }.../*.
0ba0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 55  ** Compare two U
0bb0: 54 46 2d 38 20 73 74 72 69 6e 67 73 20 66 6f 72  TF-8 strings for
0bc0: 20 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20   equality where 
0bd0: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
0be0: 20 69 73 0a 2a 2a 20 61 20 22 4c 49 4b 45 22 20   is.** a "LIKE" 
0bf0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 52 65 74 75  expression. Retu
0c00: 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74  rn true (1) if t
0c10: 68 65 79 20 61 72 65 20 74 68 65 20 73 61 6d 65  hey are the same
0c20: 20 61 6e 64 20 0a 2a 2a 20 66 61 6c 73 65 20 28   and .** false (
0c30: 30 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64  0) if they are d
0c40: 69 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 73 74 61  ifferent..*/.sta
0c50: 74 69 63 20 69 6e 74 20 69 63 75 4c 69 6b 65 43  tic int icuLikeC
0c60: 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20  ompare(.  const 
0c70: 75 69 6e 74 38 5f 74 20 2a 7a 50 61 74 74 65 72  uint8_t *zPatter
0c80: 6e 2c 20 20 20 2f 2a 20 4c 49 4b 45 20 70 61 74  n,   /* LIKE pat
0c90: 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tern */.  const 
0ca0: 75 69 6e 74 38 5f 74 20 2a 7a 53 74 72 69 6e 67  uint8_t *zString
0cb0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 55 54 46 2d  ,    /* The UTF-
0cc0: 38 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  8 string to comp
0cd0: 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
0ce0: 20 63 6f 6e 73 74 20 55 43 68 61 72 33 32 20 75   const UChar32 u
0cf0: 45 73 63 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Esc         /* T
0d00: 68 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  he escape charac
0d10: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ter */.){.  stat
0d20: 69 63 20 63 6f 6e 73 74 20 75 69 6e 74 33 32 5f  ic const uint32_
0d30: 74 20 4d 41 54 43 48 5f 4f 4e 45 20 3d 20 28 75  t MATCH_ONE = (u
0d40: 69 6e 74 33 32 5f 74 29 27 5f 27 3b 0a 20 20 73  int32_t)'_';.  s
0d50: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 69 6e 74  tatic const uint
0d60: 33 32 5f 74 20 4d 41 54 43 48 5f 41 4c 4c 20 3d  32_t MATCH_ALL =
0d70: 20 28 75 69 6e 74 33 32 5f 74 29 27 25 27 3b 0a   (uint32_t)'%';.
0d80: 0a 20 20 69 6e 74 20 70 72 65 76 45 73 63 61 70  .  int prevEscap
0d90: 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  e = 0;     /* Tr
0da0: 75 65 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  ue if the previo
0db0: 75 73 20 63 68 61 72 61 63 74 65 72 20 77 61 73  us character was
0dc0: 20 75 45 73 63 20 2a 2f 0a 0a 20 20 77 68 69 6c   uEsc */..  whil
0dd0: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
0de0: 52 65 61 64 20 28 61 6e 64 20 63 6f 6e 73 75 6d  Read (and consum
0df0: 65 29 20 74 68 65 20 6e 65 78 74 20 63 68 61 72  e) the next char
0e00: 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 69  acter from the i
0e10: 6e 70 75 74 20 70 61 74 74 65 72 6e 2e 20 2a 2f  nput pattern. */
0e20: 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75 50  .    uint32_t uP
0e30: 61 74 74 65 72 6e 3b 0a 20 20 20 20 53 51 4c 49  attern;.    SQLI
0e40: 54 45 5f 49 43 55 5f 52 45 41 44 5f 55 54 46 38  TE_ICU_READ_UTF8
0e50: 28 7a 50 61 74 74 65 72 6e 2c 20 75 50 61 74 74  (zPattern, uPatt
0e60: 65 72 6e 29 3b 0a 20 20 20 20 69 66 28 20 75 50  ern);.    if( uP
0e70: 61 74 74 65 72 6e 3d 3d 30 20 29 20 62 72 65 61  attern==0 ) brea
0e80: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  k;..    /* There
0e90: 20 61 72 65 20 6e 6f 77 20 34 20 70 6f 73 73 69   are now 4 possi
0ea0: 62 69 6c 69 74 69 65 73 3a 0a 20 20 20 20 2a 2a  bilities:.    **
0eb0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 31 2e 20 75  .    **     1. u
0ec0: 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 75 6e  Pattern is an un
0ed0: 65 73 63 61 70 65 64 20 6d 61 74 63 68 2d 61 6c  escaped match-al
0ee0: 6c 20 63 68 61 72 61 63 74 65 72 20 22 25 22 2c  l character "%",
0ef0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 32 2e 20 75  .    **     2. u
0f00: 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 75 6e  Pattern is an un
0f10: 65 73 63 61 70 65 64 20 6d 61 74 63 68 2d 6f 6e  escaped match-on
0f20: 65 20 63 68 61 72 61 63 74 65 72 20 22 5f 22 2c  e character "_",
0f30: 0a 20 20 20 20 2a 2a 20 20 20 20 20 33 2e 20 75  .    **     3. u
0f40: 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 75 6e  Pattern is an un
0f50: 65 73 63 61 70 65 64 20 65 73 63 61 70 65 20 63  escaped escape c
0f60: 68 61 72 61 63 74 65 72 2c 20 6f 72 0a 20 20 20  haracter, or.   
0f70: 20 2a 2a 20 20 20 20 20 34 2e 20 75 50 61 74 74   **     4. uPatt
0f80: 65 72 6e 20 69 73 20 74 6f 20 62 65 20 68 61 6e  ern is to be han
0f90: 64 6c 65 64 20 61 73 20 61 6e 20 6f 72 64 69 6e  dled as an ordin
0fa0: 61 72 79 20 63 68 61 72 61 63 74 65 72 0a 20 20  ary character.  
0fb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 72    */.    if( !pr
0fc0: 65 76 45 73 63 61 70 65 20 26 26 20 75 50 61 74  evEscape && uPat
0fd0: 74 65 72 6e 3d 3d 4d 41 54 43 48 5f 41 4c 4c 20  tern==MATCH_ALL 
0fe0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
0ff0: 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 75 69 6e   1. */.      uin
1000: 74 38 5f 74 20 63 3b 0a 0a 20 20 20 20 20 20 2f  t8_t c;..      /
1010: 2a 20 53 6b 69 70 20 61 6e 79 20 4d 41 54 43 48  * Skip any MATCH
1020: 5f 41 4c 4c 20 6f 72 20 4d 41 54 43 48 5f 4f 4e  _ALL or MATCH_ON
1030: 45 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  E characters tha
1040: 74 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 20 20 20  t follow a.     
1050: 20 2a 2a 20 4d 41 54 43 48 5f 41 4c 4c 2e 20 46   ** MATCH_ALL. F
1060: 6f 72 20 65 61 63 68 20 4d 41 54 43 48 5f 4f 4e  or each MATCH_ON
1070: 45 2c 20 73 6b 69 70 20 6f 6e 65 20 63 68 61 72  E, skip one char
1080: 61 63 74 65 72 20 69 6e 20 74 68 65 20 0a 20 20  acter in the .  
1090: 20 20 20 20 2a 2a 20 74 65 73 74 20 73 74 72 69      ** test stri
10a0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
10b0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 2a 7a 50     while( (c=*zP
10c0: 61 74 74 65 72 6e 29 20 3d 3d 20 4d 41 54 43 48  attern) == MATCH
10d0: 5f 41 4c 4c 20 7c 7c 20 63 20 3d 3d 20 4d 41 54  _ALL || c == MAT
10e0: 43 48 5f 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  CH_ONE ){.      
10f0: 20 20 69 66 28 20 63 3d 3d 4d 41 54 43 48 5f 4f    if( c==MATCH_O
1100: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1110: 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30 20  if( *zString==0 
1120: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1130: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 43 55        SQLITE_ICU
1140: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69  _SKIP_UTF8(zStri
1150: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
1160: 20 20 20 20 20 20 20 7a 50 61 74 74 65 72 6e 2b         zPattern+
1170: 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  +;.      }..    
1180: 20 20 69 66 28 20 2a 7a 50 61 74 74 65 72 6e 3d    if( *zPattern=
1190: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
11a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
11b0: 74 72 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  tring ){.       
11c0: 20 69 66 28 20 69 63 75 4c 69 6b 65 43 6f 6d 70   if( icuLikeComp
11d0: 61 72 65 28 7a 50 61 74 74 65 72 6e 2c 20 7a 53  are(zPattern, zS
11e0: 74 72 69 6e 67 2c 20 75 45 73 63 29 20 29 7b 0a  tring, uEsc) ){.
11f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1200: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
1210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 43 55        SQLITE_ICU
1220: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 53 74 72 69  _SKIP_UTF8(zStri
1230: 6e 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ng);.      }.   
1240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20     return 0;..  
1250: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 72 65    }else if( !pre
1260: 76 45 73 63 61 70 65 20 26 26 20 75 50 61 74 74  vEscape && uPatt
1270: 65 72 6e 3d 3d 4d 41 54 43 48 5f 4f 4e 45 20 29  ern==MATCH_ONE )
1280: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
1290: 32 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  2. */.      if( 
12a0: 2a 7a 53 74 72 69 6e 67 3d 3d 30 20 29 20 72 65  *zString==0 ) re
12b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 53 51  turn 0;.      SQ
12c0: 4c 49 54 45 5f 49 43 55 5f 53 4b 49 50 5f 55 54  LITE_ICU_SKIP_UT
12d0: 46 38 28 7a 53 74 72 69 6e 67 29 3b 0a 0a 20 20  F8(zString);..  
12e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 72 65    }else if( !pre
12f0: 76 45 73 63 61 70 65 20 26 26 20 75 50 61 74 74  vEscape && uPatt
1300: 65 72 6e 3d 3d 28 75 69 6e 74 33 32 5f 74 29 75  ern==(uint32_t)u
1310: 45 73 63 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Esc){.      /* C
1320: 61 73 65 20 33 2e 20 2a 2f 0a 20 20 20 20 20 20  ase 3. */.      
1330: 70 72 65 76 45 73 63 61 70 65 20 3d 20 31 3b 0a  prevEscape = 1;.
1340: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1350: 20 20 2f 2a 20 43 61 73 65 20 34 2e 20 2a 2f 0a    /* Case 4. */.
1360: 20 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20 75        uint32_t u
1370: 53 74 72 69 6e 67 3b 0a 20 20 20 20 20 20 53 51  String;.      SQ
1380: 4c 49 54 45 5f 49 43 55 5f 52 45 41 44 5f 55 54  LITE_ICU_READ_UT
1390: 46 38 28 7a 53 74 72 69 6e 67 2c 20 75 53 74 72  F8(zString, uStr
13a0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 75 53 74 72  ing);.      uStr
13b0: 69 6e 67 20 3d 20 28 75 69 6e 74 33 32 5f 74 29  ing = (uint32_t)
13c0: 75 5f 66 6f 6c 64 43 61 73 65 28 28 55 43 68 61  u_foldCase((UCha
13d0: 72 33 32 29 75 53 74 72 69 6e 67 2c 20 55 5f 46  r32)uString, U_F
13e0: 4f 4c 44 5f 43 41 53 45 5f 44 45 46 41 55 4c 54  OLD_CASE_DEFAULT
13f0: 29 3b 0a 20 20 20 20 20 20 75 50 61 74 74 65 72  );.      uPatter
1400: 6e 20 3d 20 28 75 69 6e 74 33 32 5f 74 29 75 5f  n = (uint32_t)u_
1410: 66 6f 6c 64 43 61 73 65 28 28 55 43 68 61 72 33  foldCase((UChar3
1420: 32 29 75 50 61 74 74 65 72 6e 2c 20 55 5f 46 4f  2)uPattern, U_FO
1430: 4c 44 5f 43 41 53 45 5f 44 45 46 41 55 4c 54 29  LD_CASE_DEFAULT)
1440: 3b 0a 20 20 20 20 20 20 69 66 28 20 75 53 74 72  ;.      if( uStr
1450: 69 6e 67 21 3d 75 50 61 74 74 65 72 6e 20 29 7b  ing!=uPattern ){
1460: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1470: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1480: 20 70 72 65 76 45 73 63 61 70 65 20 3d 20 30 3b   prevEscape = 0;
1490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
14a0: 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d 30  turn *zString==0
14b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
14c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
14d0: 20 6c 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63   like() SQL func
14e0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
14f0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  tion implements.
1500: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20  ** the build-in 
1510: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20  LIKE operator.  
1520: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1530: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
1540: 6f 6e 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74  on is the.** pat
1550: 74 65 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63  tern and the sec
1560: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1570: 74 68 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c  the string.  So,
1580: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1590: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  nts:.**.**      
15a0: 20 41 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20   A LIKE B.**.** 
15b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
15c0: 73 20 6c 69 6b 65 28 42 2c 20 41 29 2e 20 49 66  s like(B, A). If
15d0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 73 63   there is an esc
15e0: 61 70 65 20 63 68 61 72 61 63 74 65 72 20 45 2c  ape character E,
15f0: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20   .**.**       A 
1600: 4c 49 4b 45 20 42 20 45 53 43 41 50 45 20 45 0a  LIKE B ESCAPE E.
1610: 2a 2a 0a 2a 2a 20 69 73 20 6d 61 70 70 65 64 20  **.** is mapped 
1620: 74 6f 20 6c 69 6b 65 28 42 2c 20 41 2c 20 45 29  to like(B, A, E)
1630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1640: 20 69 63 75 4c 69 6b 65 46 75 6e 63 28 0a 20 20   icuLikeFunc(.  
1650: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1660: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
1670: 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65   argc, .  sqlite
1680: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1690: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
16a0: 65 64 20 63 68 61 72 20 2a 7a 41 20 3d 20 73 71  ed char *zA = sq
16b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
16c0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e  (argv[0]);.  con
16d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16e0: 20 2a 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76   *zB = sqlite3_v
16f0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
1700: 5d 29 3b 0a 20 20 55 43 68 61 72 33 32 20 75 45  ]);.  UChar32 uE
1710: 73 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 69  sc = 0;..  /* Li
1720: 6d 69 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  mit the length o
1730: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
1740: 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 20 61 76  OB pattern to av
1750: 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a  oid problems.  *
1760: 2a 20 6f 66 20 64 65 65 70 20 72 65 63 75 72 73  * of deep recurs
1770: 69 6f 6e 20 61 6e 64 20 4e 2a 4e 20 62 65 68 61  ion and N*N beha
1780: 76 69 6f 72 20 69 6e 20 70 61 74 74 65 72 6e 43  vior in patternC
1790: 6f 6d 70 61 72 65 28 29 2e 0a 20 20 2a 2f 0a 20  ompare()..  */. 
17a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
17b0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
17c0: 29 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  )>SQLITE_MAX_LIK
17d0: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
17e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17f0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
1800: 74 65 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47  text, "LIKE or G
1810: 4c 4f 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20  LOB pattern too 
1820: 63 6f 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20  complex", -1);. 
1830: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1840: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29  .  if( argc==3 )
1850: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63  {.    /* The esc
1860: 61 70 65 20 63 68 61 72 61 63 74 65 72 20 73 74  ape character st
1870: 72 69 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73  ring must consis
1880: 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54  t of a single UT
1890: 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20  F-8 character.. 
18a0: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
18b0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
18c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
18d0: 20 6e 45 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   nE= sqlite3_val
18e0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d  ue_bytes(argv[2]
18f0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  );.    const uns
1900: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 20 3d  igned char *zE =
1910: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
1930: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
1940: 20 69 66 28 20 7a 45 3d 3d 30 20 29 20 72 65 74   if( zE==0 ) ret
1950: 75 72 6e 3b 0a 20 20 20 20 55 38 5f 4e 45 58 54  urn;.    U8_NEXT
1960: 28 7a 45 2c 20 69 2c 20 6e 45 2c 20 75 45 73 63  (zE, i, nE, uEsc
1970: 29 3b 0a 20 20 20 20 69 66 28 20 69 21 3d 6e 45  );.    if( i!=nE
1980: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1990: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
19a0: 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
19b0: 20 20 22 45 53 43 41 50 45 20 65 78 70 72 65 73    "ESCAPE expres
19c0: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20 73  sion must be a s
19d0: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 22  ingle character"
19e0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74  , -1);.      ret
19f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
1a00: 20 20 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29    if( zA && zB )
1a10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1a20: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
1a30: 2c 20 69 63 75 4c 69 6b 65 43 6f 6d 70 61 72 65  , icuLikeCompare
1a40: 28 7a 41 2c 20 7a 42 2c 20 75 45 73 63 29 29 3b  (zA, zB, uEsc));
1a50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1a60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1a70: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 43  alled when an IC
1a80: 55 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  U function calle
1a90: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  d from within.**
1aa0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1ab0: 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 20 73 63  ion of an SQL sc
1ac0: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  alar function re
1ad0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 0a  turns an error..
1ae0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61 72  **.** The scalar
1af0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78   function contex
1b00: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1b10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1b20: 73 20 0a 2a 2a 20 6c 6f 61 64 65 64 20 77 69 74  s .** loaded wit
1b30: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
1b40: 67 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ge based on the 
1b50: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 61 72  following two ar
1b60: 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1b70: 69 64 20 69 63 75 46 75 6e 63 74 69 6f 6e 45 72  id icuFunctionEr
1b80: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ror(.  sqlite3_c
1b90: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
1ba0: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 73 63      /* SQLite sc
1bb0: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 63 6f  alar function co
1bc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1bd0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
1be0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1bf0: 6f 66 20 49 43 55 20 66 75 6e 63 74 69 6f 6e 20  of ICU function 
1c00: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
1c10: 20 55 45 72 72 6f 72 43 6f 64 65 20 65 20 20 20   UErrorCode e   
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c30: 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
1c40: 72 6e 65 64 20 62 79 20 49 43 55 20 66 75 6e 63  rned by ICU func
1c50: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  tion */.){.  cha
1c60: 72 20 7a 42 75 66 5b 31 32 38 5d 3b 0a 20 20 73  r zBuf[128];.  s
1c70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c80: 31 32 38 2c 20 7a 42 75 66 2c 20 22 49 43 55 20  128, zBuf, "ICU 
1c90: 65 72 72 6f 72 3a 20 25 73 28 29 3a 20 25 73 22  error: %s(): %s"
1ca0: 2c 20 7a 4e 61 6d 65 2c 20 75 5f 65 72 72 6f 72  , zName, u_error
1cb0: 4e 61 6d 65 28 65 29 29 3b 0a 20 20 7a 42 75 66  Name(e));.  zBuf
1cc0: 5b 31 32 37 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [127] = '\0';.  
1cd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1ce0: 72 72 6f 72 28 70 43 74 78 2c 20 7a 42 75 66 2c  rror(pCtx, zBuf,
1cf0: 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   -1);.}../*.** F
1d00: 75 6e 63 74 69 6f 6e 20 74 6f 20 64 65 6c 65 74  unction to delet
1d10: 65 20 63 6f 6d 70 69 6c 65 64 20 72 65 67 65 78  e compiled regex
1d20: 70 20 6f 62 6a 65 63 74 73 2e 20 52 65 67 69 73  p objects. Regis
1d30: 74 65 72 65 64 20 61 73 0a 2a 2a 20 61 20 64 65  tered as.** a de
1d40: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
1d50: 6e 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 73  n with sqlite3_s
1d60: 65 74 5f 61 75 78 64 61 74 61 28 29 2e 0a 2a 2f  et_auxdata()..*/
1d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 63 75  .static void icu
1d80: 52 65 67 65 78 70 44 65 6c 65 74 65 28 76 6f 69  RegexpDelete(voi
1d90: 64 20 2a 70 29 7b 0a 20 20 55 52 65 67 75 6c 61  d *p){.  URegula
1da0: 72 45 78 70 72 65 73 73 69 6f 6e 20 2a 70 45 78  rExpression *pEx
1db0: 70 72 20 3d 20 28 55 52 65 67 75 6c 61 72 45 78  pr = (URegularEx
1dc0: 70 72 65 73 73 69 6f 6e 20 2a 29 70 3b 0a 20 20  pression *)p;.  
1dd0: 75 72 65 67 65 78 5f 63 6c 6f 73 65 28 70 45 78  uregex_close(pEx
1de0: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  pr);.}../*.** Im
1df0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1e00: 53 51 4c 69 74 65 20 52 45 47 45 58 50 20 6f 70  SQLite REGEXP op
1e10: 65 72 61 74 6f 72 2e 20 54 68 69 73 20 73 63 61  erator. This sca
1e20: 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  lar function tak
1e30: 65 73 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  es.** two argume
1e40: 6e 74 73 2e 20 54 68 65 20 66 69 72 73 74 20 69  nts. The first i
1e50: 73 20 61 20 72 65 67 75 6c 61 72 20 65 78 70 72  s a regular expr
1e60: 65 73 73 69 6f 6e 20 70 61 74 74 65 72 6e 20 74  ession pattern t
1e70: 6f 20 63 6f 6d 70 69 6c 65 0a 2a 2a 20 74 68 65  o compile.** the
1e80: 20 73 65 63 6f 6e 64 20 69 73 20 61 20 73 74 72   second is a str
1e90: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ing to match aga
1ea0: 69 6e 73 74 20 74 68 61 74 20 70 61 74 74 65 72  inst that patter
1eb0: 6e 2e 20 49 66 20 65 69 74 68 65 72 20 0a 2a 2a  n. If either .**
1ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1ed0: 53 51 4c 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 4e  SQL NULL, then N
1ee0: 55 4c 4c 20 49 73 20 72 65 74 75 72 6e 65 64 2e  ULL Is returned.
1ef0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1f00: 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 31 20 69  result.** is 1 i
1f10: 66 20 74 68 65 20 73 74 72 69 6e 67 20 6d 61 74  f the string mat
1f20: 63 68 65 73 20 74 68 65 20 70 61 74 74 65 72 6e  ches the pattern
1f30: 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
1f40: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6d  ..**.** SQLite m
1f50: 61 70 73 20 74 68 65 20 72 65 67 65 78 70 28 29  aps the regexp()
1f60: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
1f70: 20 72 65 67 65 78 70 28 29 20 6f 70 65 72 61 74   regexp() operat
1f80: 6f 72 20 73 75 63 68 0a 2a 2a 20 74 68 61 74 20  or such.** that 
1f90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
1fa0: 6f 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  o are equivalent
1fb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 7a 53 74 72  :.**.**     zStr
1fc0: 69 6e 67 20 52 45 47 45 58 50 20 7a 50 61 74 74  ing REGEXP zPatt
1fd0: 65 72 6e 0a 2a 2a 20 20 20 20 20 72 65 67 65 78  ern.**     regex
1fe0: 70 28 7a 50 61 74 74 65 72 6e 2c 20 7a 53 74 72  p(zPattern, zStr
1ff0: 69 6e 67 29 0a 2a 2a 0a 2a 2a 20 55 73 65 73 20  ing).**.** Uses 
2000: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 49 43  the following IC
2010: 55 20 72 65 67 65 78 70 20 41 50 49 73 3a 0a 2a  U regexp APIs:.*
2020: 2a 0a 2a 2a 20 20 20 20 20 75 72 65 67 65 78 5f  *.**     uregex_
2030: 6f 70 65 6e 28 29 0a 2a 2a 20 20 20 20 20 75 72  open().**     ur
2040: 65 67 65 78 5f 6d 61 74 63 68 65 73 28 29 0a 2a  egex_matches().*
2050: 2a 20 20 20 20 20 75 72 65 67 65 78 5f 63 6c 6f  *     uregex_clo
2060: 73 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se().*/.static v
2070: 6f 69 64 20 69 63 75 52 65 67 65 78 70 46 75 6e  oid icuRegexpFun
2080: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2090: 74 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20  t *p, int nArg, 
20a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
20b0: 61 70 41 72 67 29 7b 0a 20 20 55 45 72 72 6f 72  apArg){.  UError
20c0: 43 6f 64 65 20 73 74 61 74 75 73 20 3d 20 55 5f  Code status = U_
20d0: 5a 45 52 4f 5f 45 52 52 4f 52 3b 0a 20 20 55 52  ZERO_ERROR;.  UR
20e0: 65 67 75 6c 61 72 45 78 70 72 65 73 73 69 6f 6e  egularExpression
20f0: 20 2a 70 45 78 70 72 3b 0a 20 20 55 42 6f 6f 6c   *pExpr;.  UBool
2100: 20 72 65 73 3b 0a 20 20 63 6f 6e 73 74 20 55 43   res;.  const UC
2110: 68 61 72 20 2a 7a 53 74 72 69 6e 67 20 3d 20 73  har *zString = s
2120: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2130: 74 31 36 28 61 70 41 72 67 5b 31 5d 29 3b 0a 0a  t16(apArg[1]);..
2140: 20 20 28 76 6f 69 64 29 6e 41 72 67 3b 20 20 2f    (void)nArg;  /
2150: 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74  * Unused paramet
2160: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
2170: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64  he left hand sid
2180: 65 20 6f 66 20 74 68 65 20 72 65 67 65 78 70 20  e of the regexp 
2190: 6f 70 65 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c  operator is NULL
21a0: 2c 20 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  , .  ** then the
21b0: 20 72 65 73 75 6c 74 20 69 73 20 61 6c 73 6f 20   result is also 
21c0: 4e 55 4c 4c 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  NULL. .  */.  if
21d0: 28 20 21 7a 53 74 72 69 6e 67 20 29 7b 0a 20 20  ( !zString ){.  
21e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
21f0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2200: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 2c 20  _get_auxdata(p, 
2210: 30 29 3b 0a 20 20 69 66 28 20 21 70 45 78 70 72  0);.  if( !pExpr
2220: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 55 43   ){.    const UC
2230: 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 20 3d 20  har *zPattern = 
2240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2250: 78 74 31 36 28 61 70 41 72 67 5b 30 5d 29 3b 0a  xt16(apArg[0]);.
2260: 20 20 20 20 69 66 28 20 21 7a 50 61 74 74 65 72      if( !zPatter
2270: 6e 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  n ){.      retur
2280: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  n;.    }.    pEx
2290: 70 72 20 3d 20 75 72 65 67 65 78 5f 6f 70 65 6e  pr = uregex_open
22a0: 28 7a 50 61 74 74 65 72 6e 2c 20 2d 31 2c 20 30  (zPattern, -1, 0
22b0: 2c 20 30 2c 20 26 73 74 61 74 75 73 29 3b 0a 0a  , 0, &status);..
22c0: 20 20 20 20 69 66 28 20 55 5f 53 55 43 43 45 53      if( U_SUCCES
22d0: 53 28 73 74 61 74 75 73 29 20 29 7b 0a 20 20 20  S(status) ){.   
22e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
22f0: 75 78 64 61 74 61 28 70 2c 20 30 2c 20 70 45 78  uxdata(p, 0, pEx
2300: 70 72 2c 20 69 63 75 52 65 67 65 78 70 44 65 6c  pr, icuRegexpDel
2310: 65 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ete);.    }else{
2320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70  .      assert(!p
2330: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 63 75  Expr);.      icu
2340: 46 75 6e 63 74 69 6f 6e 45 72 72 6f 72 28 70 2c  FunctionError(p,
2350: 20 22 75 72 65 67 65 78 5f 6f 70 65 6e 22 2c 20   "uregex_open", 
2360: 73 74 61 74 75 73 29 3b 0a 20 20 20 20 20 20 72  status);.      r
2370: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
2380: 0a 0a 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65  ..  /* Configure
2390: 20 74 68 65 20 74 65 78 74 20 74 68 61 74 20 74   the text that t
23a0: 68 65 20 72 65 67 75 6c 61 72 20 65 78 70 72 65  he regular expre
23b0: 73 73 69 6f 6e 20 6f 70 65 72 61 74 65 73 20 6f  ssion operates o
23c0: 6e 2e 20 2a 2f 0a 20 20 75 72 65 67 65 78 5f 73  n. */.  uregex_s
23d0: 65 74 54 65 78 74 28 70 45 78 70 72 2c 20 7a 53  etText(pExpr, zS
23e0: 74 72 69 6e 67 2c 20 2d 31 2c 20 26 73 74 61 74  tring, -1, &stat
23f0: 75 73 29 3b 0a 20 20 69 66 28 20 21 55 5f 53 55  us);.  if( !U_SU
2400: 43 43 45 53 53 28 73 74 61 74 75 73 29 20 29 7b  CCESS(status) ){
2410: 0a 20 20 20 20 69 63 75 46 75 6e 63 74 69 6f 6e  .    icuFunction
2420: 45 72 72 6f 72 28 70 2c 20 22 75 72 65 67 65 78  Error(p, "uregex
2430: 5f 73 65 74 54 65 78 74 22 2c 20 73 74 61 74 75  _setText", statu
2440: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  s);.    return;.
2450: 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70    }..  /* Attemp
2460: 74 20 74 68 65 20 6d 61 74 63 68 20 2a 2f 0a 20  t the match */. 
2470: 20 72 65 73 20 3d 20 75 72 65 67 65 78 5f 6d 61   res = uregex_ma
2480: 74 63 68 65 73 28 70 45 78 70 72 2c 20 30 2c 20  tches(pExpr, 0, 
2490: 26 73 74 61 74 75 73 29 3b 0a 20 20 69 66 28 20  &status);.  if( 
24a0: 21 55 5f 53 55 43 43 45 53 53 28 73 74 61 74 75  !U_SUCCESS(statu
24b0: 73 29 20 29 7b 0a 20 20 20 20 69 63 75 46 75 6e  s) ){.    icuFun
24c0: 63 74 69 6f 6e 45 72 72 6f 72 28 70 2c 20 22 75  ctionError(p, "u
24d0: 72 65 67 65 78 5f 6d 61 74 63 68 65 73 22 2c 20  regex_matches", 
24e0: 73 74 61 74 75 73 29 3b 0a 20 20 20 20 72 65 74  status);.    ret
24f0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  urn;.  }..  /* S
2500: 65 74 20 74 68 65 20 74 65 78 74 20 74 68 61 74  et the text that
2510: 20 74 68 65 20 72 65 67 75 6c 61 72 20 65 78 70   the regular exp
2520: 72 65 73 73 69 6f 6e 20 6f 70 65 72 61 74 65 73  ression operates
2530: 20 6f 6e 20 74 6f 20 61 20 4e 55 4c 4c 0a 20 20   on to a NULL.  
2540: 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ** pointer. This
2550: 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e   is not really n
2560: 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 69 74  ecessary, but it
2570: 20 69 73 20 74 69 64 69 65 72 20 74 68 61 6e 20   is tidier than 
2580: 0a 20 20 2a 2a 20 6c 65 61 76 69 6e 67 20 74 68  .  ** leaving th
2590: 65 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73  e regular expres
25a0: 73 69 6f 6e 20 6f 62 6a 65 63 74 20 63 6f 6e 66  sion object conf
25b0: 69 67 75 72 65 64 20 77 69 74 68 20 61 6e 20 69  igured with an i
25c0: 6e 76 61 6c 69 64 0a 20 20 2a 2a 20 70 6f 69 6e  nvalid.  ** poin
25d0: 74 65 72 20 61 66 74 65 72 20 74 68 69 73 20 66  ter after this f
25e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
25f0: 0a 20 20 2a 2f 0a 20 20 75 72 65 67 65 78 5f 73  .  */.  uregex_s
2600: 65 74 54 65 78 74 28 70 45 78 70 72 2c 20 30 2c  etText(pExpr, 0,
2610: 20 30 2c 20 26 73 74 61 74 75 73 29 3b 0a 0a 20   0, &status);.. 
2620: 20 2f 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20   /* Return 1 or 
2630: 30 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0. */.  sqlite3_
2640: 72 65 73 75 6c 74 5f 69 6e 74 28 70 2c 20 72 65  result_int(p, re
2650: 73 20 3f 20 31 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  s ? 1 : 0);.}../
2660: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2670: 69 6f 6e 73 20 6f 66 20 73 63 61 6c 61 72 20 66  ions of scalar f
2680: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 63 61 73  unctions for cas
2690: 65 20 6d 61 70 70 69 6e 67 20 2d 20 75 70 70 65  e mapping - uppe
26a0: 72 28 29 20 61 6e 64 20 0a 2a 2a 20 6c 6f 77 65  r() and .** lowe
26b0: 72 28 29 2e 20 46 75 6e 63 74 69 6f 6e 20 75 70  r(). Function up
26c0: 70 65 72 28 29 20 63 6f 6e 76 65 72 74 73 20 69  per() converts i
26d0: 74 73 20 69 6e 70 75 74 20 74 6f 20 75 70 70 65  ts input to uppe
26e0: 72 2d 63 61 73 65 20 28 41 42 43 29 2e 0a 2a 2a  r-case (ABC)..**
26f0: 20 46 75 6e 63 74 69 6f 6e 20 6c 6f 77 65 72 28   Function lower(
2700: 29 20 63 6f 6e 76 65 72 74 73 20 74 6f 20 6c 6f  ) converts to lo
2710: 77 65 72 2d 63 61 73 65 20 28 61 62 63 29 2e 0a  wer-case (abc)..
2720: 2a 2a 0a 2a 2a 20 49 43 55 20 70 72 6f 76 69 64  **.** ICU provid
2730: 65 73 20 74 77 6f 20 74 79 70 65 73 20 6f 66 20  es two types of 
2740: 63 61 73 65 20 6d 61 70 70 69 6e 67 2c 20 22 67  case mapping, "g
2750: 65 6e 65 72 61 6c 22 20 63 61 73 65 20 6d 61 70  eneral" case map
2760: 70 69 6e 67 20 61 6e 64 0a 2a 2a 20 22 6c 61 6e  ping and.** "lan
2770: 67 75 61 67 65 20 73 70 65 63 69 66 69 63 22 2e  guage specific".
2780: 20 52 65 66 65 72 20 74 6f 20 49 43 55 20 64 6f   Refer to ICU do
2790: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
27a0: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  the differences.
27b0: 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ** between the t
27c0: 77 6f 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 74 69  wo..**.** To uti
27d0: 6c 69 73 65 20 22 67 65 6e 65 72 61 6c 22 20 63  lise "general" c
27e0: 61 73 65 20 6d 61 70 70 69 6e 67 2c 20 74 68 65  ase mapping, the
27f0: 20 75 70 70 65 72 28 29 20 6f 72 20 6c 6f 77 65   upper() or lowe
2800: 72 28 29 20 73 63 61 6c 61 72 20 0a 2a 2a 20 66  r() scalar .** f
2810: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 76  unctions are inv
2820: 6f 6b 65 64 20 77 69 74 68 20 6f 6e 65 20 61 72  oked with one ar
2830: 67 75 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  gument:.**.**   
2840: 20 20 75 70 70 65 72 28 27 41 42 43 27 29 20 2d    upper('ABC') -
2850: 3e 20 27 61 62 63 27 0a 2a 2a 20 20 20 20 20 6c  > 'abc'.**     l
2860: 6f 77 65 72 28 27 61 62 63 27 29 20 2d 3e 20 27  ower('abc') -> '
2870: 41 42 43 27 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 63  ABC'.**.** To ac
2880: 63 65 73 73 20 49 43 55 20 22 6c 61 6e 67 75 61  cess ICU "langua
2890: 67 65 20 73 70 65 63 69 66 69 63 22 20 63 61 73  ge specific" cas
28a0: 65 20 6d 61 70 70 69 6e 67 2c 20 75 70 70 65 72  e mapping, upper
28b0: 28 29 20 6f 72 20 6c 6f 77 65 72 28 29 0a 2a 2a  () or lower().**
28c0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
28d0: 65 64 20 77 69 74 68 20 74 77 6f 20 61 72 67 75  ed with two argu
28e0: 6d 65 6e 74 73 2e 20 54 68 65 20 73 65 63 6f 6e  ments. The secon
28f0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
2900: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 65  e name.** of the
2910: 20 6c 6f 63 61 6c 65 20 74 6f 20 75 73 65 2e 20   locale to use. 
2920: 50 61 73 73 69 6e 67 20 61 6e 20 65 6d 70 74 79  Passing an empty
2930: 20 73 74 72 69 6e 67 20 28 22 22 29 20 6f 72 20   string ("") or 
2940: 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 2a  SQL NULL value.*
2950: 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
2960: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2970: 73 61 6d 65 20 61 73 20 69 6e 76 6f 6b 69 6e 67  same as invoking
2980: 20 74 68 65 20 31 20 61 72 67 75 6d 65 6e 74 20   the 1 argument 
2990: 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 75 70  version.** of up
29a0: 70 65 72 28 29 20 6f 72 20 6c 6f 77 65 72 28 29  per() or lower()
29b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6c 6f 77 65  ..**.**     lowe
29c0: 72 28 27 49 27 2c 20 27 65 6e 5f 75 73 27 29 20  r('I', 'en_us') 
29d0: 2d 3e 20 27 69 27 0a 2a 2a 20 20 20 20 20 6c 6f  -> 'i'.**     lo
29e0: 77 65 72 28 27 49 27 2c 20 27 74 72 5f 74 72 27  wer('I', 'tr_tr'
29f0: 29 20 2d 3e 20 27 5c 75 31 33 31 27 20 28 73 6d  ) -> '\u131' (sm
2a00: 61 6c 6c 20 64 6f 74 6c 65 73 73 20 69 29 0a 2a  all dotless i).*
2a10: 2a 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  *.** http://www.
2a20: 69 63 75 2d 70 72 6f 6a 65 63 74 2e 6f 72 67 2f  icu-project.org/
2a30: 75 73 65 72 67 75 69 64 65 2f 70 6f 73 69 78 2e  userguide/posix.
2a40: 68 74 6d 6c 23 63 61 73 65 5f 6d 61 70 70 69 6e  html#case_mappin
2a50: 67 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  gs.*/.static voi
2a60: 64 20 69 63 75 43 61 73 65 46 75 6e 63 31 36 28  d icuCaseFunc16(
2a70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2a80: 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  *p, int nArg, sq
2a90: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2aa0: 41 72 67 29 7b 0a 20 20 63 6f 6e 73 74 20 55 43  Arg){.  const UC
2ab0: 68 61 72 20 2a 7a 49 6e 70 75 74 3b 20 20 20 20  har *zInput;    
2ac0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2ad0: 65 72 20 74 6f 20 69 6e 70 75 74 20 73 74 72 69  er to input stri
2ae0: 6e 67 20 2a 2f 0a 20 20 55 43 68 61 72 20 2a 7a  ng */.  UChar *z
2af0: 4f 75 74 70 75 74 20 3d 20 30 3b 20 20 20 20 20  Output = 0;     
2b00: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b10: 65 72 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  er to output buf
2b20: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  fer */.  int nIn
2b30: 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b50: 20 6f 66 20 75 74 66 2d 31 36 20 69 6e 70 75 74   of utf-16 input
2b60: 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73   string in bytes
2b70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 20   */.  int nOut; 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2ba0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
2bb0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2bc0: 20 63 6e 74 3b 0a 20 20 69 6e 74 20 62 54 6f 55   cnt;.  int bToU
2bd0: 70 70 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  pper;           
2be0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bf0: 66 6f 72 20 74 6f 75 70 70 65 72 28 29 2c 20 66  for toupper(), f
2c00: 61 6c 73 65 20 66 6f 72 20 74 6f 6c 6f 77 65 72  alse for tolower
2c10: 28 29 20 2a 2f 0a 20 20 55 45 72 72 6f 72 43 6f  () */.  UErrorCo
2c20: 64 65 20 73 74 61 74 75 73 3b 0a 20 20 63 6f 6e  de status;.  con
2c30: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 61 6c 65  st char *zLocale
2c40: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2c50: 6e 41 72 67 3d 3d 31 20 7c 7c 20 6e 41 72 67 3d  nArg==1 || nArg=
2c60: 3d 32 29 3b 0a 20 20 62 54 6f 55 70 70 65 72 20  =2);.  bToUpper 
2c70: 3d 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  = (sqlite3_user_
2c80: 64 61 74 61 28 70 29 21 3d 30 29 3b 0a 20 20 69  data(p)!=0);.  i
2c90: 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2ca0: 20 20 7a 4c 6f 63 61 6c 65 20 3d 20 28 63 6f 6e    zLocale = (con
2cb0: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2cc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 41  3_value_text(apA
2cd0: 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 7a  rg[1]);.  }..  z
2ce0: 49 6e 70 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  Input = sqlite3_
2cf0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 70 41  value_text16(apA
2d00: 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 21 7a  rg[0]);.  if( !z
2d10: 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 72 65 74  Input ){.    ret
2d20: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20  urn;.  }.  nOut 
2d30: 3d 20 6e 49 6e 70 75 74 20 3d 20 73 71 6c 69 74  = nInput = sqlit
2d40: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
2d50: 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66  (apArg[0]);.  if
2d60: 28 20 6e 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( nOut==0 ){.   
2d70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2d80: 74 65 78 74 31 36 28 70 2c 20 22 22 2c 20 30 2c  text16(p, "", 0,
2d90: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
2da0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2db0: 0a 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 63  ..  for(cnt=0; c
2dc0: 6e 74 3c 32 3b 20 63 6e 74 2b 2b 29 7b 0a 20 20  nt<2; cnt++){.  
2dd0: 20 20 55 43 68 61 72 20 2a 7a 4e 65 77 20 3d 20    UChar *zNew = 
2de0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
2df0: 7a 4f 75 74 70 75 74 2c 20 6e 4f 75 74 29 3b 0a  zOutput, nOut);.
2e00: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
2e10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e20: 5f 66 72 65 65 28 7a 4f 75 74 70 75 74 29 3b 0a  _free(zOutput);.
2e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2e40: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
2e50: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
2e60: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 75  n;.    }.    zOu
2e70: 74 70 75 74 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  tput = zNew;.   
2e80: 20 73 74 61 74 75 73 20 3d 20 55 5f 5a 45 52 4f   status = U_ZERO
2e90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
2ea0: 62 54 6f 55 70 70 65 72 20 29 7b 0a 20 20 20 20  bToUpper ){.    
2eb0: 20 20 6e 4f 75 74 20 3d 20 32 2a 75 5f 73 74 72    nOut = 2*u_str
2ec0: 54 6f 55 70 70 65 72 28 7a 4f 75 74 70 75 74 2c  ToUpper(zOutput,
2ed0: 6e 4f 75 74 2f 32 2c 7a 49 6e 70 75 74 2c 6e 49  nOut/2,zInput,nI
2ee0: 6e 70 75 74 2f 32 2c 7a 4c 6f 63 61 6c 65 2c 26  nput/2,zLocale,&
2ef0: 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 65 6c  status);.    }el
2f00: 73 65 7b 0a 20 20 20 20 20 20 6e 4f 75 74 20 3d  se{.      nOut =
2f10: 20 32 2a 75 5f 73 74 72 54 6f 4c 6f 77 65 72 28   2*u_strToLower(
2f20: 7a 4f 75 74 70 75 74 2c 6e 4f 75 74 2f 32 2c 7a  zOutput,nOut/2,z
2f30: 49 6e 70 75 74 2c 6e 49 6e 70 75 74 2f 32 2c 7a  Input,nInput/2,z
2f40: 4c 6f 63 61 6c 65 2c 26 73 74 61 74 75 73 29 3b  Locale,&status);
2f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2f60: 55 5f 53 55 43 43 45 53 53 28 73 74 61 74 75 73  U_SUCCESS(status
2f70: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2f80: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
2f90: 28 70 2c 20 7a 4f 75 74 70 75 74 2c 20 6e 4f 75  (p, zOutput, nOu
2fa0: 74 2c 20 78 46 72 65 65 29 3b 0a 20 20 20 20 7d  t, xFree);.    }
2fb0: 65 6c 73 65 20 69 66 28 20 73 74 61 74 75 73 3d  else if( status=
2fc0: 3d 55 5f 42 55 46 46 45 52 5f 4f 56 45 52 46 4c  =U_BUFFER_OVERFL
2fd0: 4f 57 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  OW_ERROR ){.    
2fe0: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 30    assert( cnt==0
2ff0: 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
3000: 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ue;.    }else{. 
3010: 20 20 20 20 20 69 63 75 46 75 6e 63 74 69 6f 6e       icuFunction
3020: 45 72 72 6f 72 28 70 2c 20 62 54 6f 55 70 70 65  Error(p, bToUppe
3030: 72 20 3f 20 22 75 5f 73 74 72 54 6f 55 70 70 65  r ? "u_strToUppe
3040: 72 22 20 3a 20 22 75 5f 73 74 72 54 6f 4c 6f 77  r" : "u_strToLow
3050: 65 72 22 2c 20 73 74 61 74 75 73 29 3b 0a 20 20  er", status);.  
3060: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
3070: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30 20    }.  assert( 0 
3080: 29 3b 20 20 20 20 20 2f 2a 20 55 6e 72 65 61 63  );     /* Unreac
3090: 68 61 62 6c 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  hable */.}../*.*
30a0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
30b0: 65 6e 63 65 20 64 65 73 74 72 75 63 74 6f 72 20  ence destructor 
30c0: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 70 43  function. The pC
30d0: 74 78 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  tx argument poin
30e0: 74 73 20 74 6f 0a 2a 2a 20 61 20 55 43 6f 6c 6c  ts to.** a UColl
30f0: 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20 70  ator structure p
3100: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
3110: 74 65 64 20 75 73 69 6e 67 20 75 63 6f 6c 5f 6f  ted using ucol_o
3120: 70 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pen()..*/.static
3130: 20 76 6f 69 64 20 69 63 75 43 6f 6c 6c 61 74 69   void icuCollati
3140: 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78  onDel(void *pCtx
3150: 29 7b 0a 20 20 55 43 6f 6c 6c 61 74 6f 72 20 2a  ){.  UCollator *
3160: 70 20 3d 20 28 55 43 6f 6c 6c 61 74 6f 72 20 2a  p = (UCollator *
3170: 29 70 43 74 78 3b 0a 20 20 75 63 6f 6c 5f 63 6c  )pCtx;.  ucol_cl
3180: 6f 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(p);.}../*.**
3190: 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
31a0: 6e 63 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  nce comparison f
31b0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 70 43 74  unction. The pCt
31c0: 78 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74  x argument point
31d0: 73 20 74 6f 0a 2a 2a 20 61 20 55 43 6f 6c 6c 61  s to.** a UColla
31e0: 74 6f 72 20 73 74 72 75 63 74 75 72 65 20 70 72  tor structure pr
31f0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
3200: 65 64 20 75 73 69 6e 67 20 75 63 6f 6c 5f 6f 70  ed using ucol_op
3210: 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  en()..*/.static 
3220: 69 6e 74 20 69 63 75 43 6f 6c 6c 61 74 69 6f 6e  int icuCollation
3230: 43 6f 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 43  Coll(.  void *pC
3240: 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c  tx,.  int nLeft,
3250: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
3260: 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67  Left,.  int nRig
3270: 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ht,.  const void
3280: 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 55 43   *zRight.){.  UC
3290: 6f 6c 6c 61 74 69 6f 6e 52 65 73 75 6c 74 20 72  ollationResult r
32a0: 65 73 3b 0a 20 20 55 43 6f 6c 6c 61 74 6f 72 20  es;.  UCollator 
32b0: 2a 70 20 3d 20 28 55 43 6f 6c 6c 61 74 6f 72 20  *p = (UCollator 
32c0: 2a 29 70 43 74 78 3b 0a 20 20 72 65 73 20 3d 20  *)pCtx;.  res = 
32d0: 75 63 6f 6c 5f 73 74 72 63 6f 6c 6c 28 70 2c 20  ucol_strcoll(p, 
32e0: 28 55 43 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20  (UChar *)zLeft, 
32f0: 6e 4c 65 66 74 2f 32 2c 20 28 55 43 68 61 72 20  nLeft/2, (UChar 
3300: 2a 29 7a 52 69 67 68 74 2c 20 6e 52 69 67 68 74  *)zRight, nRight
3310: 2f 32 29 3b 0a 20 20 73 77 69 74 63 68 28 20 72  /2);.  switch( r
3320: 65 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 55  es ){.    case U
3330: 43 4f 4c 5f 4c 45 53 53 3a 20 20 20 20 72 65 74  COL_LESS:    ret
3340: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 63 61 73 65  urn -1;.    case
3350: 20 55 43 4f 4c 5f 47 52 45 41 54 45 52 3a 20 72   UCOL_GREATER: r
3360: 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 63 61  eturn +1;.    ca
3370: 73 65 20 55 43 4f 4c 5f 45 51 55 41 4c 3a 20 20  se UCOL_EQUAL:  
3380: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3390: 20 61 73 73 65 72 74 28 21 22 55 6e 65 78 70 65   assert(!"Unexpe
33a0: 63 74 65 64 20 72 65 74 75 72 6e 20 76 61 6c 75  cted return valu
33b0: 65 20 66 72 6f 6d 20 75 63 6f 6c 5f 73 74 72 63  e from ucol_strc
33c0: 6f 6c 6c 28 29 22 29 3b 0a 20 20 72 65 74 75 72  oll()");.  retur
33d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
33e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
33f0: 74 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74  the scalar funct
3400: 69 6f 6e 20 69 63 75 5f 6c 6f 61 64 5f 63 6f 6c  ion icu_load_col
3410: 6c 61 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20  lation()..**.** 
3420: 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63  This scalar func
3430: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
3440: 61 64 64 20 49 43 55 20 63 6f 6c 6c 61 74 69 6f  add ICU collatio
3450: 6e 20 62 61 73 65 64 20 63 6f 6c 6c 61 74 69 6f  n based collatio
3460: 6e 20 0a 2a 2a 20 74 79 70 65 73 20 74 6f 20 61  n .** types to a
3470: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
3480: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 74  e connection. It
3490: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
34a0: 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 73 20  be called.** as 
34b0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
34c0: 20 20 20 53 45 4c 45 43 54 20 69 63 75 5f 6c 6f     SELECT icu_lo
34d0: 61 64 5f 63 6f 6c 6c 61 74 69 6f 6e 28 3c 6c 6f  ad_collation(<lo
34e0: 63 61 6c 65 3e 2c 20 3c 63 6f 6c 6c 61 74 69 6f  cale>, <collatio
34f0: 6e 2d 6e 61 6d 65 3e 29 3b 0a 2a 2a 0a 2a 2a 20  n-name>);.**.** 
3500: 57 68 65 72 65 20 3c 6c 6f 63 61 6c 65 3e 20 69  Where <locale> i
3510: 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  s a string conta
3520: 69 6e 69 6e 67 20 61 6e 20 49 43 55 20 6c 6f 63  ining an ICU loc
3530: 61 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 28  ale identifier (
3540: 69 2e 65 2e 0a 2a 2a 20 22 65 6e 5f 41 55 22 2c  i.e..** "en_AU",
3550: 20 22 74 72 5f 54 52 22 20 65 74 63 2e 29 20 61   "tr_TR" etc.) a
3560: 6e 64 20 3c 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  nd <collation-na
3570: 6d 65 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me> is the name 
3580: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  of the.** collat
3590: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ion sequence to 
35a0: 63 72 65 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  create..*/.stati
35b0: 63 20 76 6f 69 64 20 69 63 75 4c 6f 61 64 43 6f  c void icuLoadCo
35c0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
35d0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 0a  e3_context *p, .
35e0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 73    int nArg, .  s
35f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3600: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
3610: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
3620: 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
3630: 64 61 74 61 28 70 29 3b 0a 20 20 55 45 72 72 6f  data(p);.  UErro
3640: 72 43 6f 64 65 20 73 74 61 74 75 73 20 3d 20 55  rCode status = U
3650: 5f 5a 45 52 4f 5f 45 52 52 4f 52 3b 0a 20 20 63  _ZERO_ERROR;.  c
3660: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 61  onst char *zLoca
3670: 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  le;      /* Loca
3680: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 2d 20  le identifier - 
3690: 28 65 67 2e 20 22 6a 70 5f 4a 50 22 29 20 2a 2f  (eg. "jp_JP") */
36a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
36b0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Name;        /* 
36c0: 53 51 4c 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  SQL Collation se
36d0: 71 75 65 6e 63 65 20 6e 61 6d 65 20 28 65 67 2e  quence name (eg.
36e0: 20 22 6a 61 70 61 6e 65 73 65 22 29 20 2a 2f 0a   "japanese") */.
36f0: 20 20 55 43 6f 6c 6c 61 74 6f 72 20 2a 70 55 43    UCollator *pUC
3700: 6f 6c 6c 61 74 6f 72 3b 20 20 20 20 2f 2a 20 49  ollator;    /* I
3710: 43 55 20 6c 69 62 72 61 72 79 20 63 6f 6c 6c 61  CU library colla
3720: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
3730: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3750: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
3760: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
3770: 6c 6c 61 74 69 6f 6e 5f 78 28 29 20 2a 2f 0a 0a  llation_x() */..
3780: 20 20 61 73 73 65 72 74 28 6e 41 72 67 3d 3d 32    assert(nArg==2
3790: 29 3b 0a 20 20 28 76 6f 69 64 29 6e 41 72 67 3b  );.  (void)nArg;
37a0: 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d   /* Unused param
37b0: 65 74 65 72 20 2a 2f 0a 20 20 7a 4c 6f 63 61 6c  eter */.  zLocal
37c0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
37d0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
37e0: 74 65 78 74 28 61 70 41 72 67 5b 30 5d 29 3b 0a  text(apArg[0]);.
37f0: 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74    zName = (const
3800: 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
3810: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 41 72 67  value_text(apArg
3820: 5b 31 5d 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4c  [1]);..  if( !zL
3830: 6f 63 61 6c 65 20 7c 7c 20 21 7a 4e 61 6d 65 20  ocale || !zName 
3840: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3850: 20 7d 0a 0a 20 20 70 55 43 6f 6c 6c 61 74 6f 72   }..  pUCollator
3860: 20 3d 20 75 63 6f 6c 5f 6f 70 65 6e 28 7a 4c 6f   = ucol_open(zLo
3870: 63 61 6c 65 2c 20 26 73 74 61 74 75 73 29 3b 0a  cale, &status);.
3880: 20 20 69 66 28 20 21 55 5f 53 55 43 43 45 53 53    if( !U_SUCCESS
3890: 28 73 74 61 74 75 73 29 20 29 7b 0a 20 20 20 20  (status) ){.    
38a0: 69 63 75 46 75 6e 63 74 69 6f 6e 45 72 72 6f 72  icuFunctionError
38b0: 28 70 2c 20 22 75 63 6f 6c 5f 6f 70 65 6e 22 2c  (p, "ucol_open",
38c0: 20 73 74 61 74 75 73 29 3b 0a 20 20 20 20 72 65   status);.    re
38d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
38e0: 72 74 28 70 29 3b 0a 0a 20 20 72 63 20 3d 20 73  rt(p);..  rc = s
38f0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
3900: 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  llation_v2(db, z
3910: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
3920: 31 36 2c 20 28 76 6f 69 64 20 2a 29 70 55 43 6f  16, (void *)pUCo
3930: 6c 6c 61 74 6f 72 2c 20 0a 20 20 20 20 20 20 69  llator, .      i
3940: 63 75 43 6f 6c 6c 61 74 69 6f 6e 43 6f 6c 6c 2c  cuCollationColl,
3950: 20 69 63 75 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c   icuCollationDel
3960: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
3970: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3980: 20 75 63 6f 6c 5f 63 6c 6f 73 65 28 70 55 43 6f   ucol_close(pUCo
3990: 6c 6c 61 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c  llator);.    sql
39a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
39b0: 72 28 70 2c 20 22 45 72 72 6f 72 20 72 65 67 69  r(p, "Error regi
39c0: 73 74 65 72 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  stering collatio
39d0: 6e 20 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  n function", -1)
39e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
39f0: 65 67 69 73 74 65 72 20 74 68 65 20 49 43 55 20  egister the ICU 
3a00: 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69  extension functi
3a10: 6f 6e 73 20 77 69 74 68 20 64 61 74 61 62 61 73  ons with databas
3a20: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
3a30: 69 74 65 33 49 63 75 49 6e 69 74 28 73 71 6c 69  ite3IcuInit(sqli
3a40: 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
3a50: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
3a60: 49 63 75 53 63 61 6c 61 72 20 7b 0a 20 20 20 20  IcuScalar {.    
3a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
3aa0: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
3ab0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3ac0: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3ae0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3af0: 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ts */.    unsign
3b00: 65 64 20 73 68 6f 72 74 20 65 6e 63 3b 20 20 20  ed short enc;   
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 74      /* Optimal t
3b30: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ext encoding */.
3b40: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
3b50: 72 20 69 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  r iContext;     
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b70: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
3b80: 74 61 28 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ta() context */.
3b90: 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63      void (*xFunc
3ba0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
3bb0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
3bc0: 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 73 63 61  alue**);.  } sca
3bd0: 6c 61 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  lars[] = {.    {
3be0: 22 69 63 75 5f 6c 6f 61 64 5f 63 6f 6c 6c 61 74  "icu_load_collat
3bf0: 69 6f 6e 22 2c 20 20 32 2c 20 53 51 4c 49 54 45  ion",  2, SQLITE
3c00: 5f 55 54 46 38 2c 20 20 20 20 20 20 20 20 20 20  _UTF8,          
3c10: 20 20 20 20 20 20 31 2c 20 69 63 75 4c 6f 61 64        1, icuLoad
3c20: 43 6f 6c 6c 61 74 69 6f 6e 7d 2c 0a 20 20 20 20  Collation},.    
3c30: 7b 22 72 65 67 65 78 70 22 2c 20 32 2c 20 53 51  {"regexp", 2, SQ
3c40: 4c 49 54 45 5f 41 4e 59 7c 53 51 4c 49 54 45 5f  LITE_ANY|SQLITE_
3c50: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 20  DETERMINISTIC,  
3c60: 20 20 20 20 20 20 20 30 2c 20 69 63 75 52 65 67         0, icuReg
3c70: 65 78 70 46 75 6e 63 7d 2c 0a 20 20 20 20 7b 22  expFunc},.    {"
3c80: 6c 6f 77 65 72 22 2c 20 20 31 2c 20 53 51 4c 49  lower",  1, SQLI
3c90: 54 45 5f 55 54 46 31 36 7c 53 51 4c 49 54 45 5f  TE_UTF16|SQLITE_
3ca0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 20  DETERMINISTIC,  
3cb0: 20 20 20 20 20 30 2c 20 69 63 75 43 61 73 65 46       0, icuCaseF
3cc0: 75 6e 63 31 36 7d 2c 0a 20 20 20 20 7b 22 6c 6f  unc16},.    {"lo
3cd0: 77 65 72 22 2c 20 20 32 2c 20 53 51 4c 49 54 45  wer",  2, SQLITE
3ce0: 5f 55 54 46 31 36 7c 53 51 4c 49 54 45 5f 44 45  _UTF16|SQLITE_DE
3cf0: 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 20 20 20  TERMINISTIC,    
3d00: 20 20 20 30 2c 20 69 63 75 43 61 73 65 46 75 6e     0, icuCaseFun
3d10: 63 31 36 7d 2c 0a 20 20 20 20 7b 22 75 70 70 65  c16},.    {"uppe
3d20: 72 22 2c 20 20 31 2c 20 53 51 4c 49 54 45 5f 55  r",  1, SQLITE_U
3d30: 54 46 31 36 7c 53 51 4c 49 54 45 5f 44 45 54 45  TF16|SQLITE_DETE
3d40: 52 4d 49 4e 49 53 54 49 43 2c 20 20 20 20 20 20  RMINISTIC,      
3d50: 20 31 2c 20 69 63 75 43 61 73 65 46 75 6e 63 31   1, icuCaseFunc1
3d60: 36 7d 2c 0a 20 20 20 20 7b 22 75 70 70 65 72 22  6},.    {"upper"
3d70: 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ,  2, SQLITE_UTF
3d80: 31 36 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  16|SQLITE_DETERM
3d90: 49 4e 49 53 54 49 43 2c 20 20 20 20 20 20 20 31  INISTIC,       1
3da0: 2c 20 69 63 75 43 61 73 65 46 75 6e 63 31 36 7d  , icuCaseFunc16}
3db0: 2c 0a 20 20 20 20 7b 22 6c 6f 77 65 72 22 2c 20  ,.    {"lower", 
3dc0: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c   1, SQLITE_UTF8|
3dd0: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
3de0: 53 54 49 43 2c 20 20 20 20 20 20 20 20 30 2c 20  STIC,        0, 
3df0: 69 63 75 43 61 73 65 46 75 6e 63 31 36 7d 2c 0a  icuCaseFunc16},.
3e00: 20 20 20 20 7b 22 6c 6f 77 65 72 22 2c 20 20 32      {"lower",  2
3e10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51  , SQLITE_UTF8|SQ
3e20: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
3e30: 49 43 2c 20 20 20 20 20 20 20 20 30 2c 20 69 63  IC,        0, ic
3e40: 75 43 61 73 65 46 75 6e 63 31 36 7d 2c 0a 20 20  uCaseFunc16},.  
3e50: 20 20 7b 22 75 70 70 65 72 22 2c 20 20 31 2c 20    {"upper",  1, 
3e60: 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
3e70: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
3e80: 2c 20 20 20 20 20 20 20 20 31 2c 20 69 63 75 43  ,        1, icuC
3e90: 61 73 65 46 75 6e 63 31 36 7d 2c 0a 20 20 20 20  aseFunc16},.    
3ea0: 7b 22 75 70 70 65 72 22 2c 20 20 32 2c 20 53 51  {"upper",  2, SQ
3eb0: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
3ec0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
3ed0: 20 20 20 20 20 20 20 31 2c 20 69 63 75 43 61 73         1, icuCas
3ee0: 65 46 75 6e 63 31 36 7d 2c 0a 20 20 20 20 7b 22  eFunc16},.    {"
3ef0: 6c 69 6b 65 22 2c 20 20 20 32 2c 20 53 51 4c 49  like",   2, SQLI
3f00: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
3f10: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 20 20  ETERMINISTIC,   
3f20: 20 20 20 20 20 30 2c 20 69 63 75 4c 69 6b 65 46       0, icuLikeF
3f30: 75 6e 63 7d 2c 0a 20 20 20 20 7b 22 6c 69 6b 65  unc},.    {"like
3f40: 22 2c 20 20 20 33 2c 20 53 51 4c 49 54 45 5f 55  ",   3, SQLITE_U
3f50: 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52  TF8|SQLITE_DETER
3f60: 4d 49 4e 49 53 54 49 43 2c 20 20 20 20 20 20 20  MINISTIC,       
3f70: 20 30 2c 20 69 63 75 4c 69 6b 65 46 75 6e 63 7d   0, icuLikeFunc}
3f80: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 20  ,.  };.  int rc 
3f90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
3fa0: 6e 74 20 69 3b 0a 0a 20 20 0a 20 20 66 6f 72 28  nt i;..  .  for(
3fb0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
3fc0: 4f 4b 20 26 26 20 69 3c 28 69 6e 74 29 28 73 69  OK && i<(int)(si
3fd0: 7a 65 6f 66 28 73 63 61 6c 61 72 73 29 2f 73 69  zeof(scalars)/si
3fe0: 7a 65 6f 66 28 73 63 61 6c 61 72 73 5b 30 5d 29  zeof(scalars[0])
3ff0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ); i++){.    con
4000: 73 74 20 73 74 72 75 63 74 20 49 63 75 53 63 61  st struct IcuSca
4010: 6c 61 72 20 2a 70 20 3d 20 26 73 63 61 6c 61 72  lar *p = &scalar
4020: 73 5b 69 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  s[i];.    rc = s
4030: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
4040: 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
4050: 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d  db, p->zName, p-
4060: 3e 6e 41 72 67 2c 20 70 2d 3e 65 6e 63 2c 20 0a  >nArg, p->enc, .
4070: 20 20 20 20 20 20 20 20 70 2d 3e 69 43 6f 6e 74          p->iCont
4080: 65 78 74 20 3f 20 28 76 6f 69 64 2a 29 64 62 20  ext ? (void*)db 
4090: 3a 20 28 76 6f 69 64 2a 29 30 2c 0a 20 20 20 20  : (void*)0,.    
40a0: 20 20 20 20 70 2d 3e 78 46 75 6e 63 2c 20 30 2c      p->xFunc, 0,
40b0: 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
40c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
40d0: 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a  if !SQLITE_CORE.
40e0: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f  #ifdef _WIN32.__
40f0: 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
4100: 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  rt).#endif.int s
4110: 71 6c 69 74 65 33 5f 69 63 75 5f 69 6e 69 74 28  qlite3_icu_init(
4120: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
4130: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
4140: 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  sg,.  const sqli
4150: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
4160: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
4170: 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
4180: 54 32 28 70 41 70 69 29 0a 20 20 72 65 74 75 72  T2(pApi).  retur
4190: 6e 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  n sqlite3IcuInit
41a0: 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (db);.}.#endif..
41b0: 23 65 6e 64 69 66 0a                             #endif.