/ Hex Artifact Content
Login

Artifact 203a09d5d0009eeeb1f670370d52b4ce163a3b52:


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 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  lite.h"../*.** T
02d0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
02e0: 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 64 61   used to pass da
02f0: 74 61 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 67  ta from sqlite_g
0300: 65 74 5f 74 61 62 6c 65 28 29 20 74 68 72 6f 75  et_table() throu
0310: 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  gh.** to the cal
0320: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 69  lback function i
0330: 73 20 75 73 65 73 20 74 6f 20 62 75 69 6c 64 20  s uses to build 
0340: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 74  the result..*/.t
0350: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 61  ypedef struct Ta
0360: 62 52 65 73 75 6c 74 20 7b 0a 20 20 63 68 61 72  bResult {.  char
0370: 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 69   **azResult;.  i
0380: 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e  nt nResult;.  in
0390: 74 20 6e 41 6c 6c 6f 63 3b 0a 20 20 69 6e 74 20  t nAlloc;.  int 
03a0: 6e 52 6f 77 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nRow;.  int nCol
03b0: 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61  umn;.  int nData
03c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 7d 20 54 61  ;.  int rc;.} Ta
03d0: 62 52 65 73 75 6c 74 3b 0a 0a 2f 2a 0a 2a 2a 20  bResult;../*.** 
03e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
03f0: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
0400: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
0410: 72 65 73 75 6c 74 20 74 61 62 6c 65 2e 20 20 49  result table.  I
0420: 74 73 20 6a 6f 62 0a 2a 2a 20 69 73 20 74 6f 20  ts job.** is to 
0430: 66 69 6c 6c 20 69 6e 20 74 68 65 20 54 61 62 52  fill in the TabR
0440: 65 73 75 6c 74 20 73 74 72 75 63 74 75 72 65 20  esult structure 
0450: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 61  appropriately, a
0460: 6c 6c 6f 63 61 74 69 6e 67 20 6e 65 77 0a 2a 2a  llocating new.**
0470: 20 6d 65 6d 6f 72 79 20 61 73 20 6e 65 63 65 73   memory as neces
0480: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
0490: 69 6e 74 20 73 71 6c 69 74 65 5f 67 65 74 5f 74  int sqlite_get_t
04a0: 61 62 6c 65 5f 63 62 28 76 6f 69 64 20 2a 70 41  able_cb(void *pA
04b0: 72 67 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 63 68  rg, int nCol, ch
04c0: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
04d0: 2a 2a 63 6f 6c 76 29 7b 0a 20 20 54 61 62 52 65  **colv){.  TabRe
04e0: 73 75 6c 74 20 2a 70 20 3d 20 28 54 61 62 52 65  sult *p = (TabRe
04f0: 73 75 6c 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  sult*)pArg;.  in
0500: 74 20 6e 65 65 64 3b 0a 20 20 69 6e 74 20 69 3b  t need;.  int i;
0510: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 2f  .  char *z;..  /
0520: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
0530: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
0540: 65 20 69 6e 20 70 2d 3e 61 7a 52 65 73 75 6c 74  e in p->azResult
0550: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
0560: 69 6e 67 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64  ing.  ** we need
0570: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 66 72 6f   to remember fro
0580: 6d 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f  m this invocatio
0590: 6e 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 61 63  n of the callbac
05a0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  k..  */.  if( p-
05b0: 3e 6e 52 6f 77 3d 3d 30 20 26 26 20 61 72 67 76  >nRow==0 && argv
05c0: 21 3d 30 20 29 7b 0a 20 20 20 20 6e 65 65 64 20  !=0 ){.    need 
05d0: 3d 20 6e 43 6f 6c 2a 32 3b 0a 20 20 7d 65 6c 73  = nCol*2;.  }els
05e0: 65 7b 0a 20 20 20 20 6e 65 65 64 20 3d 20 6e 43  e{.    need = nC
05f0: 6f 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ol;.  }.  if( p-
0600: 3e 6e 44 61 74 61 20 2b 20 6e 65 65 64 20 3e 3d  >nData + need >=
0610: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20   p->nAlloc ){.  
0620: 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
0630: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
0640: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 65  p->nAlloc*2 + ne
0650: 65 64 20 2b 20 31 3b 0a 20 20 20 20 61 7a 4e 65  ed + 1;.    azNe
0660: 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e  w = realloc( p->
0670: 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66  azResult, sizeof
0680: 28 63 68 61 72 2a 29 2a 70 2d 3e 6e 41 6c 6c 6f  (char*)*p->nAllo
0690: 63 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 4e  c );.    if( azN
06a0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
06b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
06c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
06d0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 1;.    }.    p
06e0: 2d 3e 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e  ->azResult = azN
06f0: 65 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ew;.  }..  /* If
0700: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
0710: 73 74 20 72 6f 77 2c 20 74 68 65 6e 20 67 65 6e  st row, then gen
0720: 65 72 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  erate an extra r
0730: 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  ow containing.  
0740: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
0750: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  all columns..  *
0760: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 3d  /.  if( p->nRow=
0770: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 6f  =0 ){.    p->nCo
0780: 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
0790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
07a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
07b0: 28 20 63 6f 6c 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( colv[i]==0 ){.
07c0: 20 20 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20          z = 0;. 
07d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
07e0: 20 20 20 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20      z = malloc( 
07f0: 73 74 72 6c 65 6e 28 63 6f 6c 76 5b 69 5d 29 2b  strlen(colv[i])+
0800: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
0810: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   z==0 ){.       
0820: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
0830: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
0840: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
0850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
0860: 74 72 63 70 79 28 7a 2c 20 63 6f 6c 76 5b 69 5d  trcpy(z, colv[i]
0870: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0880: 20 70 2d 3e 61 7a 52 65 73 75 6c 74 5b 70 2d 3e   p->azResult[p->
0890: 6e 44 61 74 61 2b 2b 5d 20 3d 20 7a 3b 0a 20 20  nData++] = z;.  
08a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
08b0: 70 79 20 6f 76 65 72 20 74 68 65 20 72 6f 77 20  py over the row 
08c0: 64 61 74 61 0a 20 20 2a 2f 0a 20 20 69 66 28 20  data.  */.  if( 
08d0: 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66  argv!=0 ){.    f
08e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
08f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
0900: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
0910: 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20        z = 0;.   
0920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0930: 20 20 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74    z = malloc( st
0940: 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31 20  rlen(argv[i])+1 
0950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
0960: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
0970: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
0980: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
0990: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
09a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72     }.        str
09b0: 63 70 79 28 7a 2c 20 61 72 67 76 5b 69 5d 29 3b  cpy(z, argv[i]);
09c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
09d0: 2d 3e 61 7a 52 65 73 75 6c 74 5b 70 2d 3e 6e 44  ->azResult[p->nD
09e0: 61 74 61 2b 2b 5d 20 3d 20 7a 3b 0a 20 20 20 20  ata++] = z;.    
09f0: 7d 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 2b 2b 3b  }.    p->nRow++;
0a00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
0a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
0a20: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
0a30: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  ut instead of in
0a40: 76 6f 6b 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  voking a callbac
0a50: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2c 0a  k for each row,.
0a60: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 6f 72 20  ** malloc() for 
0a70: 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  space to hold th
0a80: 65 20 72 65 73 75 6c 74 20 61 6e 64 20 72 65 74  e result and ret
0a90: 75 72 6e 20 74 68 65 20 65 6e 74 69 72 65 20 72  urn the entire r
0aa0: 65 73 75 6c 74 73 0a 2a 2a 20 61 74 20 74 68 65  esults.** at the
0ab0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
0ac0: 68 65 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  he call..**.** T
0ad0: 68 65 20 72 65 73 75 6c 74 20 74 68 61 74 20 69  he result that i
0ae0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 2a 2a  s written to ***
0af0: 70 61 7a 52 65 73 75 6c 74 20 69 73 20 68 65 6c  pazResult is hel
0b00: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
0b10: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c  ined.** from mal
0b20: 6c 6f 63 28 29 2e 20 20 42 75 74 20 74 68 65 20  loc().  But the 
0b30: 63 61 6c 6c 65 72 20 63 61 6e 6e 6f 74 20 66 72  caller cannot fr
0b40: 65 65 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 64  ee this memory d
0b50: 69 72 65 63 74 6c 79 2e 20 20 0a 2a 2a 20 49 6e  irectly.  .** In
0b60: 73 74 65 61 64 2c 20 74 68 65 20 65 6e 74 69 72  stead, the entir
0b70: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
0b80: 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
0b90: 74 65 5f 66 72 65 65 5f 74 61 62 6c 65 28 29 20  te_free_table() 
0ba0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  when.** the call
0bb0: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
0bc0: 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20   finished using 
0bd0: 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
0be0: 65 5f 67 65 74 5f 74 61 62 6c 65 28 0a 20 20 73  e_get_table(.  s
0bf0: 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20  qlite *db,      
0c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0c10: 65 20 64 61 74 61 62 61 73 65 20 6f 6e 20 77 68  e database on wh
0c20: 69 63 68 20 74 68 65 20 53 51 4c 20 65 78 65 63  ich the SQL exec
0c30: 75 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  utes */.  const 
0c40: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
0c50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51 4c        /* The SQL
0c60: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 20   to be executed 
0c70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 2a 70 61 7a  */.  char ***paz
0c80: 52 65 73 75 6c 74 2c 20 20 20 20 20 20 20 20 20  Result,         
0c90: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
0ca0: 73 75 6c 74 20 74 61 62 6c 65 20 68 65 72 65 20  sult table here 
0cb0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 77 2c  */.  int *pnRow,
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
0ce0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0cf0: 74 68 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  the result here 
0d00: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 75  */.  int *pnColu
0d10: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mn,             
0d20: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
0d30: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
0d40: 6f 66 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  of result here *
0d50: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
0d60: 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
0d70: 2f 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 6d  /* Write error m
0d80: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
0d90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
0da0: 61 62 52 65 73 75 6c 74 20 72 65 73 3b 0a 20 20  abResult res;.  
0db0: 69 66 28 20 70 61 7a 52 65 73 75 6c 74 3d 3d 30  if( pazResult==0
0dc0: 20 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ){ return SQLIT
0dd0: 45 5f 45 52 52 4f 52 3b 20 7d 0a 20 20 2a 70 61  E_ERROR; }.  *pa
0de0: 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69  zResult = 0;.  i
0df0: 66 28 20 70 6e 43 6f 6c 75 6d 6e 20 29 20 2a 70  f( pnColumn ) *p
0e00: 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 69  nColumn = 0;.  i
0e10: 66 28 20 70 6e 52 6f 77 20 29 20 2a 70 6e 52 6f  f( pnRow ) *pnRo
0e20: 77 20 3d 20 30 3b 0a 20 20 72 65 73 2e 6e 52 65  w = 0;.  res.nRe
0e30: 73 75 6c 74 20 3d 20 30 3b 0a 20 20 72 65 73 2e  sult = 0;.  res.
0e40: 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 72 65 73 2e  nRow = 0;.  res.
0e50: 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 72  nColumn = 0;.  r
0e60: 65 73 2e 6e 44 61 74 61 20 3d 20 31 3b 0a 20 20  es.nData = 1;.  
0e70: 72 65 73 2e 6e 41 6c 6c 6f 63 20 3d 20 32 30 3b  res.nAlloc = 20;
0e80: 0a 20 20 72 65 73 2e 72 63 20 3d 20 53 51 4c 49  .  res.rc = SQLI
0e90: 54 45 5f 4f 4b 3b 0a 20 20 72 65 73 2e 61 7a 52  TE_OK;.  res.azR
0ea0: 65 73 75 6c 74 20 3d 20 6d 61 6c 6c 6f 63 28 20  esult = malloc( 
0eb0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 72 65  sizeof(char*)*re
0ec0: 73 2e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66  s.nAlloc );.  if
0ed0: 28 20 72 65 73 2e 61 7a 52 65 73 75 6c 74 3d 3d  ( res.azResult==
0ee0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
0ef0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0f00: 7d 0a 20 20 72 65 73 2e 61 7a 52 65 73 75 6c 74  }.  res.azResult
0f10: 5b 30 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  [0] = 0;.  rc = 
0f20: 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62 2c 20  sqlite_exec(db, 
0f30: 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 67 65 74  zSql, sqlite_get
0f40: 5f 74 61 62 6c 65 5f 63 62 2c 20 26 72 65 73 2c  _table_cb, &res,
0f50: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   pzErrMsg);.  if
0f60: 28 20 72 65 73 2e 61 7a 52 65 73 75 6c 74 20 29  ( res.azResult )
0f70: 7b 0a 20 20 20 20 72 65 73 2e 61 7a 52 65 73 75  {.    res.azResu
0f80: 6c 74 5b 30 5d 20 3d 20 28 63 68 61 72 2a 29 72  lt[0] = (char*)r
0f90: 65 73 2e 6e 44 61 74 61 3b 0a 20 20 7d 0a 20 20  es.nData;.  }.  
0fa0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
0fb0: 42 4f 52 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  BORT ){.    sqli
0fc0: 74 65 5f 66 72 65 65 5f 74 61 62 6c 65 28 26 72  te_free_table(&r
0fd0: 65 73 2e 61 7a 52 65 73 75 6c 74 5b 31 5d 29 3b  es.azResult[1]);
0fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 2e  .    return res.
0ff0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  rc;.  }.  if( rc
1000: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1010: 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 5f 74     sqlite_free_t
1020: 61 62 6c 65 28 26 72 65 73 2e 61 7a 52 65 73 75  able(&res.azResu
1030: 6c 74 5b 31 5d 29 3b 0a 20 20 20 20 72 65 74 75  lt[1]);.    retu
1040: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1050: 20 72 65 73 2e 6e 41 6c 6c 6f 63 3e 72 65 73 2e   res.nAlloc>res.
1060: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 68 61  nData ){.    cha
1070: 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 61  r **azNew;.    a
1080: 7a 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20  zNew = realloc( 
1090: 72 65 73 2e 61 7a 52 65 73 75 6c 74 2c 20 73 69  res.azResult, si
10a0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 72 65 73  zeof(char*)*(res
10b0: 2e 6e 44 61 74 61 2b 31 29 20 29 3b 0a 20 20 20  .nData+1) );.   
10c0: 20 69 66 28 20 72 65 73 2e 61 7a 52 65 73 75 6c   if( res.azResul
10d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
10e0: 6c 69 74 65 5f 66 72 65 65 5f 74 61 62 6c 65 28  lite_free_table(
10f0: 26 72 65 73 2e 61 7a 52 65 73 75 6c 74 5b 31 5d  &res.azResult[1]
1100: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1110: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1120: 20 20 7d 0a 20 20 20 20 72 65 73 2e 61 7a 52 65    }.    res.azRe
1130: 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20  sult = azNew;.  
1140: 7d 0a 20 20 2a 70 61 7a 52 65 73 75 6c 74 20 3d  }.  *pazResult =
1150: 20 26 72 65 73 2e 61 7a 52 65 73 75 6c 74 5b 31   &res.azResult[1
1160: 5d 3b 0a 20 20 69 66 28 20 70 6e 43 6f 6c 75 6d  ];.  if( pnColum
1170: 6e 20 29 20 2a 70 6e 43 6f 6c 75 6d 6e 20 3d 20  n ) *pnColumn = 
1180: 72 65 73 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  res.nColumn;.  i
1190: 66 28 20 70 6e 52 6f 77 20 29 20 2a 70 6e 52 6f  f( pnRow ) *pnRo
11a0: 77 20 3d 20 72 65 73 2e 6e 52 6f 77 3b 0a 20 20  w = res.nRow;.  
11b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11d0: 20 66 72 65 65 73 20 74 68 65 20 73 70 61 63 65   frees the space
11e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 67 65 74 5f   the sqlite_get_
11f0: 74 61 62 6c 65 28 29 20 6d 61 6c 6c 6f 63 65 64  table() malloced
1200: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1210: 5f 66 72 65 65 5f 74 61 62 6c 65 28 0a 20 20 63  _free_table(.  c
1220: 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 20 20  har **azResult  
1230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1240: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 66 72  sult returned fr
1250: 6f 6d 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 67  om from sqlite_g
1260: 65 74 5f 74 61 62 6c 65 28 29 20 2a 2f 0a 29 7b  et_table() */.){
1270: 0a 20 20 69 66 28 20 61 7a 52 65 73 75 6c 74 20  .  if( azResult 
1280: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
1290: 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 2d 2d 3b  .    azResult--;
12a0: 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 61 7a  .    n = (int)az
12b0: 52 65 73 75 6c 74 5b 30 5d 3b 0a 20 20 20 20 66  Result[0];.    f
12c0: 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=1; i<n; i++
12d0: 29 7b 20 69 66 28 20 61 7a 52 65 73 75 6c 74 5b  ){ if( azResult[
12e0: 69 5d 20 29 20 66 72 65 65 28 61 7a 52 65 73 75  i] ) free(azResu
12f0: 6c 74 5b 69 5d 29 3b 20 7d 0a 20 20 20 20 66 72  lt[i]); }.    fr
1300: 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20  ee(azResult);.  
1310: 7d 0a 7d 0a                                      }.}.