SQLite
Hex Artifact Content
Not logged in

Artifact f971962e92ebb8b0a4e6b62949463ee454d88fa2:


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 66 6f 72 28    int i; .  for(
0450: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
0460: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
0470: 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 20 3f  r *z = argv[i] ?
0480: 20 61 72 67 76 5b 69 5d 20 3a 20 22 22 3b 0a 20   argv[i] : "";. 
0490: 20 20 20 73 69 7a 65 5f 74 20 73 7a 20 3d 20 73     size_t sz = s
04a0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66  trlen(z);.    if
04b0: 28 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ( (sqlite3_int64
04c0: 29 73 7a 2b 70 2d 3e 6e 55 73 65 64 2b 70 2d 3e  )sz+p->nUsed+p->
04d0: 73 7a 53 65 70 2b 31 20 3e 20 70 2d 3e 6e 41 6c  szSep+1 > p->nAl
04e0: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61  loc ){.      cha
04f0: 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70  r *zNew;.      p
0500: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ->nAlloc = p->nA
0510: 6c 6c 6f 63 2a 32 20 2b 20 73 7a 20 2b 20 70 2d  lloc*2 + sz + p-
0520: 3e 73 7a 53 65 70 20 2b 20 31 3b 0a 20 20 20 20  >szSep + 1;.    
0530: 20 20 2f 2a 20 55 73 69 6e 67 20 73 71 6c 69 74    /* Using sqlit
0540: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 29 20 77  e3_realloc64() w
0550: 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72 2c 20  ould be better, 
0560: 62 75 74 20 69 74 20 69 73 20 61 20 72 65 63 65  but it is a rece
0570: 6e 74 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 69  nt.      ** addi
0580: 74 69 6f 6e 20 61 6e 64 20 77 69 6c 6c 20 63 61  tion and will ca
0590: 75 73 65 20 61 20 73 65 67 66 61 75 6c 74 20 69  use a segfault i
05a0: 66 20 6c 6f 61 64 65 64 20 62 79 20 61 6e 20 6f  f loaded by an o
05b0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 0a 20 20 20  lder version.   
05c0: 20 20 20 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e     ** of SQLite.
05d0: 20 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 65 77 20    */.      zNew 
05e0: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 3c 3d 30 78 37  = p->nAlloc<=0x7
05f0: 66 66 66 66 66 66 66 20 3f 20 73 71 6c 69 74 65  fffffff ? sqlite
0600: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
0610: 28 69 6e 74 29 70 2d 3e 6e 41 6c 6c 6f 63 29 20  (int)p->nAlloc) 
0620: 3a 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  : 0;.      if( z
0630: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
0640: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
0650: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ->z);.        me
0660: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
0670: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 20 20  f(*p));.        
0680: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
0690: 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 20 3d 20 7a  }.      p->z = z
06a0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  New;.    }.    i
06b0: 66 28 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  f( p->nUsed>0 ){
06c0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
06d0: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 70  ->z[p->nUsed], p
06e0: 2d 3e 7a 53 65 70 2c 20 70 2d 3e 73 7a 53 65 70  ->zSep, p->szSep
06f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 55 73 65  );.      p->nUse
0700: 64 20 2b 3d 20 70 2d 3e 73 7a 53 65 70 3b 0a 20  d += p->szSep;. 
0710: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
0720: 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c  &p->z[p->nUsed],
0730: 20 7a 2c 20 73 7a 29 3b 0a 20 20 20 20 70 2d 3e   z, sz);.    p->
0740: 6e 55 73 65 64 20 2b 3d 20 73 7a 3b 0a 20 20 7d  nUsed += sz;.  }
0750: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0760: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
0770: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 76 61 6c  tion of the eval
0780: 28 58 29 20 61 6e 64 20 65 76 61 6c 28 58 2c 59  (X) and eval(X,Y
0790: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e  ) SQL functions.
07a0: 0a 2a 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  .**.** Evaluate 
07b0: 74 68 65 20 53 51 4c 20 74 65 78 74 20 69 6e 20  the SQL text in 
07c0: 58 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  X.  Return the r
07d0: 65 73 75 6c 74 73 2c 20 75 73 69 6e 67 20 73 74  esults, using st
07e0: 72 69 6e 67 0a 2a 2a 20 59 20 61 73 20 74 68 65  ring.** Y as the
07f0: 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20   separator.  If 
0800: 59 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 75 73  Y is omitted, us
0810: 65 20 61 20 73 69 6e 67 6c 65 20 73 70 61 63 65  e a single space
0820: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
0830: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 45 76  tatic void sqlEv
0840: 61 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  alFunc(.  sqlite
0850: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
0860: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
0870: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0880: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
0890: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
08a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
08b0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
08c0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
08d0: 74 20 45 76 61 6c 52 65 73 75 6c 74 20 78 3b 0a  t EvalResult x;.
08e0: 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c  .  memset(&x, 0,
08f0: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 78   sizeof(x));.  x
0900: 2e 7a 53 65 70 20 3d 20 22 20 22 3b 0a 20 20 7a  .zSep = " ";.  z
0910: 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
0920: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
0930: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
0940: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
0950: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 61 72  return;.  if( ar
0960: 67 63 3e 31 20 29 7b 0a 20 20 20 20 78 2e 7a 53  gc>1 ){.    x.zS
0970: 65 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ep = (const char
0980: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
0990: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  text(argv[1]);. 
09a0: 20 20 20 69 66 28 20 78 2e 7a 53 65 70 3d 3d 30     if( x.zSep==0
09b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
09c0: 20 78 2e 73 7a 53 65 70 20 3d 20 28 69 6e 74 29   x.szSep = (int)
09d0: 73 74 72 6c 65 6e 28 78 2e 7a 53 65 70 29 3b 0a  strlen(x.zSep);.
09e0: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63    db = sqlite3_c
09f0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
0a00: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  (context);.  rc 
0a10: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
0a20: 62 2c 20 7a 53 71 6c 2c 20 63 61 6c 6c 62 61 63  b, zSql, callbac
0a30: 6b 2c 20 26 78 2c 20 26 7a 45 72 72 29 3b 0a 20  k, &x, &zErr);. 
0a40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
0a50: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
0a60: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
0a70: 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31  ontext, zErr, -1
0a80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
0a90: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  ree(zErr);.  }el
0aa0: 73 65 20 69 66 28 20 78 2e 7a 53 65 70 3d 3d 30  se if( x.zSep==0
0ab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
0ac0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
0ad0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
0ae0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e   sqlite3_free(x.
0af0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
0b00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0b10: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e  text(context, x.
0b20: 7a 2c 20 28 69 6e 74 29 78 2e 6e 55 73 65 64 2c  z, (int)x.nUsed,
0b30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
0b40: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 5f    }.}...#ifdef _
0b50: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
0b60: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
0b70: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  if.int sqlite3_e
0b80: 76 61 6c 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69  val_init(.  sqli
0b90: 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72  te3 *db, .  char
0ba0: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20   **pzErrMsg, .  
0bb0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
0bc0: 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69  i_routines *pApi
0bd0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
0be0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49  QLITE_OK;.  SQLI
0bf0: 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
0c00: 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69  T2(pApi);.  (voi
0c10: 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20  d)pzErrMsg;  /* 
0c20: 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  Unused parameter
0c30: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
0c40: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
0c50: 6f 6e 28 64 62 2c 20 22 65 76 61 6c 22 2c 20 31  on(db, "eval", 1
0c60: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
0c70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 73 71 6c 45 76 61 6c 46 75 6e 63 2c 20 30 2c   sqlEvalFunc, 0,
0ca0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
0cb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0cc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
0cd0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
0ce0: 20 22 65 76 61 6c 22 2c 20 32 2c 20 53 51 4c 49   "eval", 2, SQLI
0cf0: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
0d20: 45 76 61 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  EvalFunc, 0, 0);
0d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
0d40: 3b 0a 7d 0a                                      ;.}.