/ Hex Artifact Content
Login

Artifact 04e630bde869aa1fec6b993d40591f963be2f868:


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 2f 2a 20 41              /* A
0280: 63 63 75 6d 75 6c 61 74 65 64 20 6f 75 74 70 75  ccumulated outpu
0290: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
02a0: 72 20 2a 7a 53 65 70 3b 20 20 20 2f 2a 20 53 65  r *zSep;   /* Se
02b0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
02c0: 20 73 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20   szSep;         
02d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
02e0: 73 65 70 61 72 61 74 6f 72 20 73 74 72 69 6e 67  separator string
02f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
0300: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
0310: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c  ber of bytes all
0320: 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
0330: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
0340: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0350: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 7a 5b  r of bytes of z[
0360: 5d 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  ] actually used 
0370: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  */.};../*.** Cal
0380: 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74  lback from sqlit
0390: 65 5f 65 78 65 63 28 29 20 66 6f 72 20 74 68 65  e_exec() for the
03a0: 20 65 76 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e   eval() function
03b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
03c0: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
03d0: 43 74 78 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  Ctx, int argc, c
03e0: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
03f0: 20 2a 2a 63 6f 6c 6e 61 6d 65 73 29 7b 0a 20 20   **colnames){.  
0400: 73 74 72 75 63 74 20 45 76 61 6c 52 65 73 75 6c  struct EvalResul
0410: 74 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 45  t *p = (struct E
0420: 76 61 6c 52 65 73 75 6c 74 2a 29 70 43 74 78 3b  valResult*)pCtx;
0430: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 66 6f 72  .  int i; .  for
0440: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
0450: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
0460: 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 20  ar *z = argv[i] 
0470: 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 22 3b 0a  ? argv[i] : "";.
0480: 20 20 20 20 73 69 7a 65 5f 74 20 73 7a 20 3d 20      size_t sz = 
0490: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69  strlen(z);.    i
04a0: 66 28 20 73 7a 2b 70 2d 3e 6e 55 73 65 64 2b 70  f( sz+p->nUsed+p
04b0: 2d 3e 73 7a 53 65 70 2b 31 20 3e 20 70 2d 3e 6e  ->szSep+1 > p->n
04c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63  Alloc ){.      c
04d0: 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20  har *zNew;.     
04e0: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e   p->nAlloc = p->
04f0: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 73 7a 20 2b 20  nAlloc*2 + sz + 
0500: 70 2d 3e 73 7a 53 65 70 20 2b 20 31 3b 0a 20 20  p->szSep + 1;.  
0510: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
0520: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c  e3_realloc(p->z,
0530: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
0540: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
0550: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
0560: 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  3_free(p->z);.  
0570: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
0580: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
0590: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
05a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
05b0: 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  p->z = zNew;.   
05c0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 55   }.    if( p->nU
05d0: 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  sed>0 ){.      m
05e0: 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e  emcpy(&p->z[p->n
05f0: 55 73 65 64 5d 2c 20 70 2d 3e 7a 53 65 70 2c 20  Used], p->zSep, 
0600: 70 2d 3e 73 7a 53 65 70 29 3b 0a 20 20 20 20 20  p->szSep);.     
0610: 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 70 2d 3e   p->nUsed += p->
0620: 73 7a 53 65 70 3b 0a 20 20 20 20 7d 0a 20 20 20  szSep;.    }.   
0630: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d   memcpy(&p->z[p-
0640: 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 73 7a 29 3b  >nUsed], z, sz);
0650: 0a 20 20 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  .    p->nUsed +=
0660: 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   sz;.  }.  retur
0670: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  n 0;.}../*.** Im
0680: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0690: 74 68 65 20 65 76 61 6c 28 58 29 20 61 6e 64 20  the eval(X) and 
06a0: 65 76 61 6c 28 58 2c 59 29 20 53 51 4c 20 66 75  eval(X,Y) SQL fu
06b0: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  nctions..**.** E
06c0: 76 61 6c 75 61 74 65 20 74 68 65 20 53 51 4c 20  valuate the SQL 
06d0: 74 65 78 74 20 69 6e 20 58 2e 20 20 52 65 74 75  text in X.  Retu
06e0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  rn the results, 
06f0: 75 73 69 6e 67 20 73 74 72 69 6e 67 0a 2a 2a 20  using string.** 
0700: 59 20 61 73 20 74 68 65 20 73 65 70 61 72 61 74  Y as the separat
0710: 6f 72 2e 20 20 49 66 20 59 20 69 73 20 6f 6d 69  or.  If Y is omi
0720: 74 74 65 64 2c 20 75 73 65 20 61 20 73 69 6e 67  tted, use a sing
0730: 6c 65 20 73 70 61 63 65 20 63 68 61 72 61 63 74  le space charact
0740: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
0750: 69 64 20 73 71 6c 45 76 61 6c 46 75 6e 63 28 0a  id sqlEvalFunc(.
0760: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0770: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0780: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0790: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
07a0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
07b0: 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  zSql;.  sqlite3 
07c0: 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  *db;.  char *zEr
07d0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  r = 0;.  int rc;
07e0: 0a 20 20 73 74 72 75 63 74 20 45 76 61 6c 52 65  .  struct EvalRe
07f0: 73 75 6c 74 20 78 3b 0a 0a 20 20 6d 65 6d 73 65  sult x;..  memse
0800: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
0810: 78 29 29 3b 0a 20 20 78 2e 7a 53 65 70 20 3d 20  x));.  x.zSep = 
0820: 22 20 22 3b 0a 20 20 7a 53 71 6c 20 3d 20 28 63  " ";.  zSql = (c
0830: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
0840: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
0850: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 53  gv[0]);.  if( zS
0860: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ql==0 ) return;.
0870: 20 20 69 66 28 20 61 72 67 63 3e 31 20 29 7b 0a    if( argc>1 ){.
0880: 20 20 20 20 78 2e 7a 53 65 70 20 3d 20 28 63 6f      x.zSep = (co
0890: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
08a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
08b0: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 78  v[1]);.    if( x
08c0: 2e 7a 53 65 70 3d 3d 30 20 29 20 72 65 74 75 72  .zSep==0 ) retur
08d0: 6e 3b 0a 20 20 7d 0a 20 20 78 2e 73 7a 53 65 70  n;.  }.  x.szSep
08e0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 78   = (int)strlen(x
08f0: 2e 7a 53 65 70 29 3b 0a 20 20 64 62 20 3d 20 73  .zSep);.  db = s
0900: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
0910: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
0920: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
0930: 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
0940: 20 63 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 26   callback, &x, &
0950: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 21  zErr);.  if( rc!
0960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0970: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0980: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
0990: 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20 20 73  zErr, -1);.    s
09a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
09b0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 78  );.  }else if( x
09c0: 2e 7a 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20  .zSep==0 ){.    
09d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
09e0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
09f0: 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
0a00: 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 20 20 7d 65  _free(x.z);.  }e
0a10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
0a20: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
0a30: 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73  text, x.z, x.nUs
0a40: 65 64 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ed, sqlite3_free
0a50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 64 65  );.  }.}...#ifde
0a60: 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
0a70: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
0a80: 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
0a90: 33 5f 65 76 61 6c 5f 69 6e 69 74 28 0a 20 20 73  3_eval_init(.  s
0aa0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
0ab0: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
0ac0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
0ad0: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
0ae0: 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
0af0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
0b00: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
0b10: 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28  INIT2(pApi);.  (
0b20: 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20  void)pzErrMsg;  
0b30: 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
0b40: 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ter */.  rc = sq
0b50: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
0b60: 63 74 69 6f 6e 28 64 62 2c 20 22 65 76 61 6c 22  ction(db, "eval"
0b70: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
0b80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 73 71 6c 45 76 61 6c 46 75 6e 63 2c      sqlEvalFunc,
0bb0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
0bc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
0be0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
0bf0: 64 62 2c 20 22 65 76 61 6c 22 2c 20 32 2c 20 53  db, "eval", 2, S
0c00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 73 71 6c 45 76 61 6c 46 75 6e 63 2c 20 30 2c 20  sqlEvalFunc, 0, 
0c40: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
0c50: 20 72 63 3b 0a 7d 0a                              rc;.}.