/ Hex Artifact Content
Login

Artifact 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 4f 63 74 6f 62  /*.** 2017 Octob
0010: 65 72 20 31 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 11.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u 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 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 6d 6f 64 75 6c 65 20 65 78 70 6f 72 74 73 20 61  module exports a
0190: 20 73 69 6e 67 6c 65 20 43 20 66 75 6e 63 74 69   single C functi
01a0: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  on:.**.**   int 
01b0: 73 71 6c 69 74 65 33 5f 63 68 65 63 6b 5f 66 72  sqlite3_check_fr
01c0: 65 65 6c 69 73 74 28 73 71 6c 69 74 65 33 20 2a  eelist(sqlite3 *
01d0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
01e0: 7a 44 62 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zDb);.**.** This
01f0: 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
0200: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
0210: 6e 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 28  n database zDb (
0220: 6f 6e 65 20 6f 66 20 22 6d 61 69 6e 22 2c 20 0a  one of "main", .
0230: 2a 2a 20 22 74 65 6d 70 22 2c 20 65 74 63 2e 29  ** "temp", etc.)
0240: 20 61 6e 64 20 72 65 70 6f 72 74 73 20 61 6e 79   and reports any
0250: 20 65 72 72 6f 72 73 20 62 79 20 69 6e 76 6f 6b   errors by invok
0260: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
0270: 6c 6f 67 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  log().** functio
0280: 6e 2e 20 49 74 20 72 65 74 75 72 6e 73 20 53 51  n. It returns SQ
0290: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
02a0: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
02b0: 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
02c0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20  e otherwise. It 
02d0: 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  is not an error 
02e0: 69 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  if the free-list
02f0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 62 75   is corrupted bu
0300: 74 0a 2a 2a 20 6e 6f 20 49 4f 20 6f 72 20 4f 4f  t.** no IO or OO
0310: 4d 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2e 0a  M errors occur..
0320: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 69  **.** If this fi
0330: 6c 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61  le is compiled a
0340: 6e 64 20 6c 6f 61 64 65 64 20 61 73 20 61 6e 20  nd loaded as an 
0350: 53 51 4c 69 74 65 20 6c 6f 61 64 61 62 6c 65 20  SQLite loadable 
0360: 65 78 74 65 6e 73 69 6f 6e 2c 0a 2a 2a 20 69 74  extension,.** it
0370: 20 61 64 64 73 20 61 6e 20 53 51 4c 20 66 75 6e   adds an SQL fun
0380: 63 74 69 6f 6e 20 22 63 68 65 63 6b 66 72 65 65  ction "checkfree
0390: 6c 69 73 74 22 20 74 6f 20 74 68 65 20 64 61 74  list" to the dat
03a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2c 20 74 6f  abase handle, to
03b0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  .** be invoked a
03c0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
03d0: 20 20 20 53 45 4c 45 43 54 20 63 68 65 63 6b 66     SELECT checkf
03e0: 72 65 65 6c 69 73 74 28 3c 64 61 74 61 62 61 73  reelist(<databas
03f0: 65 2d 6e 61 6d 65 3e 29 3b 0a 2a 2a 0a 2a 2a 20  e-name>);.**.** 
0400: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
0410: 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20  rforms the same 
0420: 63 68 65 63 6b 73 20 61 73 20 73 71 6c 69 74 65  checks as sqlite
0430: 33 5f 63 68 65 63 6b 5f 66 72 65 65 6c 69 73 74  3_check_freelist
0440: 28 29 2c 0a 2a 2a 20 65 78 63 65 70 74 20 74 68  (),.** except th
0450: 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 61 6c  at it returns al
0460: 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
0470: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 74 65 78   as a single tex
0480: 74 20 76 61 6c 75 65 2c 0a 2a 2a 20 73 65 70 61  t value,.** sepa
0490: 72 61 74 65 64 20 62 79 20 6e 65 77 6c 69 6e 65  rated by newline
04a0: 20 63 68 61 72 61 63 74 65 72 73 2e 20 49 66 20   characters. If 
04b0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
04c0: 6e 6f 74 20 63 6f 72 72 75 70 74 65 64 0a 2a 2a  not corrupted.**
04d0: 20 69 6e 20 61 6e 79 20 77 61 79 2c 20 61 6e 20   in any way, an 
04e0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
04f0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
0500: 54 6f 20 63 6f 6d 70 69 6c 65 20 74 68 69 73 20  To compile this 
0510: 6d 6f 64 75 6c 65 20 66 6f 72 20 75 73 65 20 61  module for use a
0520: 73 20 61 6e 20 53 51 4c 69 74 65 20 6c 6f 61 64  s an SQLite load
0530: 61 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 3a 0a  able extension:.
0540: 2a 2a 0a 2a 2a 20 20 20 67 63 63 20 2d 4f 73 20  **.**   gcc -Os 
0550: 2d 66 50 49 43 20 2d 73 68 61 72 65 64 20 63 68  -fPIC -shared ch
0560: 65 63 6b 66 72 65 65 6c 69 73 74 2e 63 20 2d 6f  eckfreelist.c -o
0570: 20 63 68 65 63 6b 66 72 65 65 6c 69 73 74 2e 73   checkfreelist.s
0580: 6f 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  o.*/..#include "
0590: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51  sqlite3ext.h".SQ
05a0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
05b0: 4e 49 54 31 0a 0a 23 69 66 6e 64 65 66 20 53 51  NIT1..#ifndef SQ
05c0: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
05d0: 4e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  N.# include <str
05e0: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
05f0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 20 69 6e 63   <stdio.h>.# inc
0600: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0610: 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  # include <asser
0620: 74 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 41 4c  t.h>.# define AL
0630: 57 41 59 53 28 58 29 20 20 31 0a 23 20 64 65 66  WAYS(X)  1.# def
0640: 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20 30  ine NEVER(X)   0
0650: 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 67  .  typedef unsig
0660: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 20 20 74  ned char u8;.  t
0670: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0680: 73 68 6f 72 74 20 75 31 36 3b 0a 20 20 74 79 70  short u16;.  typ
0690: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 69 6e  edef unsigned in
06a0: 74 20 75 33 32 3b 0a 23 64 65 66 69 6e 65 20 67  t u32;.#define g
06b0: 65 74 34 62 79 74 65 28 78 29 20 28 20 20 20 20  et4byte(x) (    
06c0: 20 20 20 20 5c 0a 20 20 20 20 28 28 75 33 32 29      \.    ((u32)
06d0: 28 28 78 29 5b 30 5d 29 3c 3c 32 34 29 20 2b 20  ((x)[0])<<24) + 
06e0: 20 20 20 5c 0a 20 20 20 20 28 28 75 33 32 29 28     \.    ((u32)(
06f0: 28 78 29 5b 31 5d 29 3c 3c 31 36 29 20 2b 20 20  (x)[1])<<16) +  
0700: 20 20 5c 0a 20 20 20 20 28 28 75 33 32 29 28 28    \.    ((u32)((
0710: 78 29 5b 32 5d 29 3c 3c 38 29 20 2b 20 20 20 20  x)[2])<<8) +    
0720: 20 5c 0a 20 20 20 20 28 28 75 33 32 29 28 28 78   \.    ((u32)((x
0730: 29 5b 33 5d 29 29 20 20 20 20 20 20 20 20 20 20  )[3]))          
0740: 5c 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  \.).#endif../*.*
0750: 2a 20 45 78 65 63 75 74 65 20 61 20 73 69 6e 67  * Execute a sing
0760: 6c 65 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d  le PRAGMA statem
0770: 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ent and return t
0780: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
0790: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 76 69 61   returned.** via
07a0: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
07b0: 72 20 28 2a 70 6e 4f 75 74 29 2e 0a 2a 2a 0a 2a  r (*pnOut)..**.*
07c0: 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
07d0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
07e0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
07f0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70 72 69   should be a pri
0800: 6e 74 66 2d 73 74 79 6c 65 0a 2a 2a 20 66 6f 72  ntf-style.** for
0810: 6d 61 74 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  mat string conta
0820: 69 6e 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22  ining a single "
0830: 25 73 22 20 77 68 69 63 68 20 77 69 6c 6c 20 62  %s" which will b
0840: 65 20 72 65 70 6c 61 63 65 20 62 79 20 74 68 65  e replace by the
0850: 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
0860: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
0870: 72 67 75 6d 65 6e 74 2e 20 65 2e 67 2e 0a 2a 2a  rgument. e.g..**
0880: 0a 2a 2a 20 20 20 73 71 6c 47 65 74 49 6e 74 65  .**   sqlGetInte
0890: 67 65 72 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20  ger(db, "main", 
08a0: 22 50 52 41 47 4d 41 20 25 73 2e 70 61 67 65 5f  "PRAGMA %s.page_
08b0: 63 6f 75 6e 74 22 2c 20 70 6e 4f 75 74 29 0a 2a  count", pnOut).*
08c0: 2a 0a 2a 2a 20 65 78 65 63 75 74 65 73 20 22 50  *.** executes "P
08d0: 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f  RAGMA main.page_
08e0: 63 6f 75 6e 74 22 20 61 6e 64 20 73 74 6f 72 65  count" and store
08f0: 73 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  s the results in
0900: 20 28 2a 70 6e 4f 75 74 29 2e 0a 2a 2f 0a 73 74   (*pnOut)..*/.st
0910: 61 74 69 63 20 69 6e 74 20 73 71 6c 47 65 74 49  atic int sqlGetI
0920: 6e 74 65 67 65 72 28 0a 20 20 73 71 6c 69 74 65  nteger(.  sqlite
0930: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
0940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
0950: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
0960: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
0970: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
0980: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
0990: 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
09a0: 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 63 6f  p" etc.) */.  co
09b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
09d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66   SQL statement f
09e0: 6f 72 6d 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a  ormat */.  u32 *
09f0: 70 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  pnOut           
0a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
0a10: 54 3a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65  T: Integer value
0a20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c   */.){.  int rc,
0a30: 20 72 63 32 3b 0a 20 20 63 68 61 72 20 2a 7a 53   rc2;.  char *zS
0a40: 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ql;.  sqlite3_st
0a50: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
0a60: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 0a 20   int bOk = 0;.. 
0a70: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
0a80: 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 7a 44  mprintf(zFmt, zD
0a90: 62 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  b);.  if( zSql==
0aa0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
0ab0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
0ac0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
0ad0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
0ae0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
0af0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
0b00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
0b10: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
0b20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
0b30: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
0b40: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
0b50: 7b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 28  {.    *pnOut = (
0b60: 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  u32)sqlite3_colu
0b70: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
0b80: 3b 0a 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20  ;.    bOk = 1;. 
0b90: 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69   }..  rc2 = sqli
0ba0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
0bb0: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  mt);.  if( rc==S
0bc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
0bd0: 72 63 32 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  rc2;.  if( rc==S
0be0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
0bf0: 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
0c00: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
0c10: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   rc;.}../*.** Ar
0c20: 67 75 6d 65 6e 74 20 7a 46 6d 74 20 6d 75 73 74  gument zFmt must
0c30: 20 62 65 20 61 20 70 72 69 6e 74 66 2d 73 74 79   be a printf-sty
0c40: 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  le format string
0c50: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 0a 2a 2a   and must be .**
0c60: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 69 74 73   followed by its
0c70: 20 72 65 71 75 69 72 65 64 20 61 72 67 75 6d 65   required argume
0c80: 6e 74 73 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  nts. If argument
0c90: 20 70 7a 4f 75 74 20 69 73 20 4e 55 4c 4c 2c 20   pzOut is NULL, 
0ca0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
0cb0: 75 6c 74 73 20 6f 66 20 70 72 69 6e 74 66 28 29  ults of printf()
0cc0: 69 6e 67 20 74 68 65 20 66 6f 72 6d 61 74 20 73  ing the format s
0cd0: 74 72 69 6e 67 20 61 72 65 20 70 61 73 73 65 64  tring are passed
0ce0: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c   to.** sqlite3_l
0cf0: 6f 67 28 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  og(). Otherwise,
0d00: 20 74 68 65 79 20 61 72 65 20 61 70 70 65 6e 64   they are append
0d10: 65 64 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  ed to the string
0d20: 0a 2a 2a 20 61 74 20 28 2a 70 7a 4f 75 74 29 2e  .** at (*pzOut).
0d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
0d40: 68 65 63 6b 46 72 65 65 6c 69 73 74 45 72 72 6f  heckFreelistErro
0d50: 72 28 63 68 61 72 20 2a 2a 70 7a 4f 75 74 2c 20  r(char **pzOut, 
0d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
0d70: 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
0d80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
0d90: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
0da0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a 20    va_list ap;.. 
0db0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
0dc0: 6d 74 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  mt);.  zErr = sq
0dd0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
0de0: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
0df0: 7a 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zErr==0 ){.    r
0e00: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
0e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
0e20: 66 28 20 70 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( pzOut ){.    
0e30: 20 20 2a 70 7a 4f 75 74 20 3d 20 73 71 6c 69 74    *pzOut = sqlit
0e40: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 7a  e3_mprintf("%s%z
0e50: 25 73 22 2c 20 2a 70 7a 4f 75 74 3f 22 5c 6e 22  %s", *pzOut?"\n"
0e60: 3a 22 22 2c 20 2a 70 7a 4f 75 74 2c 20 7a 45 72  :"", *pzOut, zEr
0e70: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  r);.      if( *p
0e80: 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  zOut==0 ) rc = S
0e90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
0eb0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
0ec0: 5f 45 52 52 4f 52 2c 20 22 63 68 65 63 6b 66 72  _ERROR, "checkfr
0ed0: 65 65 6c 69 73 74 3a 20 25 73 22 2c 20 7a 45 72  eelist: %s", zEr
0ee0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
0ef0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
0f00: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
0f10: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
0f20: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .}..static int c
0f30: 68 65 63 6b 46 72 65 65 6c 69 73 74 28 0a 20 20  heckFreelist(.  
0f40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
0f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
0f60: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74 0a  .  char **pzOut.
0f70: 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 71 75 65  ){.  /* This que
0f80: 72 79 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72  ry returns one r
0f90: 6f 77 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ow for each page
0fa0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
0fb0: 74 2e 20 45 61 63 68 20 72 6f 77 20 68 61 73 0a  t. Each row has.
0fc0: 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d 6e 73    ** two columns
0fd0: 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62   - the page numb
0fe0: 65 72 20 61 6e 64 20 70 61 67 65 20 63 6f 6e 74  er and page cont
0ff0: 65 6e 74 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ent.  */.  const
1000: 20 63 68 61 72 20 2a 7a 54 72 75 6e 6b 20 3d 20   char *zTrunk = 
1010: 0a 20 20 20 20 22 57 49 54 48 20 66 72 65 65 6c  .    "WITH freel
1020: 69 73 74 5f 74 72 75 6e 6b 28 69 2c 20 64 2c 20  ist_trunk(i, d, 
1030: 6e 29 20 41 53 20 28 22 0a 20 20 20 20 20 20 22  n) AS (".      "
1040: 53 45 4c 45 43 54 20 31 2c 20 4e 55 4c 4c 2c 20  SELECT 1, NULL, 
1050: 73 71 6c 69 74 65 5f 72 65 61 64 69 6e 74 33 32  sqlite_readint32
1060: 28 64 61 74 61 2c 20 33 32 29 20 22 0a 20 20 20  (data, 32) ".   
1070: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
1080: 64 62 70 61 67 65 28 3a 31 29 20 57 48 45 52 45  dbpage(:1) WHERE
1090: 20 70 67 6e 6f 3d 31 20 22 0a 20 20 20 20 20 20   pgno=1 ".      
10a0: 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
10b0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 2c 20       "SELECT n, 
10c0: 64 61 74 61 2c 20 73 71 6c 69 74 65 5f 72 65 61  data, sqlite_rea
10d0: 64 69 6e 74 33 32 28 64 61 74 61 29 20 22 0a 20  dint32(data) ". 
10e0: 20 20 20 20 20 22 46 52 4f 4d 20 66 72 65 65 6c       "FROM freel
10f0: 69 73 74 5f 74 72 75 6e 6b 2c 20 73 71 6c 69 74  ist_trunk, sqlit
1100: 65 5f 64 62 70 61 67 65 28 3a 31 29 20 57 48 45  e_dbpage(:1) WHE
1110: 52 45 20 70 67 6e 6f 3d 6e 20 22 0a 20 20 20 20  RE pgno=n ".    
1120: 22 29 22 0a 20 20 20 20 22 53 45 4c 45 43 54 20  ")".    "SELECT 
1130: 69 2c 20 64 20 46 52 4f 4d 20 66 72 65 65 6c 69  i, d FROM freeli
1140: 73 74 5f 74 72 75 6e 6b 20 57 48 45 52 45 20 69  st_trunk WHERE i
1150: 21 3d 31 3b 22 3b 0a 0a 20 20 69 6e 74 20 72 63  !=1;";..  int rc
1160: 2c 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20  , rc2;          
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1180: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
1190: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 72 75  lite3_stmt *pTru
11a0: 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nk = 0;       /*
11b0: 20 43 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20   Compilation of 
11c0: 7a 54 72 75 6e 6b 20 2a 2f 0a 20 20 75 33 32 20  zTrunk */.  u32 
11d0: 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11f0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1200: 6e 20 64 62 20 2a 2f 0a 20 20 75 33 32 20 6e 45  n db */.  u32 nE
1210: 78 70 65 63 74 65 64 20 3d 20 30 3b 20 20 20 20  xpected = 0;    
1220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
1230: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
1240: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
1250: 75 33 32 20 6e 46 72 65 65 20 3d 20 30 3b 20 20  u32 nFree = 0;  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1280: 65 73 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20  es on free list 
1290: 2a 2f 0a 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30  */..  if( zDb==0
12a0: 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b   ) zDb = "main";
12b0: 0a 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ..  if( (rc = sq
12c0: 6c 47 65 74 49 6e 74 65 67 65 72 28 64 62 2c 20  lGetInteger(db, 
12d0: 7a 44 62 2c 20 22 50 52 41 47 4d 41 20 25 73 2e  zDb, "PRAGMA %s.
12e0: 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 26 6e 50  page_count", &nP
12f0: 61 67 65 29 29 0a 20 20 20 7c 7c 20 28 72 63 20  age)).   || (rc 
1300: 3d 20 73 71 6c 47 65 74 49 6e 74 65 67 65 72 28  = sqlGetInteger(
1310: 64 62 2c 20 7a 44 62 2c 20 22 50 52 41 47 4d 41  db, zDb, "PRAGMA
1320: 20 25 73 2e 66 72 65 65 6c 69 73 74 5f 63 6f 75   %s.freelist_cou
1330: 6e 74 22 2c 20 26 6e 45 78 70 65 63 74 65 64 29  nt", &nExpected)
1340: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
1350: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
1360: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1370: 65 5f 76 32 28 64 62 2c 20 7a 54 72 75 6e 6b 2c  e_v2(db, zTrunk,
1380: 20 2d 31 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29   -1, &pTrunk, 0)
1390: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
13b0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
13c0: 64 5f 74 65 78 74 28 70 54 72 75 6e 6b 2c 20 31  d_text(pTrunk, 1
13d0: 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54  , zDb, -1, SQLIT
13e0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 77 68 69  E_STATIC);.  whi
13f0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1400: 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
1410: 70 28 70 54 72 75 6e 6b 29 3d 3d 53 51 4c 49 54  p(pTrunk)==SQLIT
1420: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 75 33 32  E_ROW ){.    u32
1430: 20 69 3b 0a 20 20 20 20 75 33 32 20 69 54 72 75   i;.    u32 iTru
1440: 6e 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65  nk = (u32)sqlite
1450: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 54 72  3_column_int(pTr
1460: 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  unk, 0);.    con
1470: 73 74 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  st u8 *aData = (
1480: 63 6f 6e 73 74 20 75 38 2a 29 73 71 6c 69 74 65  const u8*)sqlite
1490: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 54  3_column_blob(pT
14a0: 72 75 6e 6b 2c 20 31 29 3b 0a 20 20 20 20 75 33  runk, 1);.    u3
14b0: 32 20 6e 44 61 74 61 20 3d 20 28 75 33 32 29 73  2 nData = (u32)s
14c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
14d0: 74 65 73 28 70 54 72 75 6e 6b 2c 20 31 29 3b 0a  tes(pTrunk, 1);.
14e0: 20 20 20 20 75 33 32 20 69 4e 65 78 74 20 3d 20      u32 iNext = 
14f0: 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1500: 30 5d 29 3b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0]);.    u32 nLe
1510: 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  af = get4byte(&a
1520: 44 61 74 61 5b 34 5d 29 3b 0a 0a 20 20 20 20 69  Data[4]);..    i
1530: 66 28 20 6e 4c 65 61 66 3e 28 28 6e 44 61 74 61  f( nLeaf>((nData
1540: 2f 34 29 2d 32 2d 36 29 20 29 7b 0a 20 20 20 20  /4)-2-6) ){.    
1550: 20 20 72 63 20 3d 20 63 68 65 63 6b 46 72 65 65    rc = checkFree
1560: 6c 69 73 74 45 72 72 6f 72 28 70 7a 4f 75 74 2c  listError(pzOut,
1570: 20 0a 20 20 20 20 20 20 20 20 20 20 22 6c 65 61   .          "lea
1580: 66 20 63 6f 75 6e 74 20 6f 75 74 20 6f 66 20 72  f count out of r
1590: 61 6e 67 65 20 28 25 64 29 20 6f 6e 20 74 72 75  ange (%d) on tru
15a0: 6e 6b 20 70 61 67 65 20 25 64 22 2c 20 0a 20 20  nk page %d", .  
15b0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 6e 4c 65          (int)nLe
15c0: 61 66 2c 20 28 69 6e 74 29 69 54 72 75 6e 6b 0a  af, (int)iTrunk.
15d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 6e        );.      n
15e0: 4c 65 61 66 20 3d 20 28 6e 44 61 74 61 2f 34 29  Leaf = (nData/4)
15f0: 20 2d 20 32 20 2d 20 36 3b 0a 20 20 20 20 7d 0a   - 2 - 6;.    }.
1600: 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 31 2b  .    nFree += 1+
1610: 6e 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20 69  nLeaf;.    if( i
1620: 4e 65 78 74 3e 6e 50 61 67 65 20 29 7b 0a 20 20  Next>nPage ){.  
1630: 20 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 72      rc = checkFr
1640: 65 65 6c 69 73 74 45 72 72 6f 72 28 70 7a 4f 75  eelistError(pzOu
1650: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  t, .          "t
1660: 72 75 6e 6b 20 70 61 67 65 20 25 64 20 69 73 20  runk page %d is 
1670: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 20 28  out of range", (
1680: 69 6e 74 29 69 4e 65 78 74 0a 20 20 20 20 20 20  int)iNext.      
1690: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
16a0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
16b0: 45 5f 4f 4b 20 26 26 20 69 3c 6e 4c 65 61 66 3b  E_OK && i<nLeaf;
16c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 33 32   i++){.      u32
16d0: 20 69 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   iLeaf = get4byt
16e0: 65 28 26 61 44 61 74 61 5b 38 20 2b 20 34 2a 69  e(&aData[8 + 4*i
16f0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c  ]);.      if( iL
1700: 65 61 66 3d 3d 30 20 7c 7c 20 69 4c 65 61 66 3e  eaf==0 || iLeaf>
1710: 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
1720: 20 72 63 20 3d 20 63 68 65 63 6b 46 72 65 65 6c   rc = checkFreel
1730: 69 73 74 45 72 72 6f 72 28 70 7a 4f 75 74 2c 0a  istError(pzOut,.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 65 61              "lea
1750: 66 20 70 61 67 65 20 25 64 20 69 73 20 6f 75 74  f page %d is out
1760: 20 6f 66 20 72 61 6e 67 65 20 28 63 68 69 6c 64   of range (child
1770: 20 25 64 20 6f 66 20 74 72 75 6e 6b 20 70 61 67   %d of trunk pag
1780: 65 20 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  e %d)", .       
1790: 20 20 20 20 20 28 69 6e 74 29 69 4c 65 61 66 2c       (int)iLeaf,
17a0: 20 28 69 6e 74 29 69 2c 20 28 69 6e 74 29 69 54   (int)i, (int)iT
17b0: 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 29 3b 0a  runk.        );.
17c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17d0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
17e0: 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72 65 65 21  ITE_OK && nFree!
17f0: 3d 6e 45 78 70 65 63 74 65 64 20 29 7b 0a 20 20  =nExpected ){.  
1800: 20 20 72 63 20 3d 20 63 68 65 63 6b 46 72 65 65    rc = checkFree
1810: 6c 69 73 74 45 72 72 6f 72 28 70 7a 4f 75 74 2c  listError(pzOut,
1820: 0a 20 20 20 20 20 20 20 20 22 66 72 65 65 2d 6c  .        "free-l
1830: 69 73 74 20 63 6f 75 6e 74 20 6d 69 73 6d 61 74  ist count mismat
1840: 63 68 3a 20 61 63 74 75 61 6c 3d 25 64 20 68 65  ch: actual=%d he
1850: 61 64 65 72 3d 25 64 22 2c 20 0a 20 20 20 20 20  ader=%d", .     
1860: 20 20 20 28 69 6e 74 29 6e 46 72 65 65 2c 20 28     (int)nFree, (
1870: 69 6e 74 29 6e 45 78 70 65 63 74 65 64 0a 20 20  int)nExpected.  
1880: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20    );.  }..  rc2 
1890: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
18a0: 7a 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 69 66  ze(pTrunk);.  if
18b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18c0: 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 72 65  ) rc = rc2;.  re
18d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
18e0: 73 71 6c 69 74 65 33 5f 63 68 65 63 6b 5f 66 72  sqlite3_check_fr
18f0: 65 65 6c 69 73 74 28 73 71 6c 69 74 65 33 20 2a  eelist(sqlite3 *
1900: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1910: 7a 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  zDb){.  return c
1920: 68 65 63 6b 46 72 65 65 6c 69 73 74 28 64 62 2c  heckFreelist(db,
1930: 20 7a 44 62 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61   zDb, 0);.}..sta
1940: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 66 72  tic void checkfr
1950: 65 65 6c 69 73 74 5f 66 75 6e 63 74 69 6f 6e 28  eelist_function(
1960: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1970: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
1980: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
1990: 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
19a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19b0: 44 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Db;.  int rc;.  
19c0: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
19d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
19f0: 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
1a00: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
1a10: 3d 3d 31 20 29 3b 0a 20 20 7a 44 62 20 3d 20 28  ==1 );.  zDb = (
1a20: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1a30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1a40: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 72 63 20 3d  pArg[0]);.  rc =
1a50: 20 63 68 65 63 6b 46 72 65 65 6c 69 73 74 28 64   checkFreelist(d
1a60: 62 2c 20 7a 44 62 2c 20 26 7a 4f 75 74 29 3b 0a  b, zDb, &zOut);.
1a70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1a90: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
1aa0: 43 74 78 2c 20 7a 4f 75 74 3f 7a 4f 75 74 3a 22  Ctx, zOut?zOut:"
1ab0: 6f 6b 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ok", -1, SQLITE_
1ac0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
1ad0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1ae0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
1af0: 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
1b00: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
1b10: 65 28 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zOut);.}../*.*
1b20: 2a 20 41 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  * An SQL functio
1b30: 6e 20 69 6e 76 6f 6b 65 64 20 61 73 20 66 6f 6c  n invoked as fol
1b40: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71  lows:.**.**   sq
1b50: 6c 69 74 65 5f 72 65 61 64 69 6e 74 33 32 28 42  lite_readint32(B
1b60: 4c 4f 42 29 20 20 20 20 20 20 20 20 20 20 20 2d  LOB)           -
1b70: 2d 20 44 65 63 6f 64 65 20 33 32 2d 62 69 74 20  - Decode 32-bit 
1b80: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 73 74 61  integer from sta
1b90: 72 74 20 6f 66 20 62 6c 6f 62 0a 2a 2f 0a 73 74  rt of blob.*/.st
1ba0: 61 74 69 63 20 76 6f 69 64 20 72 65 61 64 69 6e  atic void readin
1bb0: 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  t_function(.  sq
1bc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1bd0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Ctx,.  int nArg,
1be0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1bf0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 63 6f   **apArg.){.  co
1c00: 6e 73 74 20 75 38 20 2a 7a 42 6c 6f 62 3b 0a 20  nst u8 *zBlob;. 
1c10: 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 69 6e   int nBlob;.  in
1c20: 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 75 33  t iOff = 0;.  u3
1c30: 32 20 69 52 65 74 20 3d 20 30 3b 0a 0a 20 20 69  2 iRet = 0;..  i
1c40: 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41  f( nArg!=1 && nA
1c50: 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c  rg!=2 ){.    sql
1c60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1c70: 72 28 0a 20 20 20 20 20 20 20 20 70 43 74 78 2c  r(.        pCtx,
1c80: 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
1c90: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1ca0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 5f 72  unction sqlite_r
1cb0: 65 61 64 69 6e 74 33 32 28 29 22 2c 20 2d 31 0a  eadint32()", -1.
1cc0: 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
1cd0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 41 72  n;.  }.  if( nAr
1ce0: 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69 4f 66 66  g==2 ){.    iOff
1cf0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1d00: 5f 69 6e 74 28 61 70 41 72 67 5b 31 5d 29 3b 0a  _int(apArg[1]);.
1d10: 20 20 7d 0a 0a 20 20 7a 42 6c 6f 62 20 3d 20 73    }..  zBlob = s
1d20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1d30: 62 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 6e  b(apArg[0]);.  n
1d40: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
1d50: 61 6c 75 65 5f 62 79 74 65 73 28 61 70 41 72 67  alue_bytes(apArg
1d60: 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20 6e 42 6c  [0]);..  if( nBl
1d70: 6f 62 3e 3d 28 69 4f 66 66 2b 34 29 20 29 7b 0a  ob>=(iOff+4) ){.
1d80: 20 20 20 20 69 52 65 74 20 3d 20 67 65 74 34 62      iRet = get4b
1d90: 79 74 65 28 26 7a 42 6c 6f 62 5b 69 4f 66 66 5d  yte(&zBlob[iOff]
1da0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
1db0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1dc0: 43 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  Ctx, (sqlite3_in
1dd0: 74 36 34 29 69 52 65 74 29 3b 0a 7d 0a 0a 2f 2a  t64)iRet);.}../*
1de0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
1df0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2e 0a   SQL functions..
1e00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66  */.static int cf
1e10: 6c 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  lRegister(sqlite
1e20: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
1e30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e40: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
1e50: 20 20 64 62 2c 20 22 73 71 6c 69 74 65 5f 72 65    db, "sqlite_re
1e60: 61 64 69 6e 74 33 32 22 2c 20 2d 31 2c 20 53 51  adint32", -1, SQ
1e70: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 65  LITE_UTF8, 0, re
1e80: 61 64 69 6e 74 5f 66 75 6e 63 74 69 6f 6e 2c 20  adint_function, 
1e90: 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
1ea0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1eb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1ed0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
1ee0: 20 64 62 2c 20 22 63 68 65 63 6b 66 72 65 65 6c   db, "checkfreel
1ef0: 69 73 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ist", 1, SQLITE_
1f00: 55 54 46 38 2c 20 30 2c 20 63 68 65 63 6b 66 72  UTF8, 0, checkfr
1f10: 65 65 6c 69 73 74 5f 66 75 6e 63 74 69 6f 6e 2c  eelist_function,
1f20: 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 72 65 74   0, 0.  );.  ret
1f30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f40: 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20   Extension load 
1f50: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  function..*/.#if
1f60: 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63  def _WIN32.__dec
1f70: 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
1f80: 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
1f90: 74 65 33 5f 63 68 65 63 6b 66 72 65 65 6c 69 73  te3_checkfreelis
1fa0: 74 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  t_init(.  sqlite
1fb0: 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a  3 *db, .  char *
1fc0: 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f  *pzErrMsg, .  co
1fd0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
1fe0: 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
1ff0: 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
2000: 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
2010: 3b 0a 20 20 72 65 74 75 72 6e 20 63 66 6c 52 65  ;.  return cflRe
2020: 67 69 73 74 65 72 28 64 62 29 3b 0a 7d 0a        gister(db);.}.