/ Hex Artifact Content
Login

Artifact 850e9a36567bbcce6bd85a4b68243cad8e3c2de2:


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 65 6e 63 65 73 2e 0a 2a  tion seqences..*
03b0: 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6d 70 6c  *.**   * An impl
03c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
03d0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
03e0: 74 68 61 74 20 75 73 65 73 20 49 43 55 20 74 6f  that uses ICU to
03f0: 20 0a 2a 2a 20 20 20 20 20 70 72 6f 76 69 64 65   .**     provide
0400: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
0410: 74 20 6d 61 74 63 68 69 6e 67 2e 0a 2a 2f 0a 0a  t matching..*/..
0420: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0430: 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66  ITE_CORE) || def
0440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0450: 4c 45 5f 49 43 55 29 0a 0a 2f 2a 20 49 6e 63 6c  LE_ICU)../* Incl
0460: 75 64 65 20 49 43 55 20 68 65 61 64 65 72 73 20  ude ICU headers 
0470: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  */.#include <uni
0480: 63 6f 64 65 2f 75 74 79 70 65 73 2e 68 3e 0a 23  code/utypes.h>.#
0490: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 63 6f 64 65  include <unicode
04a0: 2f 75 72 65 67 65 78 2e 68 3e 0a 23 69 6e 63 6c  /uregex.h>.#incl
04b0: 75 64 65 20 3c 75 6e 69 63 6f 64 65 2f 75 73 74  ude <unicode/ust
04c0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
04d0: 20 3c 75 6e 69 63 6f 64 65 2f 75 63 6f 6c 2e 68   <unicode/ucol.h
04e0: 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  >..#include <ass
04f0: 65 72 74 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20  ert.h>..#ifndef 
0500: 53 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 23 69  SQLITE_CORE.  #i
0510: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65  nclude "sqlite3e
0520: 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f 45  xt.h".  SQLITE_E
0530: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23  XTENSION_INIT1.#
0540: 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65 20  else.  #include 
0550: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 65 6e 64  "sqlite3.h".#end
0560: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0570: 6d 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  m length (in byt
0580: 65 73 29 20 6f 66 20 74 68 65 20 70 61 74 74 65  es) of the patte
0590: 72 6e 20 69 6e 20 61 20 4c 49 4b 45 20 6f 72 20  rn in a LIKE or 
05a0: 47 4c 4f 42 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  GLOB.** operator
05b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
05c0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
05d0: 54 45 52 4e 5f 4c 45 4e 47 54 48 0a 23 20 64 65  TERN_LENGTH.# de
05e0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
05f0: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
0600: 47 54 48 20 35 30 30 30 30 0a 23 65 6e 64 69 66  GTH 50000.#endif
0610: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73 69 6f 6e 20  ../*.** Version 
0620: 6f 66 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  of sqlite3_free(
0630: 29 20 74 68 61 74 20 69 73 20 61 6c 77 61 79 73  ) that is always
0640: 20 61 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 65 76   a function, nev
0650: 65 72 20 61 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 73  er a macro..*/.s
0660: 74 61 74 69 63 20 76 6f 69 64 20 78 46 72 65 65  tatic void xFree
0670: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71 6c  (void *p){.  sql
0680: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
0690: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
06a0: 77 6f 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  wo UTF-8 strings
06b0: 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 77 68   for equality wh
06c0: 65 72 65 20 74 68 65 20 66 69 72 73 74 20 73 74  ere the first st
06d0: 72 69 6e 67 20 69 73 0a 2a 2a 20 61 20 22 4c 49  ring is.** a "LI
06e0: 4b 45 22 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  KE" expression. 
06f0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20  Return true (1) 
0700: 69 66 20 74 68 65 79 20 61 72 65 20 74 68 65 20  if they are the 
0710: 73 61 6d 65 20 61 6e 64 20 0a 2a 2a 20 66 61 6c  same and .** fal
0720: 73 65 20 28 30 29 20 69 66 20 74 68 65 79 20 61  se (0) if they a
0730: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2f  re different..*/
0740: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 63 75 4c  .static int icuL
0750: 69 6b 65 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f  ikeCompare(.  co
0760: 6e 73 74 20 75 69 6e 74 38 5f 74 20 2a 7a 50 61  nst uint8_t *zPa
0770: 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4c 49 4b 45  ttern,   /* LIKE
0780: 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f   pattern */.  co
0790: 6e 73 74 20 75 69 6e 74 38 5f 74 20 2a 7a 53 74  nst uint8_t *zSt
07a0: 72 69 6e 67 2c 20 20 20 20 2f 2a 20 54 68 65 20  ring,    /* The 
07b0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
07c0: 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
07d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 43 68 61 72  */.  const UChar
07e0: 33 32 20 75 45 73 63 20 20 20 20 20 20 20 20 20  32 uEsc         
07f0: 2f 2a 20 54 68 65 20 65 73 63 61 70 65 20 63 68  /* The escape ch
0800: 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  aracter */.){.  
0810: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
0820: 20 4d 41 54 43 48 5f 4f 4e 45 20 3d 20 28 55 43   MATCH_ONE = (UC
0830: 68 61 72 33 32 29 27 5f 27 3b 0a 20 20 73 74 61  har32)'_';.  sta
0840: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41  tic const int MA
0850: 54 43 48 5f 41 4c 4c 20 3d 20 28 55 43 68 61 72  TCH_ALL = (UChar
0860: 33 32 29 27 25 27 3b 0a 0a 20 20 69 6e 74 20 69  32)'%';..  int i
0870: 50 61 74 74 65 72 6e 20 3d 20 30 3b 20 20 20 20  Pattern = 0;    
0880: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
0890: 74 65 20 69 6e 64 65 78 20 69 6e 20 7a 50 61 74  te index in zPat
08a0: 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  tern */.  int iS
08b0: 74 72 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  tring = 0;      
08c0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
08d0: 65 20 69 6e 64 65 78 20 69 6e 20 7a 53 74 72 69  e index in zStri
08e0: 6e 67 20 2a 2f 0a 0a 20 20 69 6e 74 20 70 72 65  ng */..  int pre
08f0: 76 45 73 63 61 70 65 20 3d 20 30 3b 20 20 20 20  vEscape = 0;    
0900: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0910: 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
0920: 65 72 20 77 61 73 20 75 45 73 63 20 2a 2f 0a 0a  er was uEsc */..
0930: 20 20 77 68 69 6c 65 28 20 7a 50 61 74 74 65 72    while( zPatter
0940: 6e 5b 69 50 61 74 74 65 72 6e 5d 21 3d 30 20 29  n[iPattern]!=0 )
0950: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 28  {..    /* Read (
0960: 61 6e 64 20 63 6f 6e 73 75 6d 65 29 20 74 68 65  and consume) the
0970: 20 6e 65 78 74 20 63 68 61 72 61 63 74 65 72 20   next character 
0980: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 70  from the input p
0990: 61 74 74 65 72 6e 2e 20 2a 2f 0a 20 20 20 20 55  attern. */.    U
09a0: 43 68 61 72 33 32 20 75 50 61 74 74 65 72 6e 3b  Char32 uPattern;
09b0: 0a 20 20 20 20 55 38 5f 4e 45 58 54 5f 55 4e 53  .    U8_NEXT_UNS
09c0: 41 46 45 28 7a 50 61 74 74 65 72 6e 2c 20 69 50  AFE(zPattern, iP
09d0: 61 74 74 65 72 6e 2c 20 75 50 61 74 74 65 72 6e  attern, uPattern
09e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 75 50  );.    assert(uP
09f0: 61 74 74 65 72 6e 21 3d 30 29 3b 0a 0a 20 20 20  attern!=0);..   
0a00: 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
0a10: 77 20 34 20 70 6f 73 73 69 62 69 6c 69 74 69 65  w 4 possibilitie
0a20: 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
0a30: 20 20 20 20 20 31 2e 20 75 50 61 74 74 65 72 6e       1. uPattern
0a40: 20 69 73 20 61 6e 20 75 6e 65 73 63 61 70 65 64   is an unescaped
0a50: 20 6d 61 74 63 68 2d 61 6c 6c 20 63 68 61 72 61   match-all chara
0a60: 63 74 65 72 20 22 25 22 2c 0a 20 20 20 20 2a 2a  cter "%",.    **
0a70: 20 20 20 20 20 32 2e 20 75 50 61 74 74 65 72 6e       2. uPattern
0a80: 20 69 73 20 61 6e 20 75 6e 65 73 63 61 70 65 64   is an unescaped
0a90: 20 6d 61 74 63 68 2d 6f 6e 65 20 63 68 61 72 61   match-one chara
0aa0: 63 74 65 72 20 22 5f 22 2c 0a 20 20 20 20 2a 2a  cter "_",.    **
0ab0: 20 20 20 20 20 33 2e 20 75 50 61 74 74 65 72 6e       3. uPattern
0ac0: 20 69 73 20 61 6e 20 75 6e 65 73 63 61 70 65 64   is an unescaped
0ad0: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
0ae0: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  r, or.    **    
0af0: 20 34 2e 20 75 50 61 74 74 65 72 6e 20 69 73 20   4. uPattern is 
0b00: 74 6f 20 62 65 20 68 61 6e 64 6c 65 64 20 61 73  to be handled as
0b10: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 68 61   an ordinary cha
0b20: 72 61 63 74 65 72 0a 20 20 20 20 2a 2f 0a 20 20  racter.    */.  
0b30: 20 20 69 66 28 20 21 70 72 65 76 45 73 63 61 70    if( !prevEscap
0b40: 65 20 26 26 20 75 50 61 74 74 65 72 6e 3d 3d 4d  e && uPattern==M
0b50: 41 54 43 48 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ATCH_ALL ){.    
0b60: 20 20 2f 2a 20 43 61 73 65 20 31 2e 20 2a 2f 0a    /* Case 1. */.
0b70: 20 20 20 20 20 20 75 69 6e 74 38 5f 74 20 63 3b        uint8_t c;
0b80: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20  ..      /* Skip 
0b90: 61 6e 79 20 4d 41 54 43 48 5f 41 4c 4c 20 6f 72  any MATCH_ALL or
0ba0: 20 4d 41 54 43 48 5f 4f 4e 45 20 63 68 61 72 61   MATCH_ONE chara
0bb0: 63 74 65 72 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cters that follo
0bc0: 77 20 61 0a 20 20 20 20 20 20 2a 2a 20 4d 41 54  w a.      ** MAT
0bd0: 43 48 5f 41 4c 4c 2e 20 46 6f 72 20 65 61 63 68  CH_ALL. For each
0be0: 20 4d 41 54 43 48 5f 4f 4e 45 2c 20 73 6b 69 70   MATCH_ONE, skip
0bf0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   one character i
0c00: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
0c10: 74 65 73 74 20 73 74 72 69 6e 67 2e 0a 20 20 20  test string..   
0c20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
0c30: 65 28 20 28 63 3d 7a 50 61 74 74 65 72 6e 5b 69  e( (c=zPattern[i
0c40: 50 61 74 74 65 72 6e 5d 29 20 3d 3d 20 4d 41 54  Pattern]) == MAT
0c50: 43 48 5f 41 4c 4c 20 7c 7c 20 63 20 3d 3d 20 4d  CH_ALL || c == M
0c60: 41 54 43 48 5f 4f 4e 45 20 29 7b 0a 20 20 20 20  ATCH_ONE ){.    
0c70: 20 20 20 20 69 66 28 20 63 3d 3d 4d 41 54 43 48      if( c==MATCH
0c80: 5f 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  _ONE ){.        
0c90: 20 20 69 66 28 20 7a 53 74 72 69 6e 67 5b 69 53    if( zString[iS
0ca0: 74 72 69 6e 67 5d 3d 3d 30 20 29 20 72 65 74 75  tring]==0 ) retu
0cb0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
0cc0: 55 38 5f 46 57 44 5f 31 5f 55 4e 53 41 46 45 28  U8_FWD_1_UNSAFE(
0cd0: 7a 53 74 72 69 6e 67 2c 20 69 53 74 72 69 6e 67  zString, iString
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0cf0: 20 20 20 20 20 69 50 61 74 74 65 72 6e 2b 2b 3b       iPattern++;
0d00: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
0d10: 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 69 50 61  if( zPattern[iPa
0d20: 74 74 65 72 6e 5d 3d 3d 30 20 29 20 72 65 74 75  ttern]==0 ) retu
0d30: 72 6e 20 31 3b 0a 0a 20 20 20 20 20 20 77 68 69  rn 1;..      whi
0d40: 6c 65 28 20 7a 53 74 72 69 6e 67 5b 69 53 74 72  le( zString[iStr
0d50: 69 6e 67 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ing] ){.        
0d60: 69 66 28 20 69 63 75 4c 69 6b 65 43 6f 6d 70 61  if( icuLikeCompa
0d70: 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 69 50 61  re(&zPattern[iPa
0d80: 74 74 65 72 6e 5d 2c 20 26 7a 53 74 72 69 6e 67  ttern], &zString
0d90: 5b 69 53 74 72 69 6e 67 5d 2c 20 75 45 73 63 29  [iString], uEsc)
0da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
0db0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
0dc0: 7d 0a 20 20 20 20 20 20 20 20 55 38 5f 46 57 44  }.        U8_FWD
0dd0: 5f 31 5f 55 4e 53 41 46 45 28 7a 53 74 72 69 6e  _1_UNSAFE(zStrin
0de0: 67 2c 20 69 53 74 72 69 6e 67 29 3b 0a 20 20 20  g, iString);.   
0df0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
0e00: 6e 20 30 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 20  n 0;..    }else 
0e10: 69 66 28 20 21 70 72 65 76 45 73 63 61 70 65 20  if( !prevEscape 
0e20: 26 26 20 75 50 61 74 74 65 72 6e 3d 3d 4d 41 54  && uPattern==MAT
0e30: 43 48 5f 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  CH_ONE ){.      
0e40: 2f 2a 20 43 61 73 65 20 32 2e 20 2a 2f 0a 20 20  /* Case 2. */.  
0e50: 20 20 20 20 69 66 28 20 7a 53 74 72 69 6e 67 5b      if( zString[
0e60: 69 53 74 72 69 6e 67 5d 3d 3d 30 20 29 20 72 65  iString]==0 ) re
0e70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 55 38  turn 0;.      U8
0e80: 5f 46 57 44 5f 31 5f 55 4e 53 41 46 45 28 7a 53  _FWD_1_UNSAFE(zS
0e90: 74 72 69 6e 67 2c 20 69 53 74 72 69 6e 67 29 3b  tring, iString);
0ea0: 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
0eb0: 21 70 72 65 76 45 73 63 61 70 65 20 26 26 20 75  !prevEscape && u
0ec0: 50 61 74 74 65 72 6e 3d 3d 75 45 73 63 29 7b 0a  Pattern==uEsc){.
0ed0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 2e        /* Case 3.
0ee0: 20 2a 2f 0a 20 20 20 20 20 20 70 72 65 76 45 73   */.      prevEs
0ef0: 63 61 70 65 20 3d 20 31 3b 0a 0a 20 20 20 20 7d  cape = 1;..    }
0f00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43  else{.      /* C
0f10: 61 73 65 20 34 2e 20 2a 2f 0a 20 20 20 20 20 20  ase 4. */.      
0f20: 55 43 68 61 72 33 32 20 75 53 74 72 69 6e 67 3b  UChar32 uString;
0f30: 0a 20 20 20 20 20 20 55 38 5f 4e 45 58 54 5f 55  .      U8_NEXT_U
0f40: 4e 53 41 46 45 28 7a 53 74 72 69 6e 67 2c 20 69  NSAFE(zString, i
0f50: 53 74 72 69 6e 67 2c 20 75 53 74 72 69 6e 67 29  String, uString)
0f60: 3b 0a 20 20 20 20 20 20 75 53 74 72 69 6e 67 20  ;.      uString 
0f70: 3d 20 75 5f 66 6f 6c 64 43 61 73 65 28 75 53 74  = u_foldCase(uSt
0f80: 72 69 6e 67 2c 20 55 5f 46 4f 4c 44 5f 43 41 53  ring, U_FOLD_CAS
0f90: 45 5f 44 45 46 41 55 4c 54 29 3b 0a 20 20 20 20  E_DEFAULT);.    
0fa0: 20 20 75 50 61 74 74 65 72 6e 20 3d 20 75 5f 66    uPattern = u_f
0fb0: 6f 6c 64 43 61 73 65 28 75 50 61 74 74 65 72 6e  oldCase(uPattern
0fc0: 2c 20 55 5f 46 4f 4c 44 5f 43 41 53 45 5f 44 45  , U_FOLD_CASE_DE
0fd0: 46 41 55 4c 54 29 3b 0a 20 20 20 20 20 20 69 66  FAULT);.      if
0fe0: 28 20 75 53 74 72 69 6e 67 21 3d 75 50 61 74 74  ( uString!=uPatt
0ff0: 65 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ern ){.        r
1000: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1010: 0a 20 20 20 20 20 20 70 72 65 76 45 73 63 61 70  .      prevEscap
1020: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
1030: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 72 69  ..  return zStri
1040: 6e 67 5b 69 53 74 72 69 6e 67 5d 3d 3d 30 3b 0a  ng[iString]==0;.
1050: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1060: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
1070: 69 6b 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ike() SQL functi
1080: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
1090: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  on implements.**
10a0: 20 74 68 65 20 62 75 69 6c 64 2d 69 6e 20 4c 49   the build-in LI
10b0: 4b 45 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68  KE operator.  Th
10c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
10e0: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 74 74 65   is the.** patte
10f0: 72 6e 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  rn and the secon
1100: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
1110: 65 20 73 74 72 69 6e 67 2e 20 20 53 6f 2c 20 74  e string.  So, t
1120: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1130: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41  s:.**.**       A
1140: 20 4c 49 4b 45 20 42 0a 2a 2a 0a 2a 2a 20 69 73   LIKE B.**.** is
1150: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1160: 6c 69 6b 65 28 42 2c 20 41 29 2e 20 49 66 20 74  like(B, A). If t
1170: 68 65 72 65 20 69 73 20 61 6e 20 65 73 63 61 70  here is an escap
1180: 65 20 63 68 61 72 61 63 74 65 72 20 45 2c 20 0a  e character E, .
1190: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 41 20 4c 49  **.**       A LI
11a0: 4b 45 20 42 20 45 53 43 41 50 45 20 45 0a 2a 2a  KE B ESCAPE E.**
11b0: 0a 2a 2a 20 69 73 20 6d 61 70 70 65 64 20 74 6f  .** is mapped to
11c0: 20 6c 69 6b 65 28 42 2c 20 41 2c 20 45 29 2e 0a   like(B, A, E)..
11d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
11e0: 63 75 4c 69 6b 65 46 75 6e 63 28 0a 20 20 73 71  cuLikeFunc(.  sq
11f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1200: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
1210: 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  rgc, .  sqlite3_
1220: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1230: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1240: 20 63 68 61 72 20 2a 7a 41 20 3d 20 73 71 6c 69   char *zA = sqli
1250: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1260: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[0]);.  const
1270: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1280: 7a 42 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  zB = sqlite3_val
1290: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
12a0: 3b 0a 20 20 55 43 68 61 72 33 32 20 75 45 73 63  ;.  UChar32 uEsc
12b0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 69 6d 69   = 0;..  /* Limi
12c0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
12d0: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
12e0: 20 70 61 74 74 65 72 6e 20 74 6f 20 61 76 6f 69   pattern to avoi
12f0: 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20  d problems.  ** 
1300: 6f 66 20 64 65 65 70 20 72 65 63 75 72 73 69 6f  of deep recursio
1310: 6e 20 61 6e 64 20 4e 2a 4e 20 62 65 68 61 76 69  n and N*N behavi
1320: 6f 72 20 69 6e 20 70 61 74 74 65 72 6e 43 6f 6d  or in patternCom
1330: 70 61 72 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  pare()..  */.  i
1340: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
1350: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3e  _bytes(argv[0])>
1360: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
1370: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
1380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1390: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
13a0: 78 74 2c 20 22 4c 49 4b 45 20 6f 72 20 47 4c 4f  xt, "LIKE or GLO
13b0: 42 20 70 61 74 74 65 72 6e 20 74 6f 6f 20 63 6f  B pattern too co
13c0: 6d 70 6c 65 78 22 2c 20 2d 31 29 3b 0a 20 20 20  mplex", -1);.   
13d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 0a 20   return;.  }... 
13e0: 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a   if( argc==3 ){.
13f0: 20 20 20 20 2f 2a 20 54 68 65 20 65 73 63 61 70      /* The escap
1400: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
1410: 6e 67 20 6d 75 73 74 20 63 6f 6e 73 69 73 74 20  ng must consist 
1420: 6f 66 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d  of a single UTF-
1430: 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  8 character..   
1440: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
1450: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
1460: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1470: 45 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  E= sqlite3_value
1480: 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 3b  _bytes(argv[2]);
1490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
14a0: 6e 65 64 20 63 68 61 72 20 2a 7a 45 20 3d 20 73  ned char *zE = s
14b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14c0: 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  t(argv[2]);.    
14d0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
14e0: 66 28 20 7a 45 3d 3d 30 20 29 20 72 65 74 75 72  f( zE==0 ) retur
14f0: 6e 3b 0a 20 20 20 20 55 38 5f 4e 45 58 54 28 7a  n;.    U8_NEXT(z
1500: 45 2c 20 69 2c 20 6e 45 2c 20 75 45 73 63 29 3b  E, i, nE, uEsc);
1510: 0a 20 20 20 20 69 66 28 20 69 21 3d 6e 45 29 7b  .    if( i!=nE){
1520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1530: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
1540: 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
1550: 22 45 53 43 41 50 45 20 65 78 70 72 65 73 73 69  "ESCAPE expressi
1560: 6f 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e  on must be a sin
1570: 67 6c 65 20 63 68 61 72 61 63 74 65 72 22 2c 20  gle character", 
1580: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
1590: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
15a0: 69 66 28 20 7a 41 20 26 26 20 7a 42 20 29 7b 0a  if( zA && zB ){.
15b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
15c0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
15d0: 69 63 75 4c 69 6b 65 43 6f 6d 70 61 72 65 28 7a  icuLikeCompare(z
15e0: 41 2c 20 7a 42 2c 20 75 45 73 63 29 29 3b 0a 20  A, zB, uEsc));. 
15f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1600: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1610: 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 43 55 20  led when an ICU 
1620: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1630: 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74  from within.** t
1640: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1650: 6e 20 6f 66 20 61 6e 20 53 51 4c 20 73 63 61 6c  n of an SQL scal
1660: 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ar function retu
1670: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  rns an error..**
1680: 0a 2a 2a 20 54 68 65 20 73 63 61 6c 61 72 20 66  .** The scalar f
1690: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20  unction context 
16a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
16b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
16c0: 0a 2a 2a 20 6c 6f 61 64 65 64 20 77 69 74 68 20  .** loaded with 
16d0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
16e0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f   based on the fo
16f0: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 61 72 67 73  llowing two args
1700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1710: 20 69 63 75 46 75 6e 63 74 69 6f 6e 45 72 72 6f   icuFunctionErro
1720: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  r(.  sqlite3_con
1730: 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
1740: 20 20 2f 2a 20 53 51 4c 69 74 65 20 73 63 61 6c    /* SQLite scal
1750: 61 72 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  ar function cont
1760: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
1770: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
1780: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1790: 20 49 43 55 20 66 75 6e 63 74 69 6f 6e 20 74 68   ICU function th
17a0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 55  at failed */.  U
17b0: 45 72 72 6f 72 43 6f 64 65 20 65 20 20 20 20 20  ErrorCode e     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
17d0: 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
17e0: 65 64 20 62 79 20 49 43 55 20 66 75 6e 63 74 69  ed by ICU functi
17f0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  on */.){.  char 
1800: 7a 42 75 66 5b 31 32 38 5d 3b 0a 20 20 73 71 6c  zBuf[128];.  sql
1810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 32  ite3_snprintf(12
1820: 38 2c 20 7a 42 75 66 2c 20 22 49 43 55 20 65 72  8, zBuf, "ICU er
1830: 72 6f 72 3a 20 25 73 28 29 3a 20 25 73 22 2c 20  ror: %s(): %s", 
1840: 7a 4e 61 6d 65 2c 20 75 5f 65 72 72 6f 72 4e 61  zName, u_errorNa
1850: 6d 65 28 65 29 29 3b 0a 20 20 7a 42 75 66 5b 31  me(e));.  zBuf[1
1860: 32 37 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 73 71  27] = '\0';.  sq
1870: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1880: 6f 72 28 70 43 74 78 2c 20 7a 42 75 66 2c 20 2d  or(pCtx, zBuf, -
1890: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  1);.}../*.** Fun
18a0: 63 74 69 6f 6e 20 74 6f 20 64 65 6c 65 74 65 20  ction to delete 
18b0: 63 6f 6d 70 69 6c 65 64 20 72 65 67 65 78 70 20  compiled regexp 
18c0: 6f 62 6a 65 63 74 73 2e 20 52 65 67 69 73 74 65  objects. Registe
18d0: 72 65 64 20 61 73 0a 2a 2a 20 61 20 64 65 73 74  red as.** a dest
18e0: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
18f0: 77 69 74 68 20 73 71 6c 69 74 65 33 5f 73 65 74  with sqlite3_set
1900: 5f 61 75 78 64 61 74 61 28 29 2e 0a 2a 2f 0a 73  _auxdata()..*/.s
1910: 74 61 74 69 63 20 76 6f 69 64 20 69 63 75 52 65  tatic void icuRe
1920: 67 65 78 70 44 65 6c 65 74 65 28 76 6f 69 64 20  gexpDelete(void 
1930: 2a 70 29 7b 0a 20 20 55 52 65 67 75 6c 61 72 45  *p){.  URegularE
1940: 78 70 72 65 73 73 69 6f 6e 20 2a 70 45 78 70 72  xpression *pExpr
1950: 20 3d 20 28 55 52 65 67 75 6c 61 72 45 78 70 72   = (URegularExpr
1960: 65 73 73 69 6f 6e 20 2a 29 70 3b 0a 20 20 75 72  ession *)p;.  ur
1970: 65 67 65 78 5f 63 6c 6f 73 65 28 70 45 78 70 72  egex_close(pExpr
1980: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
1990: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51  ementation of SQ
19a0: 4c 69 74 65 20 52 45 47 45 58 50 20 6f 70 65 72  Lite REGEXP oper
19b0: 61 74 6f 72 2e 20 54 68 69 73 20 73 63 61 6c 61  ator. This scala
19c0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  r function takes
19d0: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
19e0: 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  s. The first is 
19f0: 61 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73  a regular expres
1a00: 73 69 6f 6e 20 70 61 74 74 65 72 6e 20 74 6f 20  sion pattern to 
1a10: 63 6f 6d 70 69 6c 65 0a 2a 2a 20 74 68 65 20 73  compile.** the s
1a20: 65 63 6f 6e 64 20 69 73 20 61 20 73 74 72 69 6e  econd is a strin
1a30: 67 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  g to match again
1a40: 73 74 20 74 68 61 74 20 70 61 74 74 65 72 6e 2e  st that pattern.
1a50: 20 49 66 20 65 69 74 68 65 72 20 0a 2a 2a 20 61   If either .** a
1a60: 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 53 51  rgument is an SQ
1a70: 4c 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 4e 55 4c  L NULL, then NUL
1a80: 4c 20 49 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  L Is returned. O
1a90: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 72 65  therwise, the re
1aa0: 73 75 6c 74 0a 2a 2a 20 69 73 20 31 20 69 66 20  sult.** is 1 if 
1ab0: 74 68 65 20 73 74 72 69 6e 67 20 6d 61 74 63 68  the string match
1ac0: 65 73 20 74 68 65 20 70 61 74 74 65 72 6e 2c 20  es the pattern, 
1ad0: 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  or 0 otherwise..
1ae0: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6d 61 70  **.** SQLite map
1af0: 73 20 74 68 65 20 72 65 67 65 78 70 28 29 20 66  s the regexp() f
1b00: 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 72  unction to the r
1b10: 65 67 65 78 70 28 29 20 6f 70 65 72 61 74 6f 72  egexp() operator
1b20: 20 73 75 63 68 0a 2a 2a 20 74 68 61 74 20 74 68   such.** that th
1b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
1b40: 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a  are equivalent:.
1b50: 2a 2a 0a 2a 2a 20 20 20 20 20 7a 53 74 72 69 6e  **.**     zStrin
1b60: 67 20 52 45 47 45 58 50 20 7a 50 61 74 74 65 72  g REGEXP zPatter
1b70: 6e 0a 2a 2a 20 20 20 20 20 72 65 67 65 78 70 28  n.**     regexp(
1b80: 7a 50 61 74 74 65 72 6e 2c 20 7a 53 74 72 69 6e  zPattern, zStrin
1b90: 67 29 0a 2a 2a 0a 2a 2a 20 55 73 65 73 20 74 68  g).**.** Uses th
1ba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 49 43 55 20  e following ICU 
1bb0: 72 65 67 65 78 70 20 41 50 49 73 3a 0a 2a 2a 0a  regexp APIs:.**.
1bc0: 2a 2a 20 20 20 20 20 75 72 65 67 65 78 5f 6f 70  **     uregex_op
1bd0: 65 6e 28 29 0a 2a 2a 20 20 20 20 20 75 72 65 67  en().**     ureg
1be0: 65 78 5f 6d 61 74 63 68 65 73 28 29 0a 2a 2a 20  ex_matches().** 
1bf0: 20 20 20 20 75 72 65 67 65 78 5f 63 6c 6f 73 65      uregex_close
1c00: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
1c10: 64 20 69 63 75 52 65 67 65 78 70 46 75 6e 63 28  d icuRegexpFunc(
1c20: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1c30: 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  *p, int nArg, sq
1c40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1c50: 41 72 67 29 7b 0a 20 20 55 45 72 72 6f 72 43 6f  Arg){.  UErrorCo
1c60: 64 65 20 73 74 61 74 75 73 20 3d 20 55 5f 5a 45  de status = U_ZE
1c70: 52 4f 5f 45 52 52 4f 52 3b 0a 20 20 55 52 65 67  RO_ERROR;.  UReg
1c80: 75 6c 61 72 45 78 70 72 65 73 73 69 6f 6e 20 2a  ularExpression *
1c90: 70 45 78 70 72 3b 0a 20 20 55 42 6f 6f 6c 20 72  pExpr;.  UBool r
1ca0: 65 73 3b 0a 20 20 63 6f 6e 73 74 20 55 43 68 61  es;.  const UCha
1cb0: 72 20 2a 7a 53 74 72 69 6e 67 20 3d 20 73 71 6c  r *zString = sql
1cc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
1cd0: 36 28 61 70 41 72 67 5b 31 5d 29 3b 0a 0a 20 20  6(apArg[1]);..  
1ce0: 2f 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  /* If the left h
1cf0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
1d00: 72 65 67 65 78 70 20 6f 70 65 72 61 74 6f 72 20  regexp operator 
1d10: 69 73 20 4e 55 4c 4c 2c 20 0a 20 20 2a 2a 20 74  is NULL, .  ** t
1d20: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
1d30: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 0a 20 20  s also NULL. .  
1d40: 2a 2f 0a 20 20 69 66 28 20 21 7a 53 74 72 69 6e  */.  if( !zStrin
1d50: 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  g ){.    return;
1d60: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 20 3d 20  .  }..  pExpr = 
1d70: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64  sqlite3_get_auxd
1d80: 61 74 61 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  ata(p, 0);.  if(
1d90: 20 21 70 45 78 70 72 20 29 7b 0a 20 20 20 20 63   !pExpr ){.    c
1da0: 6f 6e 73 74 20 55 43 68 61 72 20 2a 7a 50 61 74  onst UChar *zPat
1db0: 74 65 72 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  tern = sqlite3_v
1dc0: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 70 41 72  alue_text16(apAr
1dd0: 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  g[0]);.    if( !
1de0: 7a 50 61 74 74 65 72 6e 20 29 7b 0a 20 20 20 20  zPattern ){.    
1df0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1e00: 20 20 20 20 70 45 78 70 72 20 3d 20 75 72 65 67      pExpr = ureg
1e10: 65 78 5f 6f 70 65 6e 28 7a 50 61 74 74 65 72 6e  ex_open(zPattern
1e20: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 26 73 74 61  , -1, 0, 0, &sta
1e30: 74 75 73 29 3b 0a 0a 20 20 20 20 69 66 28 20 55  tus);..    if( U
1e40: 5f 53 55 43 43 45 53 53 28 73 74 61 74 75 73 29  _SUCCESS(status)
1e50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e60: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 2c  3_set_auxdata(p,
1e70: 20 30 2c 20 70 45 78 70 72 2c 20 69 63 75 52 65   0, pExpr, icuRe
1e80: 67 65 78 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  gexpDelete);.   
1e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1ea0: 73 65 72 74 28 21 70 45 78 70 72 29 3b 0a 20 20  sert(!pExpr);.  
1eb0: 20 20 20 20 69 63 75 46 75 6e 63 74 69 6f 6e 45      icuFunctionE
1ec0: 72 72 6f 72 28 70 2c 20 22 75 72 65 67 65 78 5f  rror(p, "uregex_
1ed0: 6f 70 65 6e 22 2c 20 73 74 61 74 75 73 29 3b 0a  open", status);.
1ee0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1ef0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
1f00: 6e 66 69 67 75 72 65 20 74 68 65 20 74 65 78 74  nfigure the text
1f10: 20 74 68 61 74 20 74 68 65 20 72 65 67 75 6c 61   that the regula
1f20: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 70 65  r expression ope
1f30: 72 61 74 65 73 20 6f 6e 2e 20 2a 2f 0a 20 20 75  rates on. */.  u
1f40: 72 65 67 65 78 5f 73 65 74 54 65 78 74 28 70 45  regex_setText(pE
1f50: 78 70 72 2c 20 7a 53 74 72 69 6e 67 2c 20 2d 31  xpr, zString, -1
1f60: 2c 20 26 73 74 61 74 75 73 29 3b 0a 20 20 69 66  , &status);.  if
1f70: 28 20 21 55 5f 53 55 43 43 45 53 53 28 73 74 61  ( !U_SUCCESS(sta
1f80: 74 75 73 29 20 29 7b 0a 20 20 20 20 69 63 75 46  tus) ){.    icuF
1f90: 75 6e 63 74 69 6f 6e 45 72 72 6f 72 28 70 2c 20  unctionError(p, 
1fa0: 22 75 72 65 67 65 78 5f 73 65 74 54 65 78 74 22  "uregex_setText"
1fb0: 2c 20 73 74 61 74 75 73 29 3b 0a 20 20 20 20 72  , status);.    r
1fc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
1fd0: 20 41 74 74 65 6d 70 74 20 74 68 65 20 6d 61 74   Attempt the mat
1fe0: 63 68 20 2a 2f 0a 20 20 72 65 73 20 3d 20 75 72  ch */.  res = ur
1ff0: 65 67 65 78 5f 6d 61 74 63 68 65 73 28 70 45 78  egex_matches(pEx
2000: 70 72 2c 20 30 2c 20 26 73 74 61 74 75 73 29 3b  pr, 0, &status);
2010: 0a 20 20 69 66 28 20 21 55 5f 53 55 43 43 45 53  .  if( !U_SUCCES
2020: 53 28 73 74 61 74 75 73 29 20 29 7b 0a 20 20 20  S(status) ){.   
2030: 20 69 63 75 46 75 6e 63 74 69 6f 6e 45 72 72 6f   icuFunctionErro
2040: 72 28 70 2c 20 22 75 72 65 67 65 78 5f 6d 61 74  r(p, "uregex_mat
2050: 63 68 65 73 22 2c 20 73 74 61 74 75 73 29 3b 0a  ches", status);.
2060: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2070: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 65  .  /* Set the te
2080: 78 74 20 74 68 61 74 20 74 68 65 20 72 65 67 75  xt that the regu
2090: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  lar expression o
20a0: 70 65 72 61 74 65 73 20 6f 6e 20 74 6f 20 61 20  perates on to a 
20b0: 4e 55 4c 4c 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  NULL.  ** pointe
20c0: 72 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  r. This is not r
20d0: 65 61 6c 6c 79 20 6e 65 63 65 73 73 61 72 79 2c  eally necessary,
20e0: 20 62 75 74 20 69 74 20 69 73 20 74 69 64 69 65   but it is tidie
20f0: 72 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6c 65 61  r than .  ** lea
2100: 76 69 6e 67 20 74 68 65 20 72 65 67 75 6c 61 72  ving the regular
2110: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
2120: 63 74 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69  ct configured wi
2130: 74 68 20 61 6e 20 69 6e 76 61 6c 69 64 0a 20 20  th an invalid.  
2140: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 66 74 65 72  ** pointer after
2150: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2160: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 75  eturns..  */.  u
2170: 72 65 67 65 78 5f 73 65 74 54 65 78 74 28 70 45  regex_setText(pE
2180: 78 70 72 2c 20 30 2c 20 30 2c 20 26 73 74 61 74  xpr, 0, 0, &stat
2190: 75 73 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  us);..  /* Retur
21a0: 6e 20 31 20 6f 72 20 30 2e 20 2a 2f 0a 20 20 73  n 1 or 0. */.  s
21b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
21c0: 74 28 70 2c 20 72 65 73 20 3f 20 31 20 3a 20 30  t(p, res ? 1 : 0
21d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
21e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 73  ementations of s
21f0: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
2200: 66 6f 72 20 63 61 73 65 20 6d 61 70 70 69 6e 67  for case mapping
2210: 20 2d 20 75 70 70 65 72 28 29 20 61 6e 64 20 0a   - upper() and .
2220: 2a 2a 20 6c 6f 77 65 72 28 29 2e 20 46 75 6e 63  ** lower(). Func
2230: 74 69 6f 6e 20 75 70 70 65 72 28 29 20 63 6f 6e  tion upper() con
2240: 76 65 72 74 73 20 69 74 73 20 69 6e 70 75 74 20  verts its input 
2250: 74 6f 20 75 70 70 65 72 2d 63 61 73 65 20 28 41  to upper-case (A
2260: 42 43 29 2e 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  BC)..** Function
2270: 20 6c 6f 77 65 72 28 29 20 63 6f 6e 76 65 72 74   lower() convert
2280: 73 20 74 6f 20 6c 6f 77 65 72 2d 63 61 73 65 20  s to lower-case 
2290: 28 61 62 63 29 2e 0a 2a 2a 0a 2a 2a 20 49 43 55  (abc)..**.** ICU
22a0: 20 70 72 6f 76 69 64 65 73 20 74 77 6f 20 74 79   provides two ty
22b0: 70 65 73 20 6f 66 20 63 61 73 65 20 6d 61 70 70  pes of case mapp
22c0: 69 6e 67 2c 20 22 67 65 6e 65 72 61 6c 22 20 63  ing, "general" c
22d0: 61 73 65 20 6d 61 70 70 69 6e 67 20 61 6e 64 0a  ase mapping and.
22e0: 2a 2a 20 22 6c 61 6e 67 75 61 67 65 20 73 70 65  ** "language spe
22f0: 63 69 66 69 63 22 2e 20 52 65 66 65 72 20 74 6f  cific". Refer to
2300: 20 49 43 55 20 64 6f 63 75 6d 65 6e 74 61 74 69   ICU documentati
2310: 6f 6e 20 66 6f 72 20 74 68 65 20 64 69 66 66 65  on for the diffe
2320: 72 65 6e 63 65 73 0a 2a 2a 20 62 65 74 77 65 65  rences.** betwee
2330: 6e 20 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a  n the two..**.**
2340: 20 54 6f 20 75 74 69 6c 69 73 65 20 22 67 65 6e   To utilise "gen
2350: 65 72 61 6c 22 20 63 61 73 65 20 6d 61 70 70 69  eral" case mappi
2360: 6e 67 2c 20 74 68 65 20 75 70 70 65 72 28 29 20  ng, the upper() 
2370: 6f 72 20 6c 6f 77 65 72 28 29 20 73 63 61 6c 61  or lower() scala
2380: 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  r .** functions 
2390: 61 72 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68  are invoked with
23a0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 3a 0a 2a   one argument:.*
23b0: 2a 0a 2a 2a 20 20 20 20 20 75 70 70 65 72 28 27  *.**     upper('
23c0: 41 42 43 27 29 20 2d 3e 20 27 61 62 63 27 0a 2a  ABC') -> 'abc'.*
23d0: 2a 20 20 20 20 20 6c 6f 77 65 72 28 27 61 62 63  *     lower('abc
23e0: 27 29 20 2d 3e 20 27 41 42 43 27 0a 2a 2a 0a 2a  ') -> 'ABC'.**.*
23f0: 2a 20 54 6f 20 61 63 63 65 73 73 20 49 43 55 20  * To access ICU 
2400: 22 6c 61 6e 67 75 61 67 65 20 73 70 65 63 69 66  "language specif
2410: 69 63 22 20 63 61 73 65 20 6d 61 70 70 69 6e 67  ic" case mapping
2420: 2c 20 75 70 70 65 72 28 29 20 6f 72 20 6c 6f 77  , upper() or low
2430: 65 72 28 29 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  er().** should b
2440: 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 74  e invoked with t
2450: 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68  wo arguments. Th
2460: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2470: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  t is the name.**
2480: 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 65 20 74   of the locale t
2490: 6f 20 75 73 65 2e 20 50 61 73 73 69 6e 67 20 61  o use. Passing a
24a0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 28  n empty string (
24b0: 22 22 29 20 6f 72 20 53 51 4c 20 4e 55 4c 4c 20  "") or SQL NULL 
24c0: 76 61 6c 75 65 0a 2a 2a 20 61 73 20 74 68 65 20  value.** as the 
24d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
24e0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 69  is the same as i
24f0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 31 20 61 72  nvoking the 1 ar
2500: 67 75 6d 65 6e 74 20 76 65 72 73 69 6f 6e 0a 2a  gument version.*
2510: 2a 20 6f 66 20 75 70 70 65 72 28 29 20 6f 72 20  * of upper() or 
2520: 6c 6f 77 65 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  lower()..**.**  
2530: 20 20 20 6c 6f 77 65 72 28 27 49 27 2c 20 27 65     lower('I', 'e
2540: 6e 5f 75 73 27 29 20 2d 3e 20 27 69 27 0a 2a 2a  n_us') -> 'i'.**
2550: 20 20 20 20 20 6c 6f 77 65 72 28 27 49 27 2c 20       lower('I', 
2560: 27 74 72 5f 74 72 27 29 20 2d 3e 20 27 c4 b1 27  'tr_tr') -> '..'
2570: 20 28 73 6d 61 6c 6c 20 64 6f 74 6c 65 73 73 20   (small dotless 
2580: 69 29 0a 2a 2a 0a 2a 2a 20 68 74 74 70 3a 2f 2f  i).**.** http://
2590: 77 77 77 2e 69 63 75 2d 70 72 6f 6a 65 63 74 2e  www.icu-project.
25a0: 6f 72 67 2f 75 73 65 72 67 75 69 64 65 2f 70 6f  org/userguide/po
25b0: 73 69 78 2e 68 74 6d 6c 23 63 61 73 65 5f 6d 61  six.html#case_ma
25c0: 70 70 69 6e 67 73 0a 2a 2f 0a 73 74 61 74 69 63  ppings.*/.static
25d0: 20 76 6f 69 64 20 69 63 75 43 61 73 65 46 75 6e   void icuCaseFun
25e0: 63 31 36 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  c16(sqlite3_cont
25f0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67  ext *p, int nArg
2600: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
2610: 2a 2a 61 70 41 72 67 29 7b 0a 20 20 63 6f 6e 73  **apArg){.  cons
2620: 74 20 55 43 68 61 72 20 2a 7a 49 6e 70 75 74 3b  t UChar *zInput;
2630: 0a 20 20 55 43 68 61 72 20 2a 7a 4f 75 74 70 75  .  UChar *zOutpu
2640: 74 3b 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b  t;.  int nInput;
2650: 0a 20 20 69 6e 74 20 6e 4f 75 74 70 75 74 3b 0a  .  int nOutput;.
2660: 0a 20 20 55 45 72 72 6f 72 43 6f 64 65 20 73 74  .  UErrorCode st
2670: 61 74 75 73 20 3d 20 55 5f 5a 45 52 4f 5f 45 52  atus = U_ZERO_ER
2680: 52 4f 52 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ROR;.  const cha
2690: 72 20 2a 7a 4c 6f 63 61 6c 65 20 3d 20 30 3b 0a  r *zLocale = 0;.
26a0: 0a 20 20 61 73 73 65 72 74 28 6e 41 72 67 3d 3d  .  assert(nArg==
26b0: 31 20 7c 7c 20 6e 41 72 67 3d 3d 32 29 3b 0a 20  1 || nArg==2);. 
26c0: 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
26d0: 20 20 20 20 7a 4c 6f 63 61 6c 65 20 3d 20 28 63      zLocale = (c
26e0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
26f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2700: 70 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 0a 20  pArg[1]);.  }.. 
2710: 20 7a 49 6e 70 75 74 20 3d 20 73 71 6c 69 74 65   zInput = sqlite
2720: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
2730: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20  pArg[0]);.  if( 
2740: 21 7a 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 72  !zInput ){.    r
2750: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 49 6e  eturn;.  }.  nIn
2760: 70 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  put = sqlite3_va
2770: 6c 75 65 5f 62 79 74 65 73 31 36 28 61 70 41 72  lue_bytes16(apAr
2780: 67 5b 30 5d 29 3b 0a 0a 20 20 6e 4f 75 74 70 75  g[0]);..  nOutpu
2790: 74 20 3d 20 6e 49 6e 70 75 74 20 2a 20 32 20 2b  t = nInput * 2 +
27a0: 20 32 3b 0a 20 20 7a 4f 75 74 70 75 74 20 3d 20   2;.  zOutput = 
27b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
27c0: 4f 75 74 70 75 74 29 3b 0a 20 20 69 66 28 20 21  Output);.  if( !
27d0: 7a 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 72  zOutput ){.    r
27e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
27f0: 28 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  ( sqlite3_user_d
2800: 61 74 61 28 70 29 20 29 7b 0a 20 20 20 20 75 5f  ata(p) ){.    u_
2810: 73 74 72 54 6f 55 70 70 65 72 28 7a 4f 75 74 70  strToUpper(zOutp
2820: 75 74 2c 20 6e 4f 75 74 70 75 74 2f 32 2c 20 7a  ut, nOutput/2, z
2830: 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74 2f 32 2c  Input, nInput/2,
2840: 20 7a 4c 6f 63 61 6c 65 2c 20 26 73 74 61 74 75   zLocale, &statu
2850: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
2860: 20 75 5f 73 74 72 54 6f 4c 6f 77 65 72 28 7a 4f   u_strToLower(zO
2870: 75 74 70 75 74 2c 20 6e 4f 75 74 70 75 74 2f 32  utput, nOutput/2
2880: 2c 20 7a 49 6e 70 75 74 2c 20 6e 49 6e 70 75 74  , zInput, nInput
2890: 2f 32 2c 20 7a 4c 6f 63 61 6c 65 2c 20 26 73 74  /2, zLocale, &st
28a0: 61 74 75 73 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  atus);.  }..  if
28b0: 28 20 21 55 5f 53 55 43 43 45 53 53 28 73 74 61  ( !U_SUCCESS(sta
28c0: 74 75 73 29 20 29 7b 0a 20 20 20 20 69 63 75 46  tus) ){.    icuF
28d0: 75 6e 63 74 69 6f 6e 45 72 72 6f 72 28 70 2c 20  unctionError(p, 
28e0: 22 75 5f 73 74 72 54 6f 4c 6f 77 65 72 28 29 2f  "u_strToLower()/
28f0: 75 5f 73 74 72 54 6f 55 70 70 65 72 22 2c 20 73  u_strToUpper", s
2900: 74 61 74 75 73 29 3b 0a 20 20 20 20 72 65 74 75  tatus);.    retu
2910: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  rn;.  }..  sqlit
2920: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
2930: 28 70 2c 20 7a 4f 75 74 70 75 74 2c 20 2d 31 2c  (p, zOutput, -1,
2940: 20 78 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   xFree);.}../*.*
2950: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
2960: 65 6e 63 65 20 64 65 73 74 72 75 63 74 6f 72 20  ence destructor 
2970: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 70 43  function. The pC
2980: 74 78 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  tx argument poin
2990: 74 73 20 74 6f 0a 2a 2a 20 61 20 55 43 6f 6c 6c  ts to.** a UColl
29a0: 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20 70  ator structure p
29b0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
29c0: 74 65 64 20 75 73 69 6e 67 20 75 63 6f 6c 5f 6f  ted using ucol_o
29d0: 70 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pen()..*/.static
29e0: 20 76 6f 69 64 20 69 63 75 43 6f 6c 6c 61 74 69   void icuCollati
29f0: 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78  onDel(void *pCtx
2a00: 29 7b 0a 20 20 55 43 6f 6c 6c 61 74 6f 72 20 2a  ){.  UCollator *
2a10: 70 20 3d 20 28 55 43 6f 6c 6c 61 74 6f 72 20 2a  p = (UCollator *
2a20: 29 70 43 74 78 3b 0a 20 20 75 63 6f 6c 5f 63 6c  )pCtx;.  ucol_cl
2a30: 6f 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(p);.}../*.**
2a40: 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
2a50: 6e 63 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  nce comparison f
2a60: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 70 43 74  unction. The pCt
2a70: 78 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74  x argument point
2a80: 73 20 74 6f 0a 2a 2a 20 61 20 55 43 6f 6c 6c 61  s to.** a UColla
2a90: 74 6f 72 20 73 74 72 75 63 74 75 72 65 20 70 72  tor structure pr
2aa0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
2ab0: 65 64 20 75 73 69 6e 67 20 75 63 6f 6c 5f 6f 70  ed using ucol_op
2ac0: 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  en()..*/.static 
2ad0: 69 6e 74 20 69 63 75 43 6f 6c 6c 61 74 69 6f 6e  int icuCollation
2ae0: 43 6f 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 70 43  Coll(.  void *pC
2af0: 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c  tx,.  int nLeft,
2b00: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
2b10: 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67  Left,.  int nRig
2b20: 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ht,.  const void
2b30: 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 55 43   *zRight.){.  UC
2b40: 6f 6c 6c 61 74 69 6f 6e 52 65 73 75 6c 74 20 72  ollationResult r
2b50: 65 73 3b 0a 20 20 55 43 6f 6c 6c 61 74 6f 72 20  es;.  UCollator 
2b60: 2a 70 20 3d 20 28 55 43 6f 6c 6c 61 74 6f 72 20  *p = (UCollator 
2b70: 2a 29 70 43 74 78 3b 0a 20 20 72 65 73 20 3d 20  *)pCtx;.  res = 
2b80: 75 63 6f 6c 5f 73 74 72 63 6f 6c 6c 28 70 2c 20  ucol_strcoll(p, 
2b90: 28 55 43 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20  (UChar *)zLeft, 
2ba0: 6e 4c 65 66 74 2f 32 2c 20 28 55 43 68 61 72 20  nLeft/2, (UChar 
2bb0: 2a 29 7a 52 69 67 68 74 2c 20 6e 52 69 67 68 74  *)zRight, nRight
2bc0: 2f 32 29 3b 0a 20 20 73 77 69 74 63 68 28 20 72  /2);.  switch( r
2bd0: 65 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 55  es ){.    case U
2be0: 43 4f 4c 5f 4c 45 53 53 3a 20 20 20 20 72 65 74  COL_LESS:    ret
2bf0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 63 61 73 65  urn -1;.    case
2c00: 20 55 43 4f 4c 5f 47 52 45 41 54 45 52 3a 20 72   UCOL_GREATER: r
2c10: 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 63 61  eturn +1;.    ca
2c20: 73 65 20 55 43 4f 4c 5f 45 51 55 41 4c 3a 20 20  se UCOL_EQUAL:  
2c30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2c40: 20 61 73 73 65 72 74 28 21 22 55 6e 65 78 70 65   assert(!"Unexpe
2c50: 63 74 65 64 20 72 65 74 75 72 6e 20 76 61 6c 75  cted return valu
2c60: 65 20 66 72 6f 6d 20 75 63 6f 6c 5f 73 74 72 63  e from ucol_strc
2c70: 6f 6c 6c 28 29 22 29 3b 0a 20 20 72 65 74 75 72  oll()");.  retur
2c80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
2c90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2ca0: 74 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74  the scalar funct
2cb0: 69 6f 6e 20 69 63 75 5f 6c 6f 61 64 5f 63 6f 6c  ion icu_load_col
2cc0: 6c 61 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20  lation()..**.** 
2cd0: 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63  This scalar func
2ce0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2cf0: 61 64 64 20 49 43 55 20 63 6f 6c 6c 61 74 69 6f  add ICU collatio
2d00: 6e 20 62 61 73 65 64 20 63 6f 6c 6c 61 74 69 6f  n based collatio
2d10: 6e 20 0a 2a 2a 20 74 79 70 65 73 20 74 6f 20 61  n .** types to a
2d20: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
2d30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 74  e connection. It
2d40: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2d50: 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 73 20  be called.** as 
2d60: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2d70: 20 20 20 53 45 4c 45 43 54 20 69 63 75 5f 6c 6f     SELECT icu_lo
2d80: 61 64 5f 63 6f 6c 6c 61 74 69 6f 6e 28 3c 6c 6f  ad_collation(<lo
2d90: 63 61 6c 65 3e 2c 20 3c 63 6f 6c 6c 61 74 69 6f  cale>, <collatio
2da0: 6e 2d 6e 61 6d 65 3e 29 3b 0a 2a 2a 0a 2a 2a 20  n-name>);.**.** 
2db0: 57 68 65 72 65 20 3c 6c 6f 63 61 6c 65 3e 20 69  Where <locale> i
2dc0: 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  s a string conta
2dd0: 69 6e 69 6e 67 20 61 6e 20 49 43 55 20 6c 6f 63  ining an ICU loc
2de0: 61 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 28  ale identifier (
2df0: 69 2e 65 2e 0a 2a 2a 20 22 65 6e 5f 41 55 22 2c  i.e..** "en_AU",
2e00: 20 22 74 72 5f 54 52 22 20 65 74 63 2e 29 20 61   "tr_TR" etc.) a
2e10: 6e 64 20 3c 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  nd <collation-na
2e20: 6d 65 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me> is the name 
2e30: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  of the.** collat
2e40: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ion sequence to 
2e50: 63 72 65 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  create..*/.stati
2e60: 63 20 76 6f 69 64 20 69 63 75 4c 6f 61 64 43 6f  c void icuLoadCo
2e70: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
2e80: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 0a  e3_context *p, .
2e90: 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 73    int nArg, .  s
2ea0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2eb0: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
2ec0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
2ed0: 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
2ee0: 64 61 74 61 28 70 29 3b 0a 20 20 55 45 72 72 6f  data(p);.  UErro
2ef0: 72 43 6f 64 65 20 73 74 61 74 75 73 20 3d 20 55  rCode status = U
2f00: 5f 5a 45 52 4f 5f 45 52 52 4f 52 3b 0a 20 20 63  _ZERO_ERROR;.  c
2f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 61  onst char *zLoca
2f20: 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  le;      /* Loca
2f30: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 2d 20  le identifier - 
2f40: 28 65 67 2e 20 22 6a 70 5f 4a 50 22 29 20 2a 2f  (eg. "jp_JP") */
2f50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f60: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Name;        /* 
2f70: 53 51 4c 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  SQL Collation se
2f80: 71 75 65 6e 63 65 20 6e 61 6d 65 20 28 65 67 2e  quence name (eg.
2f90: 20 22 6a 61 70 61 6e 65 73 65 22 29 20 2a 2f 0a   "japanese") */.
2fa0: 20 20 55 43 6f 6c 6c 61 74 6f 72 20 2a 70 55 43    UCollator *pUC
2fb0: 6f 6c 6c 61 74 6f 72 3b 20 20 20 20 2f 2a 20 49  ollator;    /* I
2fc0: 43 55 20 6c 69 62 72 61 72 79 20 63 6f 6c 6c 61  CU library colla
2fd0: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
2fe0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
3000: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
3010: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
3020: 6c 6c 61 74 69 6f 6e 5f 78 28 29 20 2a 2f 0a 0a  llation_x() */..
3030: 20 20 61 73 73 65 72 74 28 6e 41 72 67 3d 3d 32    assert(nArg==2
3040: 29 3b 0a 20 20 7a 4c 6f 63 61 6c 65 20 3d 20 28  );.  zLocale = (
3050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
3060: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
3070: 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 7a 4e 61  apArg[0]);.  zNa
3080: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
3090: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
30a0: 5f 74 65 78 74 28 61 70 41 72 67 5b 31 5d 29 3b  _text(apArg[1]);
30b0: 0a 0a 20 20 69 66 28 20 21 7a 4c 6f 63 61 6c 65  ..  if( !zLocale
30c0: 20 7c 7c 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20   || !zName ){.  
30d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
30e0: 20 70 55 43 6f 6c 6c 61 74 6f 72 20 3d 20 75 63   pUCollator = uc
30f0: 6f 6c 5f 6f 70 65 6e 28 7a 4c 6f 63 61 6c 65 2c  ol_open(zLocale,
3100: 20 26 73 74 61 74 75 73 29 3b 0a 20 20 69 66 28   &status);.  if(
3110: 20 21 55 5f 53 55 43 43 45 53 53 28 73 74 61 74   !U_SUCCESS(stat
3120: 75 73 29 20 29 7b 0a 20 20 20 20 69 63 75 46 75  us) ){.    icuFu
3130: 6e 63 74 69 6f 6e 45 72 72 6f 72 28 70 2c 20 22  nctionError(p, "
3140: 75 63 6f 6c 5f 6f 70 65 6e 22 2c 20 73 74 61 74  ucol_open", stat
3150: 75 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  us);.    return;
3160: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 29  .  }.  assert(p)
3170: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
3180: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
3190: 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c  on_v2(db, zName,
31a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 28   SQLITE_UTF16, (
31b0: 76 6f 69 64 20 2a 29 70 55 43 6f 6c 6c 61 74 6f  void *)pUCollato
31c0: 72 2c 20 0a 20 20 20 20 20 20 69 63 75 43 6f 6c  r, .      icuCol
31d0: 6c 61 74 69 6f 6e 43 6f 6c 6c 2c 20 69 63 75 43  lationColl, icuC
31e0: 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b  ollationDel.  );
31f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3200: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 63 6f 6c  E_OK ){.    ucol
3210: 5f 63 6c 6f 73 65 28 70 55 43 6f 6c 6c 61 74 6f  _close(pUCollato
3220: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
3230: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 2c 20  result_error(p, 
3240: 22 45 72 72 6f 72 20 72 65 67 69 73 74 65 72 69  "Error registeri
3250: 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  ng collation fun
3260: 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d  ction", -1);.  }
3270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
3280: 65 72 20 74 68 65 20 49 43 55 20 65 78 74 65 6e  er the ICU exten
3290: 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 77  sion functions w
32a0: 69 74 68 20 64 61 74 61 62 61 73 65 20 64 62 2e  ith database db.
32b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
32c0: 63 75 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a  cuInit(sqlite3 *
32d0: 64 62 29 7b 0a 20 20 73 74 72 75 63 74 20 49 63  db){.  struct Ic
32e0: 75 53 63 61 6c 61 72 20 7b 0a 20 20 20 20 63 6f  uScalar {.    co
32f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
3320: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
3330: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3360: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3370: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 63 3b   */.    int enc;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 2f 2a 20 4f 70 74 69 6d 61 6c 20 74 65 78    /* Optimal tex
33b0: 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  t encoding */.  
33c0: 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
33d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
33f0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
3400: 28 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  () context */.  
3410: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
3420: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
3430: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
3440: 75 65 2a 2a 29 3b 0a 20 20 7d 20 73 63 61 6c 61  ue**);.  } scala
3450: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 72  rs[] = {.    {"r
3460: 65 67 65 78 70 22 2c 20 32 2c 20 53 51 4c 49 54  egexp", 2, SQLIT
3470: 45 5f 41 4e 59 2c 20 20 20 20 20 20 20 20 20 20  E_ANY,          
3480: 30 2c 20 69 63 75 52 65 67 65 78 70 46 75 6e 63  0, icuRegexpFunc
3490: 7d 2c 0a 0a 20 20 20 20 7b 22 6c 6f 77 65 72 22  },..    {"lower"
34a0: 2c 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ,  1, SQLITE_UTF
34b0: 31 36 2c 20 20 20 20 20 20 20 20 30 2c 20 69 63  16,        0, ic
34c0: 75 43 61 73 65 46 75 6e 63 31 36 7d 2c 0a 20 20  uCaseFunc16},.  
34d0: 20 20 7b 22 6c 6f 77 65 72 22 2c 20 20 32 2c 20    {"lower",  2, 
34e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 20 20  SQLITE_UTF16,   
34f0: 20 20 20 20 20 30 2c 20 69 63 75 43 61 73 65 46       0, icuCaseF
3500: 75 6e 63 31 36 7d 2c 0a 20 20 20 20 7b 22 75 70  unc16},.    {"up
3510: 70 65 72 22 2c 20 20 31 2c 20 53 51 4c 49 54 45  per",  1, SQLITE
3520: 5f 55 54 46 31 36 2c 20 28 76 6f 69 64 2a 29 31  _UTF16, (void*)1
3530: 2c 20 69 63 75 43 61 73 65 46 75 6e 63 31 36 7d  , icuCaseFunc16}
3540: 2c 0a 20 20 20 20 7b 22 75 70 70 65 72 22 2c 20  ,.    {"upper", 
3550: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   2, SQLITE_UTF16
3560: 2c 20 28 76 6f 69 64 2a 29 31 2c 20 69 63 75 43  , (void*)1, icuC
3570: 61 73 65 46 75 6e 63 31 36 7d 2c 0a 0a 20 20 20  aseFunc16},..   
3580: 20 7b 22 6c 6f 77 65 72 22 2c 20 20 31 2c 20 53   {"lower",  1, S
3590: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20  QLITE_UTF8,     
35a0: 20 20 20 20 30 2c 20 69 63 75 43 61 73 65 46 75      0, icuCaseFu
35b0: 6e 63 31 36 7d 2c 0a 20 20 20 20 7b 22 6c 6f 77  nc16},.    {"low
35c0: 65 72 22 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f  er",  2, SQLITE_
35d0: 55 54 46 38 2c 20 20 20 20 20 20 20 20 20 30 2c  UTF8,         0,
35e0: 20 69 63 75 43 61 73 65 46 75 6e 63 31 36 7d 2c   icuCaseFunc16},
35f0: 0a 20 20 20 20 7b 22 75 70 70 65 72 22 2c 20 20  .    {"upper",  
3600: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
3610: 20 28 76 6f 69 64 2a 29 31 2c 20 69 63 75 43 61   (void*)1, icuCa
3620: 73 65 46 75 6e 63 31 36 7d 2c 0a 20 20 20 20 7b  seFunc16},.    {
3630: 22 75 70 70 65 72 22 2c 20 20 32 2c 20 53 51 4c  "upper",  2, SQL
3640: 49 54 45 5f 55 54 46 38 2c 20 20 28 76 6f 69 64  ITE_UTF8,  (void
3650: 2a 29 31 2c 20 69 63 75 43 61 73 65 46 75 6e 63  *)1, icuCaseFunc
3660: 31 36 7d 2c 0a 0a 20 20 20 20 7b 22 6c 69 6b 65  16},..    {"like
3670: 22 2c 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55  ",   2, SQLITE_U
3680: 54 46 38 2c 20 20 20 20 20 20 20 20 20 30 2c 20  TF8,         0, 
3690: 69 63 75 4c 69 6b 65 46 75 6e 63 7d 2c 0a 20 20  icuLikeFunc},.  
36a0: 20 20 7b 22 6c 69 6b 65 22 2c 20 20 20 33 2c 20    {"like",   3, 
36b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
36c0: 20 20 20 20 20 30 2c 20 69 63 75 4c 69 6b 65 46       0, icuLikeF
36d0: 75 6e 63 7d 2c 0a 0a 20 20 20 20 7b 22 69 63 75  unc},..    {"icu
36e0: 5f 6c 6f 61 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22  _load_collation"
36f0: 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ,  2, SQLITE_UTF
3700: 38 2c 20 28 76 6f 69 64 2a 29 64 62 2c 20 69 63  8, (void*)db, ic
3710: 75 4c 6f 61 64 43 6f 6c 6c 61 74 69 6f 6e 7d 2c  uLoadCollation},
3720: 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 20  .  };..  int rc 
3730: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
3740: 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nt i;..  for(i=0
3750: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
3760: 26 26 20 69 3c 28 73 69 7a 65 6f 66 28 73 63 61  && i<(sizeof(sca
3770: 6c 61 72 73 29 2f 73 69 7a 65 6f 66 28 73 74 72  lars)/sizeof(str
3780: 75 63 74 20 49 63 75 53 63 61 6c 61 72 29 29 3b  uct IcuScalar));
3790: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
37a0: 74 20 49 63 75 53 63 61 6c 61 72 20 2a 70 20 3d  t IcuScalar *p =
37b0: 20 26 73 63 61 6c 61 72 73 5b 69 5d 3b 0a 20 20   &scalars[i];.  
37c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
37d0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
37e0: 20 20 20 20 20 20 20 20 64 62 2c 20 70 2d 3e 7a          db, p->z
37f0: 4e 61 6d 65 2c 20 70 2d 3e 6e 41 72 67 2c 20 70  Name, p->nArg, p
3800: 2d 3e 65 6e 63 2c 20 70 2d 3e 70 43 6f 6e 74 65  ->enc, p->pConte
3810: 78 74 2c 20 70 2d 3e 78 46 75 6e 63 2c 20 30 2c  xt, p->xFunc, 0,
3820: 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
3830: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
3840: 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a  if !SQLITE_CORE.
3850: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
3860: 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71  nsion_init(.  sq
3870: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68  lite3 *db, .  ch
3880: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20  ar **pzErrMsg,. 
3890: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61   const sqlite3_a
38a0: 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70  pi_routines *pAp
38b0: 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58  i.){.  SQLITE_EX
38c0: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41  TENSION_INIT2(pA
38d0: 70 69 29 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  pi).  return sql
38e0: 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
38f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
3900: 66 0a                                            f.