/ Hex Artifact Content
Login

Artifact 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 2d 31 31 2d 31 30  /*.** 2014-11-10
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 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 53 51 4c 20   implements SQL 
01a0: 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 28 29 20  function eval() 
01b0: 77 68 69 63 68 20 72 75 6e 73 0a 2a 2a 20 53 51  which runs.** SQ
01c0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 63  L statements rec
01d0: 75 72 73 69 76 65 6c 79 2e 0a 2a 2f 0a 23 69 6e  ursively..*/.#in
01e0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65 78  clude "sqlite3ex
01f0: 74 2e 68 22 0a 53 51 4c 49 54 45 5f 45 58 54 45  t.h".SQLITE_EXTE
0200: 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63  NSION_INIT1.#inc
0210: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0220: 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
0230: 20 75 73 65 64 20 74 6f 20 61 63 63 75 6d 75 6c   used to accumul
0240: 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  ate the output.*
0250: 2f 0a 73 74 72 75 63 74 20 45 76 61 6c 52 65 73  /.struct EvalRes
0260: 75 6c 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  ult {.  char *z;
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0280: 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 6f 75  * Accumulated ou
0290: 74 70 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tput */.  const 
02a0: 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20  char *zSep;     
02b0: 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f   /* Separator */
02c0: 0a 20 20 69 6e 74 20 73 7a 53 65 70 3b 20 20 20  .  int szSep;   
02d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
02e0: 65 20 6f 66 20 74 68 65 20 73 65 70 61 72 61 74  e of the separat
02f0: 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  or string */.  s
0300: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c  qlite3_int64 nAl
0310: 6c 6f 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  loc;  /* Number 
0320: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
0330: 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20  ed for z[] */.  
0340: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 55  sqlite3_int64 nU
0350: 73 65 64 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  sed;   /* Number
0360: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 7a 5b 5d   of bytes of z[]
0370: 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a   actually used *
0380: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  /.};../*.** Call
0390: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
03a0: 5f 65 78 65 63 28 29 20 66 6f 72 20 74 68 65 20  _exec() for the 
03b0: 65 76 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 2e  eval() function.
03c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
03d0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
03e0: 74 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  tx, int argc, ch
03f0: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
0400: 2a 2a 63 6f 6c 6e 61 6d 65 73 29 7b 0a 20 20 73  **colnames){.  s
0410: 74 72 75 63 74 20 45 76 61 6c 52 65 73 75 6c 74  truct EvalResult
0420: 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 45 76   *p = (struct Ev
0430: 61 6c 52 65 73 75 6c 74 2a 29 70 43 74 78 3b 0a  alResult*)pCtx;.
0440: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 66 28 20    int i; .  if( 
0450: 61 72 67 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  argv==0 ) return
0460: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
0470: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
0480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
0490: 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b   argv[i] ? argv[
04a0: 69 5d 20 3a 20 22 22 3b 0a 20 20 20 20 73 69 7a  i] : "";.    siz
04b0: 65 5f 74 20 73 7a 20 3d 20 73 74 72 6c 65 6e 28  e_t sz = strlen(
04c0: 7a 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  z);.    if( (sql
04d0: 69 74 65 33 5f 69 6e 74 36 34 29 73 7a 2b 70 2d  ite3_int64)sz+p-
04e0: 3e 6e 55 73 65 64 2b 70 2d 3e 73 7a 53 65 70 2b  >nUsed+p->szSep+
04f0: 31 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  1 > p->nAlloc ){
0500: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
0510: 77 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 41 6c 6c  w;.      p->nAll
0520: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
0530: 20 2b 20 73 7a 20 2b 20 70 2d 3e 73 7a 53 65 70   + sz + p->szSep
0540: 20 2b 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 55   + 1;.      /* U
0550: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 61  sing sqlite3_rea
0560: 6c 6c 6f 63 36 34 28 29 20 77 6f 75 6c 64 20 62  lloc64() would b
0570: 65 20 62 65 74 74 65 72 2c 20 62 75 74 20 69 74  e better, but it
0580: 20 69 73 20 61 20 72 65 63 65 6e 74 0a 20 20 20   is a recent.   
0590: 20 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 20 61     ** addition a
05a0: 6e 64 20 77 69 6c 6c 20 63 61 75 73 65 20 61 20  nd will cause a 
05b0: 73 65 67 66 61 75 6c 74 20 69 66 20 6c 6f 61 64  segfault if load
05c0: 65 64 20 62 79 20 61 6e 20 6f 6c 64 65 72 20 76  ed by an older v
05d0: 65 72 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ersion.      ** 
05e0: 6f 66 20 53 51 4c 69 74 65 2e 20 20 2a 2f 0a 20  of SQLite.  */. 
05f0: 20 20 20 20 20 7a 4e 65 77 20 3d 20 70 2d 3e 6e       zNew = p->n
0600: 41 6c 6c 6f 63 3c 3d 30 78 37 66 66 66 66 66 66  Alloc<=0x7ffffff
0610: 66 20 3f 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  f ? sqlite3_real
0620: 6c 6f 63 28 70 2d 3e 7a 2c 20 28 69 6e 74 29 70  loc(p->z, (int)p
0630: 2d 3e 6e 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20  ->nAlloc) : 0;. 
0640: 20 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30       if( zNew==0
0650: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
0660: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a  te3_free(p->z);.
0670: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
0680: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
0690: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
06a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
06b0: 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20    p->z = zNew;. 
06c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
06d0: 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 20  nUsed>0 ){.     
06e0: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
06f0: 3e 6e 55 73 65 64 5d 2c 20 70 2d 3e 7a 53 65 70  >nUsed], p->zSep
0700: 2c 20 70 2d 3e 73 7a 53 65 70 29 3b 0a 20 20 20  , p->szSep);.   
0710: 20 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 70     p->nUsed += p
0720: 2d 3e 73 7a 53 65 70 3b 0a 20 20 20 20 7d 0a 20  ->szSep;.    }. 
0730: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b     memcpy(&p->z[
0740: 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 73 7a  p->nUsed], z, sz
0750: 29 3b 0a 20 20 20 20 70 2d 3e 6e 55 73 65 64 20  );.    p->nUsed 
0760: 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74  += sz;.  }.  ret
0770: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
0780: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0790: 66 20 74 68 65 20 65 76 61 6c 28 58 29 20 61 6e  f the eval(X) an
07a0: 64 20 65 76 61 6c 28 58 2c 59 29 20 53 51 4c 20  d eval(X,Y) SQL 
07b0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
07c0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 53 51   Evaluate the SQ
07d0: 4c 20 74 65 78 74 20 69 6e 20 58 2e 20 20 52 65  L text in X.  Re
07e0: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
07f0: 2c 20 75 73 69 6e 67 20 73 74 72 69 6e 67 0a 2a  , using string.*
0800: 2a 20 59 20 61 73 20 74 68 65 20 73 65 70 61 72  * Y as the separ
0810: 61 74 6f 72 2e 20 20 49 66 20 59 20 69 73 20 6f  ator.  If Y is o
0820: 6d 69 74 74 65 64 2c 20 75 73 65 20 61 20 73 69  mitted, use a si
0830: 6e 67 6c 65 20 73 70 61 63 65 20 63 68 61 72 61  ngle space chara
0840: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
0850: 76 6f 69 64 20 73 71 6c 45 76 61 6c 46 75 6e 63  void sqlEvalFunc
0860: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0870: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
0880: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
0890: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
08a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
08b0: 20 2a 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65   *zSql;.  sqlite
08c0: 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a  3 *db;.  char *z
08d0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Err = 0;.  int r
08e0: 63 3b 0a 20 20 73 74 72 75 63 74 20 45 76 61 6c  c;.  struct Eval
08f0: 52 65 73 75 6c 74 20 78 3b 0a 0a 20 20 6d 65 6d  Result x;..  mem
0900: 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f  set(&x, 0, sizeo
0910: 66 28 78 29 29 3b 0a 20 20 78 2e 7a 53 65 70 20  f(x));.  x.zSep 
0920: 3d 20 22 20 22 3b 0a 20 20 7a 53 71 6c 20 3d 20  = " ";.  zSql = 
0930: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
0940: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
0950: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
0960: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
0970: 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 31 20 29  ;.  if( argc>1 )
0980: 7b 0a 20 20 20 20 78 2e 7a 53 65 70 20 3d 20 28  {.    x.zSep = (
0990: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
09a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
09b0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
09c0: 20 78 2e 7a 53 65 70 3d 3d 30 20 29 20 72 65 74   x.zSep==0 ) ret
09d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 78 2e 73 7a 53  urn;.  }.  x.szS
09e0: 65 70 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  ep = (int)strlen
09f0: 28 78 2e 7a 53 65 70 29 3b 0a 20 20 64 62 20 3d  (x.zSep);.  db =
0a00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0a10: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
0a20: 78 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  xt);.  rc = sqli
0a30: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
0a40: 6c 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  l, callback, &x,
0a50: 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72   &zErr);.  if( r
0a60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0a70: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0a80: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
0a90: 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20  , zErr, -1);.   
0aa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
0ab0: 72 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rr);.  }else if(
0ac0: 20 78 2e 7a 53 65 70 3d 3d 30 20 29 7b 0a 20 20   x.zSep==0 ){.  
0ad0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0ae0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
0af0: 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
0b00: 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 20 20  e3_free(x.z);.  
0b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
0b20: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
0b30: 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 28 69 6e  ontext, x.z, (in
0b40: 74 29 78 2e 6e 55 73 65 64 2c 20 73 71 6c 69 74  t)x.nUsed, sqlit
0b50: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
0b60: 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ..#ifdef _WIN32.
0b70: 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
0b80: 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74  port).#endif.int
0b90: 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
0ba0: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
0bb0: 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  b, .  char **pzE
0bc0: 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20  rrMsg, .  const 
0bd0: 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
0be0: 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
0bf0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0c00: 4f 4b 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54  OK;.  SQLITE_EXT
0c10: 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70  ENSION_INIT2(pAp
0c20: 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a 45 72  i);.  (void)pzEr
0c30: 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64  rMsg;  /* Unused
0c40: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
0c50: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
0c60: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
0c70: 20 22 65 76 61 6c 22 2c 20 31 2c 20 53 51 4c 49   "eval", 1, SQLI
0c80: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 45 76             sqlEv
0cb0: 61 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  alFunc, 0, 0);. 
0cc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
0cd0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
0ce0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
0cf0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 65 76 61 6c  nction(db, "eval
0d00: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
0d10: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 20 73 71 6c 45 76 61 6c 46 75         sqlEvalFu
0d40: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
0d50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.