/ Hex Artifact Content
Login

Artifact eed2098c9b577aa17f8abe89313a9c4413f57d63:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
0190: 20 73 71 6c 69 74 65 5f 67 65 74 5f 74 61 62 6c   sqlite_get_tabl
01a0: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 66  e() and sqlite_f
01b0: 72 65 65 5f 74 61 62 6c 65 28 29 0a 2a 2a 20 69  ree_table().** i
01c0: 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65  nterface routine
01d0: 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 6a 75  s.  These are ju
01e0: 73 74 20 77 72 61 70 70 65 72 73 20 61 72 6f 75  st wrappers arou
01f0: 6e 64 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 69  nd the main.** i
0200: 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65  nterface routine
0210: 20 6f 66 20 73 71 6c 69 74 65 5f 65 78 65 63 28   of sqlite_exec(
0220: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  )..**.** These r
0230: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6e 20 61  outines are in a
0240: 20 73 65 70 61 72 61 74 65 20 66 69 6c 65 73 20   separate files 
0250: 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
0260: 6c 20 6e 6f 74 20 62 65 20 6c 69 6e 6b 65 64 0a  l not be linked.
0270: 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ** if they are n
0280: 6f 74 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 6e 63  ot used..*/.#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h>.#include "sq
02c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
02d0: 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65  * This structure
02e0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
02f0: 20 64 61 74 61 20 66 72 6f 6d 20 73 71 6c 69 74   data from sqlit
0300: 65 5f 67 65 74 5f 74 61 62 6c 65 28 29 20 74 68  e_get_table() th
0310: 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20  rough.** to the 
0320: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
0330: 6e 20 69 73 20 75 73 65 73 20 74 6f 20 62 75 69  n is uses to bui
0340: 6c 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ld the result..*
0350: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0360: 20 54 61 62 52 65 73 75 6c 74 20 7b 0a 20 20 63   TabResult {.  c
0370: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
0380: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
0390: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a  .  int nResult;.
03a0: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 20 20    int nAlloc;.  
03b0: 69 6e 74 20 6e 52 6f 77 3b 0a 20 20 69 6e 74 20  int nRow;.  int 
03c0: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
03d0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Data;.  int rc;.
03e0: 7d 20 54 61 62 52 65 73 75 6c 74 3b 0a 0a 2f 2a  } TabResult;../*
03f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0400: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
0410: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
0420: 74 68 65 20 72 65 73 75 6c 74 20 74 61 62 6c 65  the result table
0430: 2e 20 20 49 74 73 20 6a 6f 62 0a 2a 2a 20 69 73  .  Its job.** is
0440: 20 74 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65 20   to fill in the 
0450: 54 61 62 52 65 73 75 6c 74 20 73 74 72 75 63 74  TabResult struct
0460: 75 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ure appropriatel
0470: 79 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 6e 65  y, allocating ne
0480: 77 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 73 20 6e  w.** memory as n
0490: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
04a0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 67  tic int sqlite_g
04b0: 65 74 5f 74 61 62 6c 65 5f 63 62 28 76 6f 69 64  et_table_cb(void
04c0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 43 6f 6c   *pArg, int nCol
04d0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
04e0: 68 61 72 20 2a 2a 63 6f 6c 76 29 7b 0a 20 20 54  har **colv){.  T
04f0: 61 62 52 65 73 75 6c 74 20 2a 70 20 3d 20 28 54  abResult *p = (T
0500: 61 62 52 65 73 75 6c 74 2a 29 70 41 72 67 3b 0a  abResult*)pArg;.
0510: 20 20 69 6e 74 20 6e 65 65 64 3b 0a 20 20 69 6e    int need;.  in
0520: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
0530: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
0540: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
0550: 73 70 61 63 65 20 69 6e 20 70 2d 3e 61 7a 52 65  space in p->azRe
0560: 73 75 6c 74 20 74 6f 20 68 6f 6c 64 20 65 76 65  sult to hold eve
0570: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 65 20  rything.  ** we 
0580: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
0590: 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 76 6f 63   from this invoc
05a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 61 6c  ation of the cal
05b0: 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  lback..  */.  if
05c0: 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 26 26 20  ( p->nRow==0 && 
05d0: 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 6e  argv!=0 ){.    n
05e0: 65 65 64 20 3d 20 6e 43 6f 6c 2a 32 3b 0a 20 20  eed = nCol*2;.  
05f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 65 64 20  }else{.    need 
0600: 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 69 66  = nCol;.  }.  if
0610: 28 20 70 2d 3e 6e 44 61 74 61 20 2b 20 6e 65 65  ( p->nData + nee
0620: 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29  d >= p->nAlloc )
0630: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e  {.    char **azN
0640: 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f  ew;.    p->nAllo
0650: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
0660: 2b 20 6e 65 65 64 20 2b 20 31 3b 0a 20 20 20 20  + need + 1;.    
0670: 61 7a 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28  azNew = realloc(
0680: 20 70 2d 3e 61 7a 52 65 73 75 6c 74 2c 20 73 69   p->azResult, si
0690: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 2d 3e 6e  zeof(char*)*p->n
06a0: 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66 28  Alloc );.    if(
06b0: 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   azNew==0 ){.   
06c0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
06d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72  E_NOMEM;.      r
06e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
06f0: 20 20 20 70 2d 3e 61 7a 52 65 73 75 6c 74 20 3d     p->azResult =
0700: 20 61 7a 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 2f   azNew;.  }..  /
0710: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
0720: 20 66 69 72 73 74 20 72 6f 77 2c 20 74 68 65 6e   first row, then
0730: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 78 74   generate an ext
0740: 72 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  ra row containin
0750: 67 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73  g.  ** the names
0760: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2e   of all columns.
0770: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
0780: 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Row==0 ){.    p-
0790: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b  >nColumn = nCol;
07a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
07b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
07c0: 20 20 69 66 28 20 63 6f 6c 76 5b 69 5d 3d 3d 30    if( colv[i]==0
07d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
07e0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
07f0: 20 20 20 20 20 20 20 20 7a 20 3d 20 6d 61 6c 6c          z = mall
0800: 6f 63 28 20 73 74 72 6c 65 6e 28 63 6f 6c 76 5b  oc( strlen(colv[
0810: 69 5d 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  i])+1 );.       
0820: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
0830: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
0840: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
0860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0870: 20 20 20 73 74 72 63 70 79 28 7a 2c 20 63 6f 6c     strcpy(z, col
0880: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[i]);.      }. 
0890: 20 20 20 20 20 70 2d 3e 61 7a 52 65 73 75 6c 74       p->azResult
08a0: 5b 70 2d 3e 6e 44 61 74 61 2b 2b 5d 20 3d 20 7a  [p->nData++] = z
08b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
08c0: 69 66 28 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d  if( p->nColumn!=
08d0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  nCol ){.    sqli
08e0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  teSetString(&p->
08f0: 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20  zErrMsg,.       
0900: 22 73 71 6c 69 74 65 5f 67 65 74 5f 74 61 62 6c  "sqlite_get_tabl
0910: 65 28 29 20 63 61 6c 6c 65 64 20 77 69 74 68 20  e() called with 
0920: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 63 6f  two or more inco
0930: 6d 70 61 74 69 62 6c 65 20 71 75 65 72 69 65 73  mpatible queries
0940: 22 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 72 63  ", 0);.    p->rc
0950: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0960: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
0970: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 76   }..  /* Copy ov
0980: 65 72 20 74 68 65 20 72 6f 77 20 64 61 74 61 0a  er the row data.
0990: 20 20 2a 2f 0a 20 20 69 66 28 20 61 72 67 76 21    */.  if( argv!
09a0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
09b0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
09c0: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 76 5b  .      if( argv[
09d0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
09e0: 20 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   z = 0;.      }e
09f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d  lse{.        z =
0a00: 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28   malloc( strlen(
0a10: 61 72 67 76 5b 69 5d 29 2b 31 20 29 3b 0a 20 20  argv[i])+1 );.  
0a20: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
0a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
0a40: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
0a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
0a60: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
0a70: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 7a          strcpy(z
0a80: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
0a90: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 7a 52    }.      p->azR
0aa0: 65 73 75 6c 74 5b 70 2d 3e 6e 44 61 74 61 2b 2b  esult[p->nData++
0ab0: 5d 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = z;.    }.   
0ac0: 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 0a   p->nRow++;.  }.
0ad0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
0ae0: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 64  *.** Query the d
0af0: 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 69 6e  atabase.  But in
0b00: 73 74 65 61 64 20 6f 66 20 69 6e 76 6f 6b 69 6e  stead of invokin
0b10: 67 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  g a callback for
0b20: 20 65 61 63 68 20 72 6f 77 2c 0a 2a 2a 20 6d 61   each row,.** ma
0b30: 6c 6c 6f 63 28 29 20 66 6f 72 20 73 70 61 63 65  lloc() for space
0b40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
0b50: 75 6c 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ult and return t
0b60: 68 65 20 65 6e 74 69 72 65 20 72 65 73 75 6c 74  he entire result
0b70: 73 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  s.** at the conc
0b80: 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 61  lusion of the ca
0b90: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ll..**.** The re
0ba0: 73 75 6c 74 20 74 68 61 74 20 69 73 20 77 72 69  sult that is wri
0bb0: 74 74 65 6e 20 74 6f 20 2a 2a 2a 70 61 7a 52 65  tten to ***pazRe
0bc0: 73 75 6c 74 20 69 73 20 68 65 6c 64 20 69 6e 20  sult is held in 
0bd0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
0be0: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ** from malloc()
0bf0: 2e 20 20 42 75 74 20 74 68 65 20 63 61 6c 6c 65  .  But the calle
0c00: 72 20 63 61 6e 6e 6f 74 20 66 72 65 65 20 74 68  r cannot free th
0c10: 69 73 20 6d 65 6d 6f 72 79 20 64 69 72 65 63 74  is memory direct
0c20: 6c 79 2e 20 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ly.  .** Instead
0c30: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  , the entire tab
0c40: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  le should be pas
0c50: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 5f 66 72  sed to sqlite_fr
0c60: 65 65 5f 74 61 62 6c 65 28 29 20 77 68 65 6e 0a  ee_table() when.
0c70: 2a 2a 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  ** the calling p
0c80: 72 6f 63 65 64 75 72 65 20 69 73 20 66 69 6e 69  rocedure is fini
0c90: 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a  shed using it..*
0ca0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 67 65 74  /.int sqlite_get
0cb0: 5f 74 61 62 6c 65 28 0a 20 20 73 71 6c 69 74 65  _table(.  sqlite
0cc0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
0cd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
0ce0: 61 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20 74  abase on which t
0cf0: 68 65 20 53 51 4c 20 65 78 65 63 75 74 65 73 20  he SQL executes 
0d00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0d10: 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *zSql,          
0d20: 20 2f 2a 20 54 68 65 20 53 51 4c 20 74 6f 20 62   /* The SQL to b
0d30: 65 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 20 20  e executed */.  
0d40: 63 68 61 72 20 2a 2a 2a 70 61 7a 52 65 73 75 6c  char ***pazResul
0d50: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  t,          /* W
0d60: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 20  rite the result 
0d70: 74 61 62 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  table here */.  
0d80: 69 6e 74 20 2a 70 6e 52 6f 77 2c 20 20 20 20 20  int *pnRow,     
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0da0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
0db0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  of rows in the r
0dc0: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
0dd0: 69 6e 74 20 2a 70 6e 43 6f 6c 75 6d 6e 2c 20 20  int *pnColumn,  
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0df0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
0e00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65  of columns of re
0e10: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 63  sult here */.  c
0e20: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
0e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
0e40: 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ite error messag
0e50: 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  es here */.){.  
0e60: 69 6e 74 20 72 63 3b 0a 20 20 54 61 62 52 65 73  int rc;.  TabRes
0e70: 75 6c 74 20 72 65 73 3b 0a 20 20 69 66 28 20 70  ult res;.  if( p
0e80: 61 7a 52 65 73 75 6c 74 3d 3d 30 20 29 7b 20 72  azResult==0 ){ r
0e90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
0ea0: 4f 52 3b 20 7d 0a 20 20 2a 70 61 7a 52 65 73 75  OR; }.  *pazResu
0eb0: 6c 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  lt = 0;.  if( pn
0ec0: 43 6f 6c 75 6d 6e 20 29 20 2a 70 6e 43 6f 6c 75  Column ) *pnColu
0ed0: 6d 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  mn = 0;.  if( pn
0ee0: 52 6f 77 20 29 20 2a 70 6e 52 6f 77 20 3d 20 30  Row ) *pnRow = 0
0ef0: 3b 0a 20 20 72 65 73 2e 7a 45 72 72 4d 73 67 20  ;.  res.zErrMsg 
0f00: 3d 20 30 3b 0a 20 20 72 65 73 2e 6e 52 65 73 75  = 0;.  res.nResu
0f10: 6c 74 20 3d 20 30 3b 0a 20 20 72 65 73 2e 6e 52  lt = 0;.  res.nR
0f20: 6f 77 20 3d 20 30 3b 0a 20 20 72 65 73 2e 6e 43  ow = 0;.  res.nC
0f30: 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 72 65 73  olumn = 0;.  res
0f40: 2e 6e 44 61 74 61 20 3d 20 31 3b 0a 20 20 72 65  .nData = 1;.  re
0f50: 73 2e 6e 41 6c 6c 6f 63 20 3d 20 32 30 3b 0a 20  s.nAlloc = 20;. 
0f60: 20 72 65 73 2e 72 63 20 3d 20 53 51 4c 49 54 45   res.rc = SQLITE
0f70: 5f 4f 4b 3b 0a 20 20 72 65 73 2e 61 7a 52 65 73  _OK;.  res.azRes
0f80: 75 6c 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69  ult = malloc( si
0f90: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 72 65 73 2e  zeof(char*)*res.
0fa0: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66 28 20  nAlloc );.  if( 
0fb0: 72 65 73 2e 61 7a 52 65 73 75 6c 74 3d 3d 30 20  res.azResult==0 
0fc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0fd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
0fe0: 20 20 72 65 73 2e 61 7a 52 65 73 75 6c 74 5b 30    res.azResult[0
0ff0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
1000: 6c 69 74 65 5f 65 78 65 63 28 64 62 2c 20 7a 53  lite_exec(db, zS
1010: 71 6c 2c 20 73 71 6c 69 74 65 5f 67 65 74 5f 74  ql, sqlite_get_t
1020: 61 62 6c 65 5f 63 62 2c 20 26 72 65 73 2c 20 70  able_cb, &res, p
1030: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
1040: 72 65 73 2e 61 7a 52 65 73 75 6c 74 20 29 7b 0a  res.azResult ){.
1050: 20 20 20 20 72 65 73 2e 61 7a 52 65 73 75 6c 74      res.azResult
1060: 5b 30 5d 20 3d 20 28 63 68 61 72 2a 29 72 65 73  [0] = (char*)res
1070: 2e 6e 44 61 74 61 3b 0a 20 20 7d 0a 20 20 69 66  .nData;.  }.  if
1080: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
1090: 52 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  RT ){.    sqlite
10a0: 5f 66 72 65 65 5f 74 61 62 6c 65 28 26 72 65 73  _free_table(&res
10b0: 2e 61 7a 52 65 73 75 6c 74 5b 31 5d 29 3b 0a 20  .azResult[1]);. 
10c0: 20 20 20 69 66 28 20 72 65 73 2e 7a 45 72 72 4d     if( res.zErrM
10d0: 73 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sg ){.      if( 
10e0: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
10f0: 20 20 20 20 66 72 65 65 28 2a 70 7a 45 72 72 4d      free(*pzErrM
1100: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 7a  sg);.        *pz
1110: 45 72 72 4d 73 67 20 3d 20 72 65 73 2e 7a 45 72  ErrMsg = res.zEr
1120: 72 4d 73 67 3b 0a 20 20 20 20 20 20 20 20 73 71  rMsg;.        sq
1130: 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70  liteStrRealloc(p
1140: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
1150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1160: 71 6c 69 74 65 46 72 65 65 28 72 65 73 2e 7a 45  qliteFree(res.zE
1170: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a  rrMsg);.      }.
1180: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1190: 20 72 65 73 2e 72 63 3b 0a 20 20 7d 0a 20 20 73   res.rc;.  }.  s
11a0: 71 6c 69 74 65 46 72 65 65 28 72 65 73 2e 7a 45  qliteFree(res.zE
11b0: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
11c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11d0: 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 5f 74     sqlite_free_t
11e0: 61 62 6c 65 28 26 72 65 73 2e 61 7a 52 65 73 75  able(&res.azResu
11f0: 6c 74 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74 75  lt[1]);.    retu
1200: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1210: 20 72 65 73 2e 6e 41 6c 6c 6f 63 3e 72 65 73 2e   res.nAlloc>res.
1220: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 68 61  nData ){.    cha
1230: 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 61  r **azNew;.    a
1240: 7a 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20  zNew = realloc( 
1250: 72 65 73 2e 61 7a 52 65 73 75 6c 74 2c 20 73 69  res.azResult, si
1260: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 72 65 73  zeof(char*)*(res
1270: 2e 6e 44 61 74 61 2b 31 29 20 29 3b 0a 20 20 20  .nData+1) );.   
1280: 20 69 66 28 20 72 65 73 2e 61 7a 52 65 73 75 6c   if( res.azResul
1290: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
12a0: 6c 69 74 65 5f 66 72 65 65 5f 74 61 62 6c 65 28  lite_free_table(
12b0: 26 72 65 73 2e 61 7a 52 65 73 75 6c 74 5b 31 5d  &res.azResult[1]
12c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12e0: 20 20 7d 0a 20 20 20 20 72 65 73 2e 61 7a 52 65    }.    res.azRe
12f0: 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20  sult = azNew;.  
1300: 7d 0a 20 20 2a 70 61 7a 52 65 73 75 6c 74 20 3d  }.  *pazResult =
1310: 20 26 72 65 73 2e 61 7a 52 65 73 75 6c 74 5b 31   &res.azResult[1
1320: 5d 3b 0a 20 20 69 66 28 20 70 6e 43 6f 6c 75 6d  ];.  if( pnColum
1330: 6e 20 29 20 2a 70 6e 43 6f 6c 75 6d 6e 20 3d 20  n ) *pnColumn = 
1340: 72 65 73 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  res.nColumn;.  i
1350: 66 28 20 70 6e 52 6f 77 20 29 20 2a 70 6e 52 6f  f( pnRow ) *pnRo
1360: 77 20 3d 20 72 65 73 2e 6e 52 6f 77 3b 0a 20 20  w = res.nRow;.  
1370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1380: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1390: 20 66 72 65 65 73 20 74 68 65 20 73 70 61 63 65   frees the space
13a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 67 65 74 5f   the sqlite_get_
13b0: 74 61 62 6c 65 28 29 20 6d 61 6c 6c 6f 63 65 64  table() malloced
13c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13d0: 5f 66 72 65 65 5f 74 61 62 6c 65 28 0a 20 20 63  _free_table(.  c
13e0: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 20 20  har **azResult  
13f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1400: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 66 72  sult returned fr
1410: 6f 6d 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 67  om from sqlite_g
1420: 65 74 5f 74 61 62 6c 65 28 29 20 2a 2f 0a 29 7b  et_table() */.){
1430: 0a 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74 20  .  if( azResult 
1440: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
1450: 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 2d 2d 3b  .    azResult--;
1460: 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 61 7a  .    n = (int)az
1470: 52 65 73 75 6c 74 5b 30 5d 3b 0a 20 20 20 20 66  Result[0];.    f
1480: 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=1; i<n; i++
1490: 29 7b 20 69 66 28 20 61 7a 52 65 73 75 6c 74 5b  ){ if( azResult[
14a0: 69 5d 20 29 20 66 72 65 65 28 61 7a 52 65 73 75  i] ) free(azResu
14b0: 6c 74 5b 69 5d 29 3b 20 7d 0a 20 20 20 20 66 72  lt[i]); }.    fr
14c0: 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  ee(azResult);.  
14d0: 7d 0a 7d 0a                                      }.}.